(计算机软件与理论专业论文)面向方面编程在单元测试中的研究与应用.pdf_第1页
(计算机软件与理论专业论文)面向方面编程在单元测试中的研究与应用.pdf_第2页
(计算机软件与理论专业论文)面向方面编程在单元测试中的研究与应用.pdf_第3页
(计算机软件与理论专业论文)面向方面编程在单元测试中的研究与应用.pdf_第4页
(计算机软件与理论专业论文)面向方面编程在单元测试中的研究与应用.pdf_第5页
已阅读5页,还剩75页未读 继续免费阅读

(计算机软件与理论专业论文)面向方面编程在单元测试中的研究与应用.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

论文摘要 单元测试是为了发现软什设计的最小单位( 程序模块) 中存在的错误而进行的测试t 作。 作为软件项目中最早介入的测试1 作,单元测试是集成测试和系统测试的基础,单元测试的 成功与否直接关系到软件的质量。在其它领域,单元测试也一样重要并受到关注:测试优先 的开发方法( t e s td r i v e nd e v e l o p m e n t ,简称t d d ) ,要求在写实际的代码之前,先写出单元 测试用例;软件重构( s o f t w a r er e f a c t o r i n g ) 的首要前提就是拥有一个可靠的单元测试环 境。单元测试是当前应用和研究的热点。 面向方面编程( a s p e c t o r i e n t e dp r o g r a m m i n g ,简称a o p ) 是施乐公司帕洛阿尔托研究 中心( x e r o xp a r c ) 在上世纪9 0 年代最先提出的一种编程模型,它使开发人员可以更好地将 本不该彼此纠缠在一起的辅助任务同核心任务分离开来。a o p 的精髓在于关注点的分离,更 准确地说是核心关注点和其它关注点( 也称为核心关注点的横切关注点) 的分离。使用a o p 编程语言可以将每个横切关注点单独描述。在编译或者运行期间,这些横切关注点会被织入 到核心关注点代码中。a o p 技术作为0 0 p 的补充,随着开发工具和环境的成熟,得到了广泛 的关注研究和应用。 本文分别深入研究了面向方面编程技术和单元测试,发现了两者之间的联系。根据对单 元测试本身特征的研究和e r i ke r n s t 提出的判断a o p 中_ 关注点的标准。本文认为:从a o p 的角 度看,单元测试是被测单元的一个横切关注点。 随斤,通过对单元测试中遇到的几个难题的研究,本文先给山传统的解决方法,再给出 使用了a o p 技术的更简单更有效的解决方法。从而不仅说明了使用a o p 技术可以帮助解决单元 测试中的难题,还给出了这些难题的解决方法。这些难题包括被测代码如何与外部依赖服务 隔离的问题,测试代码如何访问被测类中封装的私有变量和函数等等。对于其它问题? 如对 历史_ 遗留代码的测试也给出了基于a o p 技术的解决思路。 在此基础上,本文给出了一个通过基于面向方面编程的可扩展的单元测试框架a t e s t ( a s p e c t o r i e n t e du n i tt e s tf r a m e w o r k 的简称) 。该框架使用了较为成熟的a s p e c t j 语言来 解决单元测试问题。对单元测试中若干难题的解决也被集成刨该框架中。该框架具有一定的 扩展性,对单元测试中特定问题的解决方法可以通过扩展接口加入至该框架中,从而使得该 框架更具实用性。 最后,本文对相关研究_ t 作做了总结,并展望了a o p 技术在单元测试中的前景。 关键词:单元测试,面向方面编程,横切方面,a t e s t a b s t r a c t s o f t w a r eu n tt e s ti st 0f i n db u g si nt h es 矾w a r es m a e s tu n - tu n i tt e s tl st h e 峒r s t t e s t i n gp r o c e s sa n di t l st h eb a s i so fa n ds y s t e ml e v e it e s tu n i t t e s ti sc r i t i c a it os o f t w a r e q u a w u n - tt e s ta i s op l a y sa n m p o r tr o l ei no t h e r 怕s e a r c ha 隐a s :u n tt e s tc a s e sn e e dt 0 b ew 撤mb e f o r 8w 打耵n ga n yf m p l e m e 丌l a t i o nc o d el nt e s td v e nd e 、,e l o p m e m :a nr e j a b e u n i tt e s te n v i r o n m e n ti st h em o 时m p o r t a mp r e m i s et od 0s o 竹w a r e 怕c a p t u n n g a s p e 西0 n e n t e dp r o g r a m m i n 9 p ) j sf l r 吼p r o p o s e db yx e r o xp a r ca san e w p r o g r a m m i n gm o d e | l nt h e9 0 。so ft h ei a s tc e n t u r y a o pe n a b i e sd e v e l o p e r st os e p a r a t e t h ea u x ”i a r yt a s k sf r o mt h em a i nt a s k t h ee s s e n c eo fa o pi st os e p a r a t ed i 竹e r e n t c o n c e m s ,t h e s ec o n m si n c i u d i n gt h ek e yc o n c e ma n dc r o s s c u tc o n c e m s e v e r y c r o s s c u tc o n c e m sc a nb ei m p l e m e m e di n d i v i d u a yb yu s i n gi a n g u a g e s0 fa p o t h e o s e s c r o s s c u t0 0 n c e r n sw i b ew e a v ei n t ot h em a nc o n c e md u n g m p 针日o re x e c u 丽口nt f r n e a sas u p p i e m e n to fo o p 。a o p ,a 1 0 n gw i t hi t 。sd e v e l o p m e n tt 0 0 i sa n de n v i r o m e n t ,i s g e 廿j n gm o r ea n dm o r ep o p u i a t h i sa r t i d et h o r o u g h i ys l u d i e db o t ha ( ) pa n ds o t h v a r eu n tt e s tt e c h n o i o g ya n df o u n d t h er e l a u o n s h i pb e t w e e nt h et w o b yi o o k i n gi n t o _ 【h eu n | tt e s ti t s e 什d e e p i ) ,a n da pp l y i n g e r i ke r n s t ss t a n d a r d t h ea u t h o rd r a wt h eo o n c l u s i o nt h a tu n i t t e s t no n ec r o s s c u tc o n c a m o f t h eu n i t t ot e s t t h e n ,b y 怕s e a r c h i n gs o m ed i f f i c u 憎p r o b i e m se n c o u n t e r e di nu n i tt e s t ,t h ea u t h o r s 0 i v e dt h e s ep r o b l e m su s i n gb o t hc o n v en t i o n a lw a ya n dt h em o r es i m p i ea n de 竹e 酬v e a o p 色w a 弘s o i t l s p r o v e d t h a t a o p i s n o t y f h e o f e | i c a i j y h e j p 妇u 跳t e ! 吐b u | a o p c a na i s os o i v e dm a n yr e a ip r o b i e m s f o re a m p l e ,t h e s ep r o b l e m si n c l u d e ss e p a r a 岫o no f o u t e rs e m c ef r o mu n i tb e j n gt e s t e d ,g e 廿i n gt h ep v a t ec i a s sm e m b e ro ft h et e s t e dc l a s s o t h e rp r o b i e m s 眦ei e g a c yc o d et e s 帅ga 他a i s od i s c u s s e d a na s p e c t 0 n e n t e du n tt e s ”r a m e w o r k l l e da _ r e s ti sp r e s e n t 鲥o nt h ef o u n d a 柚o n o nt h ea b o v er e s e a r c h i n g t h ef r a m e w o r ku s e st h ea s p e c t ji a n g u a g et os o f v eu n i tt e s t p r o b l e m s t h es o l u t i o n st ot h ed 帅c u i 铂e sf o u n d nu n tt e s ti sa i 怕a d yi n t e g r a t e d nt h et e s t f r a m e w o r k f m p l e m e n 廿n gs o m ei n | e r f a c e sc a na j s 0e x 招n d 懒ef r a m e w o 嫩b yu s 抽g h j s w a y ,n e ws 0 i u t l o n sc a nb ea d d e dt 0t h ef r a m e w o r ka n dt h ef r a m e w o n ( w b e c o m em o r e a n dm o r eu s e f u j , s u m m a z eo ft h er e s e a r c h i n gw o r k - sg i v e ni nt h el a s tc h a p t e r a o pt h n o i o g y a p p e di nu n i tl e s ta r e ai nt h ef u t u r ei sa i s od i s c u s s e d k e y w o r d s :u n 矗i e s t ,a s p e c o d e n f e dp r o g r a m m j n g ,c f 0 5 s c u lc o n c e m s ,a f e s i 学位论文独创性声明 本人所呈交的学位论文是我在导师的指导下进行的研究工作 及取得的研究成果。据我所知,除文中已经注明引用的内容外, 本论文不包含其他个人已经发表或撰写过的研究成果。对本文的 研究做出重要贡献的个人和集体,均已在文中作了明确说明并表 示谢意。 作者签名:证蓬幺 日期: 学位论文授权使川声f 朔 本人完全了解华东师范大学有关保留、使用学位论文的规定,学 校有权保留学位论文并向国家主管部门或其指定机构送交论文的电 子版和纸质版。有权将学位论文用于非赢利目的的少量复制并允许论 文进入学校图书馆被查阅。有权将学位论文的内咎编入有关数据库进 行检索。有权将学位论文的标题和摘要汇编出版。保密的学位论文在 解密后适用本规定。 学位论文作者签名:习乙窨彭 帆型、竺一 导师签名:利字 一 日期:枷3 d 华东师范大学硕l 学位论文 1 1 研究背景 第一章引言 上世纪6 0 年代,随着软件开发的规模越来越大,系统越米越复杂,大型的软件开发和 维护过程中出现了一系列严重的问题,典型的案例是i b m 3 6 0 操作系统和世界范围内军事命 令和控制系统( w w m c c s ) 的开发失败。在1 9 6 8 年的国际软件工程会议( i c s e1 9 6 8 ) 上提出 了“软件危机”这一概念,用来描述此类问题。 针对“软件危机”,人们提出种种解决方法,归纳起来有两类:一是深入探讨程序和程序 开发过程的规律,建立严密的理论,以期能用来指导软件开发实践。二是采用工程方法来组 织、管理软件的开发过程:前者推动了形式化方法的深入研究。后者导致“软件工程”的出 现和发展。 形式化方法 形式化方法的基本思想是对系统建立一个数学模型,研究和提供一种基于数学的和形式 语义学的软件规格说明语言,用这种语言严格地描述所开发软件的功能,验证所获得的形式 规格说明,并将它转换成可以执行的代码。形式化方法由来已久,早期的形式验证主要研究 如何使用数学方法,严格证明一个程序的正确性,如1 9 4 7 年j v o nn e u m a l l n 就在 1 中提到程 序正确性证明。a t u r i n g 也在做了这方面的早期工作 2 。“软件危机”的概念提出后,欧 洲的科学家试图使用形式化方法来解决软件危机问题,形式化方法的研究在这一阶段到达 个高潮。 形式化方法虽然取得了一些成就。但发展缓慢。形式化方法虽能在小规模程序中解决部 分问题,但是对于大规模的软件开发,形式化方法难以胜任。 软件工程 1 9 6 8 年秋季,n a t o ( 北约科技委员会) 召集了近5 0 名一流的编程人员、计算机科学家和 t 业界巨头,讨论和制定摆脱“软件危机”的对策。在那次会议上第一次提出了软件工程这 个概念。软件工程是一门研究如何用系统化、规范化、数量化等工程原则和方法去进行软件 的开发和维护的学科。迄今为i r ,软件工程的研究与应用已经取得很大成就,它在软件开发 方法、t 具、管理等方面的应用大大缓解了软件危机造成的被动局面。 在软件工程中,将软件从孕育、诞生、成长、成熟、衰亡的生存过程称为计算机软件生 华东师范大学硕士学位论文 命周期,根据软件基本过程活动的特点划分为六个步骤:即制定计划,需求分析和定义、软件 设计、程序编写、软件测试和运行维护。 软件测试是软件工程的一个重要阶段。也是保证软件质量的重要手段。软件开发过程有 很多不同的模型,所有模型的共同点是:在软件生命过程中的某一个阶段或某几个阶段,必 须不断地进行软件测试。测试是软件开发的重要部分,统计表明:在典型的软件开发项目中。 软件测试工作量往往占软件开发总工作量的4 0 以上,而在软件开发的总成本中用在测试上 的开销要占3 0 到5 0 。 1 1 1 从软件测试到单元测试 1 9 8 3 年,i e 既定义了软件工程的标准术语,软件测试工程( s o f t w a r et e s te n g i n e e r i n g ) 的概念被提出。i e e e 的定义提出了软件测试以检验是否满足需求为目标。软件测试成为一门 t 程学,测试已经不再是一个编码后才进行的活动,而是一个基于软件开发整个生命周期的 质量控制活动。 按照软件测试的规模和测试的顺序,软件测试可以分为单元测试,集成测试和系统测试。 在软件开发过程中,单元测试非常重要。单元测试是最早开始的测试工作,是集成测试 和系统测试的前提和基础。在软件测试过程中,错误发现得越早,修正错误所需要的代价就 会越少,这一点已经成为人们的共识。 单元测试不仅仅用来发现代码的错误,更重要的是单元测试保证了程序代码的质量。如 果需要对代码进行重构,必须有单元测试支持,没有单元测试辅助的重构过程是非常危险的。 在x p 开发方法中,单元测试也是最重要的一条原则。对单元测试重要性的关注甚至直接导 致了测试优先的开发方法学( t e s t d r i v e n d e v e l o p m e n t ,简称t d d ) 。在t d d 开发方法中, 要求在撰写实际的代码前先书写单元测试用例,其作用类似于形式化开发中书写前置和后置 谓词,不过书写单元测试用例更直接,更通用,也更容易理解。 本文研究对象正是软件单元测试,不同于一般的单元测试研究,本文把面向方面编程技 术和单元测试结合起来,把面向方面编程技术应用到单元测试中。 1 1 2 面向方面编程 c r a i gl a r m a n 认为设计的基本原则在于分离关注点,即把不同的关注放在不同的地方。 这里的关注点可以理解为满足用户需求、有关软件实现的多种事项。简单的说一个关注点就 2 华东师范大学硕士学位论文 是软件要解决的一个方面的问题。关注点可以被分为两类:一类是核心关注点,即软件要实现 的主要功能;另一类就是横切关注点,如密码验证、日志记录等。横切关注点通常横跨多个 业务逻辑模块,与核心关注点交织在一起,正是这种混乱阻碍了软件的难护和复用。 面向方面编程( a s p e c to r i e n t e dp r o g r a j n m i n g ,简称a o p ) 被设计用来解决系统中的横切 关注点。面向方面编程概念是1 9 9 7 年由施乐实验室p a r c 研究中心g r e g o r 等人在欧洲面向对象 程序设计大会上最初提出的,目的是让程序员能够在自己的代码中将“横切结构”模块化。 使用面向方面编程方法,无论在需求设计阶段还是代码实现阶段,都可以将横切关注点 模块化实现,单独处理。面向方面编程技术实现包括三个部分:组件语言、方面语言和编织器, 其中组件语言负责系统的核心关注点,方面语言负责系统的横切关注点,而两种语言的并行 与合作由编织器无缝编织实现,这样程序员可以在两个维度上对软件进行设计和实现,解决 了横切关注点的模块化问题。 自1 9 9 7 年首次提出面向方面编程概念,全球已开展大量有关研究与开发工作并自2 0 0 2 年起,每年组织召开a o s d ( 面向方匝软件开发) 国际学术会议。其它的研究机构或组织包 括e c 0 0 p a a o s w o r k s h o p 以及i c s e 的a o p 、o r k s h o p 等等。除了施乐公司外,软件行业巨 头微软、l b m 、西、j 子以及东芝等公司都积极参与面向方面编程的研究,欧美和日本的不少 大学也在进行这方面的研究。国内对面向方面编程的研究不多,其中【4 7 ,4 8 ,4 9 】介绍了相关 概念j 【3 】把向方面技术应用到a b c 软件开发方法中,师兄徐国庆在a p s e c2 0 0 4 上提出的基 于面向方面编程的自动化单元测试用例生成框架j a 0 1 r r 【4 】是关于如何在单元测试中应用面 向方面编程的较早研究成果,笔者也参与了l a o u r 项目开发。本文主要研究面向方面编程 在传统程序单元测试中的应用。 1 2 在单元测试中应用a o p 技术 对程序进行单元测试时,如果可以对源程序稍加改动( 比如修改类的方法访问符,在进 行性能测试的方法前后加上系统时间调用函数并计算出运行时间等等) 就可以给单元测试带 米方便。但是单元测试人员一般没有权利修改代码,很多情况下测试人员甚至得不到源代码; 并且即使这样做,就需要至少维护两个版本的源代码,给源代码的维护和管理丁作带来负担。 相比于其它类型的软件测试,单元测试最接近于代码,一般需要用代码实现,并且对系 统的实际运行逻辑关注较小,和主关注点( 这里认为是被测单元) 是一种横切的关系,容易从其 中分离面向方面技术被用来处理软件中的横切关系。使用面向方面编程技术可以在不修改 3 华东师范大学硕士学位论文 程序源代码的情况下静态地修改程序的语义和行为,也可以动态的修改程序的流程。不少研 究发现,在单元测试领域应用a o p 技术可以解决单元测试中的不少难题,如【4 2 】以e c p s e 插 件形式实现了一个基于a o p 的调试系统, 4 3 】把a o p 技术应用到时序逻辑的测试, 4 4 】介绍 了如何是使用a o p 技术对程序进行性能测试,【4 5 】研究了如何使_ f = i j a o p 对分布式系统进行测 试。 1 2 1 单元测试是一个横切关注点 经过简单分析就可以发现,单元测试明显具有以下特点: 单元测试关注的是被测程序的代码单元,相比于集成测试和系统测试,单元测试对 被测程序的实际应用功能关注较少。 单元测试一般用和被测代码一样的语言编程实现。 被测程序的逻辑不会因为单元测试的有无而改变,单元测试对被测程序来说,相当 于多了一些附加的功能而已。 从单元测试的以上几个特点可以看出:单元测试和其它面向方面编程中的典型方面如日 志记录安全检查等具有定的相似性。e 放e m s t 在【8 0 】中结合代数系统中的同态原理提出 了如何判断a o p 中横切方面的形式化标准,本文在第四章详细讨论了应用该定理验证单元 测试可以作为被测程序的一个横切方面的观点。 1 2 2 应用a o p 技术解决单元测试中的问题 面向方面编程技术精于描述系统的横切方面,而单元测试可以看作系统的一个横切方 面。在单元测试中应用面向方面技术可以解决不少单元测试中的难题,这些难题使用传统工 具及单元测试框架很难实现。 面向方面编程技术包括组件语言,方面语言和编织器三部分。对应于软件单元测试应用, 被测系统代码是由一般组件语言实现的,单元测试可以使用方面语言描述,最后通过编织器把 两者结合起来,并形成最终的系统。使用这种方法进行单元测试的好处在于: 首先,如果能对被测程序进行一定的修改,无疑能给单元测试带来方便。例如需要 对一个私有方法进行测试,或者测试程序更改了对象的个私有变量,你需要检查 整个更改的私有变量;以上情况中,直接更改类成员描述符无疑会给单元测试带来 方便。 单元测试一旦使j = j 方面语言描述,就不只可以调用组件语言编写的程序,还可以对 4 华东师范大学硕士学位论文 调用程序进行静态或者动态地修改;而传统的单元测试使用的编程代码是和被测程 序使用的语言是一样的,单元测试只可以调用被测程序,而无法对调用程序进行更 改。 使用方面语言描述的单元测试不是在源代码级对被测程序进行修改的( 一般在中间 代码级对源程序进行修改) ;这样使用方面语言描述单元测试可以达到直接修改被 测源程序代码的效果而无需付出维护多种源代码版本的代价,也可以在没有源程序 代码的情况下对中间代码直接修改。 本文研究了如何使_ h ja s p e c 方面语言对j a v a 语言编写的程序进行单元测试,并使用这 种方法有效地解决了单元测试中的若干传统方法难以解决的问题,包括单元测试中面向对象 封装特性和继承多态特性引起的问题,模拟对象使用问题等。同时也简单讨论了如何使用面 向方面技术的强大功能如何解决单元测试中的测试用例生成,时序和性能测试和对遗留代码 测试等问题。 1 2 3 基于a o p 技术的单元测试框架 在使用面向方面编程技术成功解决了单元测试中的若干问题后,笔者认为有必要提供一 个单独的单元测试框架,这个单元测试框架和传统的j i t 单元测试框架以及其它的单元测 试框架或者工具不同之处在于它集成了面向方面技术。通过继承框架提供的特殊方面( 方面 是a o p 中的术语,类似于o o 中的类概念,详见第二章) ,可以把面向方面编程的强大功能 应用到单元测试中。 这个独特的单元测试框架是本文第四章详细介绍的基于面向方面编程的单元测试框架 ( a o p _ b a s e du n j tt e s t 矗a m e w o r k ,简称 t c s t ) 。a t e s t 框架的核心思想是每个常规的t c s t c a s e 实例对象都最多可以有一个t c s 认s p e c t 方面对象和它对应;这个方面对象也只会横切这个 t e s i c a s e 实例对象,对系统中的其它对象没有影响。通过这种需要使用a o p 技术的测试用 例和横切方面对象的一一对应关系,可以安全方便地在单元测试中使用a o p 技术。另外, a t e s t 中的测试结果的记录以及测试过程中异常的捕捉都是通过a o p 技术实现的,本文的第 五章详细讨论了a = k s t 单元测试框架。 1 3 本文的主要贡献 深入研究了面向方面技术和单元测试技术,并提出了单元测试是一个横切关注点的 观点。 5 华东师范大学硕士学位论文 使用面向方面技术有效地解决了单元测试中的若干难题,这些难题用传统的面向对 象的编程方法难以解决。 设计实现了一个基于面向方面编程技术的单元测试框架,该框架结合使用了面向方 面的编程语言a s p e c t j 和j a v a 语言,使用该框架使用面向方面技术可以对j a v a 语言开 发的程序进行单元测试。该框架虽不支持其它语言,但其使用面向方面技术编程解决传 统语言单元测试的思路具有一定的借鉴意义。 1 4 本文的组织结构 本文的具体组织结构安排如下: 第二章详细介绍了面向方面编程技术。 夺 第三章对软件单元测试进行了讨论。 夺第四章首先说明了在面向方面编程中,可以把单元测试作为一个横切点来对待:随 后使用面向方面技术解决了单元测试中的若干难题,包括对类的私有成员的访问问题和 模拟对象使用问题;最后讨论了面向方面技术在单元测试中其它方面的应用。 夺第五章详细讨论了基于面向方面编程的单元测试框架( a r e s t ) ,对a r e s t 的框架结 构以及如何使用 t e s t 进行单元测试进行了详细讨论。 夺 第六章总结了本文的内容,并对面向方面技术在单元测试中的应用进行了展望。 6 华东师范大学硕士学位论文 第二章面向方面编程 2 1 面向方面编程概述 随着软件系统规模的日益庞大和应用领域大不断扩展,软件变得越来越复杂。如何控制 这种日益增长的复杂性一直是软件研究人员关注的重点,控制和减少软件复杂度的过程也促 进了软件技术本身大发展。 d i j k s t r a 认为控制复杂性的技巧在于分解和规则 7 0 。在设计一个复杂的软件系统时, 将其“分而治之”,这是一种基本方法。上世纪7 0 年代,由于软件复杂性的增长导致软件 的维护和扩展变得非常困难,这方面的需求促进了结构化程序设计的诞生,试图从程序良好 的静态结构来控制动态的复杂性。随着软件规模的进一步扩大。软件开发人员感觉经常在重 复劳动,软件复用这一需求越来越紧迫,模块化的概念由此诞生。随后,为了在语言层次上 更直接支持复用,人们提出了继承的思想,也就是面向对象程序设计的核心思想之一,它使 程序员以更接近现实问题的方式去构造软件。 面向对象程序设计已经发展成为当今软件开发主流方法。在面向对象世界里,软件被划 分为多个离散的类,每个类担任一个角色,以此来实现软件系统角色的划分。但是类与类之 间的关系通常是错综复杂的,面向对象只通过继承表达了纵向的联系,而类与类之间横向的 联系是被忽略的,结果导致类之间的一些共同属性散乱分布在各个类的代码中。从角色划分 角度来说,类由于承担了多个角色而导致执行逻辑的混乱,结果使得封装不严密,划分的角 色也不清晰,这显然与面向对象思想相违背:而且从软件的维护和复用的角度来考虑,这样 的设计将给维护和复用带来沉重的负担。此外,面向对象开发在大型系统、分布式系统和灵 活性要求较高的系统中也存在很多局限。 为了解决这些问题,以g r e g o r 为首的施乐公司帕洛阿尔托研究中心的研究小组先后尝 试了反射( r e f l e c t i o n ) 和元对象协议( m e t a _ o b j e c tp r o t o c 0 1 ) 等多种技术,但这些技术非常 复杂,难以被广泛利用。最终,g r e g o r 等提出了使用面向方面的程序设计技术 ( a s d e c t o r i e n t e dp r o g r a 帕m i n g ,简称a o p ) ,并在1 9 9 7 年欧洲面向对象程序设计大会 ( e c 0 0 p9 7 ) 发表了第一篇关于a o p 的论文 1 0 ,目的在丁- 将代码中的“横切结构”模块化, 这就是a o p 的起源。 a o p 是一种新技术,它的核心思想是将系统中的横切关注点和核心关注点分别模块化, 7 华东师范大学硕士学位论文 其中横切关注点通过方面( a s p e c t ) 实现模块化,核心关注点通过类( d a s s ) 实现模块化,再通过 一个类似于编译器的工具方面编织器( a s p e c tw e a v e r ) 对已模块化的两类关注点进行编 译,从而构造出新的系统 2 1 1a o p 的几个基本概念 关注点( c o n c e r l l ) :芡注点是一个为了满足系统整体目标而必须被处理的特定需求或考 虑 1 1 。面向方面编程技术中将一个软件系统看作是由组关注点组合实现的。图2 1 从面 向方面技术的角度展示了一个典型应用系统的构成情况。 图2 1 一个典型系统应用中的关注点的面向方面实现 如图2 1 所示,实现模块构成了系统的主体,而商务逻辑、日志功能和数据持久性作为 关注点构成了系统的各个应用模块。在面向方面技术看来,当前的系统实现技术中,商务逻 辑、日志功能和数据持久性是互相纠缠在一起实现的,这种实现技术往往会造成代码的混乱 和分散现象,模糊了各个核心功能模块之间的边界,使得各模块的功能不突出。因此面向方 面技术将关注点做了系统的分类:核心关注点和横切关注点。 核心关注点( c o r ec o n c e r n ) :开发人员建立一个系统以满足多个需求,可以大致地把 这些需求分类为核心模块级需求和系统级需求。用于完成系统核心模块级需求的关注点被称 为核心关注点,它用来完成系统的核心业务功能。 8 华东师范大学硕士学位论文 横切关注点( c r o s s c u tc o n c e r n ) :系统中有许多系统级需求是相互独立的,但它们一 般都会横切许多核心模块。用于完成系统级需求的关注点被称为横切关注点,它用米处理横 跨多个模块的系统级外围需求。一个典型的企业应用需要处理的横切关注点,如用户认证、 记录日志资源池、系统管理、性能、存储管理、数据保持、安全保密、多线程安全、事务完 整性、错误检验、策略实施等。所有这些关注点都可以横切数个子系统,如日志记录影响到 系统中每一个重要的模块,认证机制影响到所有需要访问控制的模块,存储管理影响到每一 个有状态的业务对象。 2 1 2 统方法在解决横切关注点时所引起的问题 横切关注点会跨越多个模块,当前的技术倾向于使用一维的方法学来处理这种需求。把 对应需求的实现强行限制在一维的空间里,这个一维空间就是核心模块,其他需求的实现被 嵌入在这个占统治地位的空间中。换句话说,问题空间是n 维的,而解空间却是一维的。图 2 2 说明了这个问题,这种不匹配导致了从需求到实现之间的糟糕映射。 商务逻辑 关注点空问 久忧 日志记录 持久化 解空问 图2 2 问题空间与解空间的匹配 通过一个例子来说明0 0 p 对横切关注点的典型实现:一个用户认证模块使用抽象接口提 供服务,接口的使j j 使得客户端与接口实现之间的耦合比较松散,通过接口使用认证服务的 客户端对丁接口的确切实现来说基本上是不关心的,对于所使用的实现做任何变更应该不需 要对客户端对自身作任何修改:同样,把一个认证实现替换成另个,就仅仅是实例化正确 实现的问题,这样,不需要对独立的客户端作什么修改就可以把认证的实现换成另一个。然 而,这样一种结构仍然需要每个客户端都有内嵌的代码来调用a p i ,所有需要认证的模块中 9 羔望型堕丕! ! ! 壁兰堡堡苎; 都会需要这些调用,而且是和它们各自的核心逻辑混合在一起。 p i 调用 敛据库捷 图2 3 使用传统方法来解决横切关注点 图2 3 显示了一个银行应用系统如何使用通常的技术来实现日志记录。尽管使片j 了一个 设计得很好的日志模块,通过提供抽象接口隐藏了格式化和流输出日志消息的细节,然而对 于每一个模块,无论是帐务模块、a 孙模块还是数据库模块,都需要调用日志a p i 的代码, 总体效果上说,在需要日志功能的模块和日志模块本身之间产生了不必要纠缠。每一个藕合 在图2 3 中用个灰色的箭头表示。 可以看出,使用当前方法学实现横切关注点会带来一些问题,可以把这些问题大致分为 两类: ( a ) 代码混乱:软件系统的模块中可能要同时兼顾几个方面的需要。例如,开发人员经 常要同时考虑商务逻辑、性能、同步、日志和安全等问题,兼顾各方面的需要导致相应关注 点的实现元素同时出现,引起代码混乱。 m ) 代码分散:由于横切关注点本来就涉及多个模块,相关实现也就遍布在这些模块里。 例如,在一个使用了数据库的系统星,性能和同步问题会影响所有访问数据库的模块。代码 分散容易导致代码可读性差,维护和更新难等结果。 1 0 华东师范大学硕士学位论文 2 1 3a o p 如何解决横切关注点问题 处理复杂问题的最好方法就是使问题简化。在软件设计中,简化复杂系统最好的方法就 是确定关键需求并将其模块化。实际应用中,o o p 方法的产生就是崩来模块化系统中关注点 的需求的。但是现实情况是o o p 方法只擅长模块化核心关注点,对横切关注点的模块化实现 却不够理想。 a o p 方法弥补了o o p 的这一欠缺。a o p 中模块化横切关注点的方法是:首先,辨认系统 中的横切关注点,通过分析系统中的每一个角色来划分系统模块:其次,明确此类关注点与 系统中的核心模块之间的关系,通过被称为“方面”的单元将横切关注点进行模块化操作: 最后将方面与系统模块松散耦台地关联起来。 对上一节描述的例子,如果使用a o p 技术,没有一个核心模块需要包含调用日志功能的 代码,它们甚至不知道系统中有日志需求的存在。图2 4 显示的是用a o p 实现的与图2 3 中相同的日志功能。现在日志逻辑聚集在目志模块和日志a s p e c t ( 方面) 中,客户端不再包 含任何日志代码,横切性的日志需求被映射为一个日志方面模块。有了这样的模块化,横切 性日志需求的任何变化只会影响到这个日志方面。而客户端被完全隔离了。 图2 4 使用a o p 技术解决横切模块 华东师范大学硕士学位论文 2 2 面向方面编程的实现 2 2 1 实现原理 如f 图所示,目前a o p 的典型实现分为以f 几个过程: a 编写满足核心关注点需求的代码。 b 编写满足横切关注点需求的代码。 c 使用a o p 语言编译器,把横切代码织入主关注点代码中,并生成满足系统需求 的代码。 2 5a o p 技术的典型实现 横切代码织入到主代码中的位置是通过连接点( j o i l l p o i n i ) 来声明的,连接点是 主代码中一个定义明确的位置,横切关注点将在这里横切应用程序。理论上来说, 连接点可以是程序代码中的任何位置,但一般a o p 的语言实现无法表示程序的任 何位置,只能表示方法调用、方法进入、方法退出、构造和析构函数、异常处理程 序等等。a o p 工具一般会提供识别连接点集合的机制,称为切入点( p o i n t c u t ) 。 切入点支持复合,这就允许把简单的切入点组合成更复杂的切入点。通知( a d v i c e ) 机制指定在程序执行过程中遇到匹配的切入点时应当采取什么行动。方面( a s p e c t ) 声明类似于面向对象编程中的类,包含了通知和切入点等概念,代表一套模块化良 好的横切结构。 a o p 实现中的织入过程是将横切关注点和主应用程序集成在一起的过程,这 一过程有四种不同的实现方式( 针对使用虚拟机的j a v a 和酣等语言,其他语言可 能只支持这四种中的部分实现) ,如下表: 1 2 &瓣#蒜囊一婪 满求 藿袜一 厂 孽 7 孓 、 。、。 札 一 飞艮黛;|1j萨下竺 华东师范大学硕士学位论文 类型说明 使用工具 编译期主要应用程序语言( 即编写核心关注点的语言) 和编写编译器 横切关注点的语言( 即面向方面语言) 的源代码在通过产 生字节码的编译器之前进行织入处理 连接期 主要应用程序语言和横切关注点的语言在编译成字节链接器 码后进行织入处理 载入期通过类装载器程序加载类时发生织入过程类装载程序 运行期虚拟机负责检测连接点并负责装载和执行多个横切关虚拟机 注点 图2 6 织入过程四种实现方式 2 2 2a o p 在j a v a 中的实现及其比较 目前,对a o p 在各种语言上的实现的研究较多,比如a s p e 吐r 【2 3 】是对r u b ,语言的a o p 绑定,a s p e c t s 2 7 】是对s l m l l t a l k 的一个a o p 实现版本,a s p e c f c 【2 4 】,舡p e c c + + 【2 5 】是分别 针对c 语言和c + + 语言的,a s p e c t c # 2 6 是c # 的一个a o p 实现,p y l l l i u s 【2 8 】允许p y m o n 语言 使用a o p 技术。当然,其他语言也可能有其a o p 实现,可以到w w w a o s d n e t 站点查找。 以上所述的各种语言的a o p 实现太都在实验阶段,还没有达到工业使用标准。相比而言, 在学术研究和商业应用上,j a v a 语言平台始终走在最前面。从蛙初的也是目前最成熟的a o p 工具a s p e c t j ,到目前已经融合在企业级容器j b o s s 2 9 中的j b o s sa o p 3 0 ,均建立在 j a v a 平台上。但同样是实现a o p ,且a o p 的技术要素完全相同,但各种a o p 语言对于a o p 实现的底层机制却是不尽相同的。 a s p e c t j 采用了源代码生成技术来实现a o p 。它提供了一套独有的基于j a v a 平台的a o p 语法,以及专有的a s p e c t j 编译器。编译器在编译具有a s p e c t j 语法的j a 程序时,能够 识别诸如a s p e c t ,p o i n t c u t 等特殊关键字,然后利用静态织入的方式,修改需要被截取的 方法所属类的源代码,把a d v i c e 或者i n t r o d u c e 的商务逻辑代码注入到正确的位置。利用 华东师范大学硕士学位论文 a s p e c t j ,可以将核心关注点完全独立出来,然后通过a s p e c t j 语法,编写符合核心关注点 要求的横切关注点代码,最后通过a s p e c t j 编译器,将这两者在后期结合起来。这是一种静 态的织八技术,早期的a s p e c t j 版本采用编译期的织入技术,后来的版本支持链接期的织入 处理。本文提出的基于a o p 的单元测试框架使用a s p e c t j 语言和j a v a 语言结合编程,后文 将详细介绍a s p e c t j 语言及在本文中所用到的a s p e c t j 相关知识。 s p r i n g a o p 3 1 是s p r i n g 框架 3 2 中的一部分,但可以作为一个独立的模块单独存在。 s p r i n ga o p 实现a o p 技术从本质上来讲,是利用了j d k 提供的动态代理技术 3 5 。而从实 际的实现方式来看,则是利用了i o c ( i n v e r s i o no fc o n t r o l ,反转模式) 3 3 机制,同时 采用了a o p 联盟( a o pa 1 1 i a n c e ) 3 4 的通用a o p 接口。首先,s p r i n ga o p 通过埘l 配置 文件配置了p o i n t c u t ,并利用i n t e r c e p t o r ( 拦截机) 作为设定的触发条件。i n t e r c e p t o r 是由用户自定义的,它相当于是a o p 中的a d v i c e 。最后定义一个s p r i n ga o pp r o x y f a c t o r y 用于加载执行a o p 组件,并利用i o c 机制将a d v i c e 注入到接口以及实现类中。 j b o s s4 o 提供了a o p 框架。与s p r i n g 一样,这个框架可与j b o s s 应用服务器紧密结 合,也可以单独运行在自己的应用中。j b o s sa o p 同样需要i n t e r c e p t o r 拦截器来完成对方 法的拦截,它要求所有的i n t e r c e p t o r 都必须实现o r g j b o s s a o p i n t e r c e p t o r 接口。在这 个接口中最重要的方法就是i n v o k e ( ) 该方法对元数据直接进行操作,并利用反射的原理 去拦截方法的消息。i n t e r c e p t o r 相当于a o p 的a d v i c e ,至于p o i n t c u t ,则在x i i l 配置文 件中配置。可以看出,s p r i n g a o p 和j b o s s a o p 在实现上属于动态织入的方式,它们与a s p e c t j 在实现上是迥然不同的两种方式。 2 3 介绍a s p e c t j 和a o p 技术一样,a s p e c t j 1 3 ,1 4 ,1 5 ,1 6 项目起源于施乐公司的帕洛阿尔托研究中心。 a s p e c t j 从1 9 9 7 年开始开发,1 9 9 8 年第一次发布给外部用户,2 0 0 1 年发布1 0r e l e a s e 。 为了推动a s p e c t j 技术和社团的发展,p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论