(计算机科学与技术专业论文)面向方面程序的单元测试技术研究.pdf_第1页
(计算机科学与技术专业论文)面向方面程序的单元测试技术研究.pdf_第2页
(计算机科学与技术专业论文)面向方面程序的单元测试技术研究.pdf_第3页
(计算机科学与技术专业论文)面向方面程序的单元测试技术研究.pdf_第4页
(计算机科学与技术专业论文)面向方面程序的单元测试技术研究.pdf_第5页
已阅读5页,还剩71页未读 继续免费阅读

(计算机科学与技术专业论文)面向方面程序的单元测试技术研究.pdf.pdf 免费下载

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

文档简介

国防科技大学研究生院学位论文 摘要 作为一种全新的技术,面向方面编程( a o p ) 凭借模块化横切关注点的能力受到 越来越广泛的认可。同其他编程语言一样,在带来优势的同时,面向方面编程也 带来了不少的挑战。方面语言的新特征使得传统的测试技术无法直接对方面程序 进行检测,缺乏成熟的方面测试技术无疑会成为阻碍面向方面软件编程大规模应 用的瓶颈问题。 论文分析研究了方面程序单元测试中的核心问题,并针对a s p e c t j 程序提出一 套测试方面行为的方法。通过与国内外方面程序单元测试问题研究现状比较,指 出该方法的优势所在。课题从测试实施和测试自动化角度出发,研究了方面程序 单元测试框架和测试数据自动生成方案。测试框架以j a v a 注释符和反射机制为基 础,建立方面程序到被测对象间的关联;分析和研究编译后方面行为特征符,构 造出方面解析机制。综合运用随机测试数据生成、相对测试充分性准则的优化和 指定路径的测试数据生成等技术实现测试过程的自动化。本文实现了针对a s p e c t j 程序自动生成单元测试的工具a j u n i t ,包含测试数据自动生成器、测试代码自动 生成器和核心测试框架三大部分。最后,对a s p e c t j 程序实例进行了测试和分析。 本文研发的测试工具为方面程序单元测试提供了便利,对方面程序的可靠性 和可信性提供了一定的保证,提高了面向方面软件开发的效率。 主题词:面向方面软件,单元测试,免织入测试框架,测试数据生成,a s p e c t j 第i 页 国防科技大学研究生院学位论文 a b s t r a c t a san e w t e c h n i q u e ,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 ) i sg a i n i n gp o p u l a r i t yf o r i t sa b i l i t yo fm o d u l a r i z i n gc r o s s c u t t i n gc o n c e r n so fas o f t w a r es y s t e m h o w e v e r ,s a m e l i k eo t h e rp r o g r a m m i n gl a n g u a g e s ,a o pb r i n g ss o m ec h a l l e n g e sa sw e l la sa d v a n t a g e s i t i sd i f f i c u l tt o t e s ta s p e c t o r i e n t e dp r o g r a m sw i t ht r a d i t i o n a lw a y sf o ri t sn e w c h a r a c t e r i s t i c h e n c e ,l a c k i n g o fm a t u r et e c h n i q u e sf o r a s p e c tt e s t i n g w i l lb ea b o t t l e n e c k p r o b l e m o fp r e v e n t 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 f r o mm a s s i v e a p p l i c a t i o n t h i sp a p e ra n a l y s e st h ec o r ei s s u e so ft e s t i n ga s p e c t o r i e n t e dp r o g r a m s b a s e do n a s p e c t jp r o g r a m s ,w ep r e s e n tan e ww a yt o t e s ta s p e c t u a lb e h a v i o r s u r v e y i n gt h e r e s e a r c ha b o u tu n i tt e s i n go fa s p e c t o r i e n t e dp r o g r a m sr e v e a l st h ea d v a n t a g e so fo u r s o l u t i o n f r o mt h ev i e w so ft e s t i n gi m p l e m e n t a t i o na n da u t o m a t e dt e s t ,w em a k eas t u d y o ft h eu n i tt e s t i n gf r a m e w o r ko fa s p e c t jp r o g r a m sa n dt h es t r a t e g yo fa u t o m a t e dt e s t g e n e r a t i o nf o rt h ep r o g r a m s w i t ht h eh e l po f j a v aa n n o t a t i o na n dr e f l e c t i o nm e c h a n i s m , e a c ht e s t e da s p e c t u a lc a nb ea s s o c i a t e dw i t hat e s i n go b je c t a f t e r a n a l y s i n gt h e c h a r a c t e r so fc o m p i l e da s p e c t ,w es e tu par u l eo fp a r s i n gt h et e s t e da s p e c t t h es t r a t e g y a u t o m a t e st h et e s t i n gp r o c e s sb yu s i n gt e c h n i q u e so fg e n e r a t i n gt e s tc a s e sr a n d o m l y , s u p p l e m e n t e db yo p t i m i z i n go ft e s tc a s e sw i t hr e s p e c tt ot e s ta d e q u a c yc r i t e r i o n ,a n d f r o mc e r t a i np a t h sa sw e l l t h e p a p e ri m p l e m e n t sa j u n i t ,af r a m e w o r k f o r a u t o m a t i c a l l yg e n e r a t i n gu n i tt e s t sf o ra s p e c t jp r o g r a m s a j u n i ti n c l u d e st h r e ep a r t s : t h em a i nf r a m e w o r k ,t h ea u t o m a t e dt e s t i n gd a t ag e n e r a t o ra n da u t o m a t e dt e s t i n gc o d e g e n e r a t o r f i n a l l y ,w et e s ta n da n a l y s ea ne x a m p l eo fa s p e c t jp r o g r a m t h et o o li n t r o d u c e di nt h i sp a p e rc a nh e l pt ou n i tt e s ta s p e c t - o r i e n t e dp r o g r a m s i t i m p r o v e se f f i c i e n c yo fa s p e c t o r i e n t e ds o f t w a r ed e v e l o p m e n ta n di n s u r e sp r o g r a m sw i t h r e l i a b i l i t ya n dc r e d i t a b i l i t y k e yw o r d s :a s p e c t o r i e n t e ds o f t w a r ed e v e l o p m e n t ,u n i tt e s t i n g ,t e s t i n gf r a m e w o r k w i t h o u tw e a v i n g ,t e s t i n gd a t ag e n e r a t i o n ,a s p e c t j 第i i 页 国防科技大学研究生院学位论文 表目录 表3 1a j t e 与j a m l u n i t 能力比较列表2 5 表4 1a s p e c t 内模块编译前后签名对比一3 4 表4 2 编译后方面中各类待测行为特征符表示3 6 表5 1 各种算法选取结果比较4 6 表6 1 组合同余发生器的参数5 4 表6 2 测试代码生成器生成代码基本模板5 8 表6 3 测试数据生成器生成的实验数据6 0 表6 4 测试结果分析6 3 第1 v 页 国防科技大学研究生院学位论文 图目录 图2 1 系统中的关注点。6 图2 2a o p 的开发阶段8 图2 3a o p 语言的实现9 图3 1 分层测试框图1 9 图3 2a j d t 可视化工具2 2 图3 3a j t e 工作原理图2 4 图3 4p o i n t c u t 推导器原理图2 6 图4 1a s p e c t j 编译器织入原理图2 8 图4 2 测试对象结构图3 7 图4 3 被测方面与被测对象实体关联图3 7 图4 4 解析器机制图3 8 图4 5 方面单元测试流程3 8 图6 1a j u n i t 免织入自动测试工具系统框架图4 8 图6 2a j u n i t 系统流程图4 9 图6 3 核心测试框架设计图5 0 图6 4 核心测试框架类图51 图6 5 测试运行平台底层模型结构图5 2 图6 6 核心测试框架测试步骤流程图5 2 图6 7 测试数据自动生成器活动图5 4 图6 8 测试代码生成器原理图5 6 图6 9 测试代码生成顺序图5 7 图6 1o 测试结果图一6 2 第v 页 独创性声明 本人声明所呈交的学位论文是我本人在导师指导下进行的研究工作及取得的研 究成果。尽我所知,除了文中特别加以标注和致谢的地方外,论文中不包含其他人已 经发表和撰写过的研究成果,也不包含为获得国防科学技术大学或其它教育机构的学 位或证书而使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文 中作了明确的说明并表示谢意。 学位论文题目: 亘囱友垂猩虚鲍兰丞测达遮苤盟究 学位论文作者签名:军彝盔毖 日期:归毋,年p 月彦日 学位论文版权使用授权书 本人完全了解国防科学技术大学有关保留、使用学位论文的规定。本人授权国 防科学技术大学可以保留并向国家有关部门或机构送交论文的复印件和电子文档,允 许论文被查阅和借阅;可以将学位论文的全部或部分内容编入有关数据库进行检索, 可以采用影印、缩印或扫描等复制手段保存、汇编学位论文。 ( 保密学位论文在解密后适用本授权书。) 学位论文作者签名:幽 作者指导教师签名:缍盏 日期:扣髀( d - 月拥 日期:2 们略年2 月日 国防科技大学研究生院学位论文 第一章绪论 程序中的错误至今仍是设计人员无法避免的问题,在a o p 中也是如此。a o p 在程序开发过程中引入了新的特性,传统的测试方法无法直接解决方面程序测试 的问题,迫切需要一套针对a o p 的测试理论和技术方法来保障方面程序的可靠性 和可信性。本文主要针对方面程序单元测试进行研究,目的是通过研究方面程序 单元测试理论和方法,开发出自动测试工具以支持a o s d 在软件开发领域进一步 发展。 1 1 课题研究背景和意义 软件工程和程序语言之间存在一种多变的关系相互支持。最常用的设计方法 是将一个系统分割成多个小模块或小单元。为了实现这些小模块,程序语言将提 供某些机制来定义并表现这些模块的抽象,同时还会提供一些组装的机制来实现 期望的行为或动作。当一种程序语言所提供的抽象和组装机制,能够使得开发人 员清晰地表达所要设计的模块或单元时,我们就认为这种程序语言能够与该软件 设计方法相匹配。最常用的语言抽象机制( 例如过程,函数,对象,类) 都源自 于系统功能的分解,并且能够被归类为一种一般化的过程模型。当今,不断增加 的应用软件复杂性和各类新技术的涌现,使得我们的程序必须面对处理数量庞大 的、各类特定的计算关系,例如同步处理,分布式应用,实时约束,端口控制, 持久化和各种失效恢复等,这些事务通常散布系统模块的各个角落,并且影响着 性能及语义系统,这些复杂的应用可以被称作关注点。当使用面向对象或者过程 化的语言来实现这些多关注点时,程序代码通常与系统的基本功能相互纠缠,要 将这些关注点作为一个抽象独立的单元分离出来进行观察和分析相当困难。典型 的集成新增关注点的方法是拓展一种指定的语言,提供一些新的语法结构来标识 这些关注。一个典型的拓展语言的例子便是分布式实时对象语言d r o l ,拓展自 c + + ,使得能够描述分布式实时系统。然而即使这些关注点可以理想地进行分散并 且正常交互协作,把它们混合在代码中仍然会带来不少问题;为这些交织的代码 编程是十分复杂和困难的,所有这些关注点都必须在同时以同一级别进行处理; 由于缺乏较好的抽象,这些交织的代码不易于理解;各关注点间强耦合导致代码 纠缠,不易于维护和修改;针对面向对象系统,各关注点间强耦合导致的代码纠 缠增加了继承关系中的异常现象。可见,代码纠缠增加了各功能模块之间的依赖 性,使得程序语言偏离了原来的目的:不仅降低了代码的重用性,而且更容易出 现错误。为了解决这些代码混合纠缠带来的不利因素,面向方面软件开发( a o s d ) 第1 页 国防科技大学研究生院学位论文 应运而生,随之出现的面向方面编程a o p ( a s p e c t o r i e n t e dp r o g r a m ) 则囚为其能 够自然、清晰地分离关注点,并使用抽象和组合机制构成可执行代码而在工业界 逐步兴起。 在a o p 中,横切需求被封装在一种称为“方面”的模块中。在构建a o 系统 时,通常将主要的功能封装在传统模块内,而使用方面模块来封装横切功能,在 编译和运行a o 系统时,需要将方面代码织入基代码中去。然而方面和传统模块 中存在的各种依赖关系以及a o p 所带来的新的特性,对程序测试带来了新的挑战。 随着面向方面技术的不断成熟,方面的应用面不断拓宽,方面和方面集成的测试 理论和方法成为解决面向方面软件可信性的重要基础。 为此,课题对面向方面程序单元测试问题展开研究,提出一套针对方面程序 进行单元测试的理论机制,包括免织入测试框架、测试数据自动生成和测试代码 自动生成。课题从分析面向方面程序设计语言a s p e c t j 的语言语法机制出发,通过 研究源码和编译后的字节码,建立对a s p e c t 的触发机制,设计并构造方面单元测 试所使用的注释库,结合j u n i t 的设计特色,设计上层测试接口,进一步增强透明 化并简化测试使用。针对测试数据自动输出问题,从效率和精度两方面作权衡: 采用优化的随机算法和迭代松弛算法相结合的方法生成测试数据。为增强测试自 动化能力,提供测试代码发生器,有效结合测试机制执行和测试数据生成部件, 自动生成能够在免织入测试框架上运行的测试代码。 本课题的基本任务是研究面向方面程序单元测试问题,解决其中涉及的关键 问题,例如方面与基模块间的从属性质,方面程序测试数据自动生成问题等。相 关理论和方法可指导面向方面软件开发,有广泛的应用前景。 本课题的研究意义体现在理论和实践两个方面。在理论上,提出了面向方面 程序单元测试主要目标、难点、解决方法的系统机制,并提出采用优化的随机算 法与迭代松弛算法相结合的数据生成方案,方面单元测试问题得到解决能加快软 件开发进度,促进面向方面技术的进一步成熟和发展;在实践上,测试能力的提 高,有利于保证软件质量,促进面向方面软件开发在工业领域的大规模应用。 1 2 课题研究内容 目前,针对面向方面软件开发的研究相当活跃,随着方面技术的应用不断深 入,面向方面程序测试问题引起了广泛的关注,缺乏成熟的方面测试技术成为阻 碍面向方面软件编程大规模应用的瓶颈问题。单个方面行为的正确性,单个方面 织入系统后系统行为的正确性以及多个方面织入系统后系统行为的正确性,无一 不对软件质量有着根本的影响。因此,面向方面程序测试被选作本课题的主要研 究内容。 第2 页 国防科技大学研究生院学位论文 本课题研究的基本内容是从理论、方法和工具三个方面米研究面向方面程序 的测试问题。主要研究内容包括: 1 以面向方面编程为中心,研究面向方面编程的方法和特点; 2 分析研究面向方面程序的特点以及这些特点对测试所带来的挑战; 3 综述方面程序测试的研究现状; 4 分析方面单元测试的目的和对象,针对测试方面行为的问题,提出一种 方面单元测试的方法;并综述方面单元测试国内外的研究现状,明确现 有方法的优点、缺点; 5 从免织入测试框架和测试自动生成两方面研究面向方面程序单元测试问 题。从源码和字节码两个层面,应用注释符方法建立对方面体的操控机 制。测试自动生成包含测试数据自动生成和测试代码自动生成两大部分, 其中测试数据自动生成结合随机和迭代松弛算法的优点,提高测试数据 生成效率和质量;两部件相结合,有效提升测试过程自动化程度; 6 方面单元测试工具的设计与实现。方面单元测试工具实现为e c l i p s e 和 a j d t 工具插件,包括免织入测试框架、测试数据发生器、测试代码发生 器、测试代码预处理器等; 7 案例分析。选取具有代表性的a s p e c t j 示例程序的案例,运用方面单元 测试工具对其中方面程序进行测试。 通过对上述7 个方面的研究,达到以下目标: 提出免织入测试法、效率和精度并行的测试数据生成方法,设计和实现相应 的方面程序单元测试工具,通过使用该工具可以帮助开发人员在大型系统的开发 中及时发现方面程序中的错误,从而保证软件的质量。 1 3 论文结构 论文共分为七章。 第章是绪论。主要介绍了课题的研究背景、研究意义和研究内容,确定了 课题的研究目标。 第二章从程序设计方法学的角度,介绍了面向方面编程方法的理念、实现原 理、基本语言机制以及所带来的优势;分析面向方面程序的特点以及这些特点对 测试造成的问题,结合方面实现机制对现有方面程序测试研究现状进行综述;此 外, 简述了a s p e c t j 的方面机制及其语法。 第三章介绍了方面程序单元测试问题产生的原因及影响,研究并提出建立免 织入测试框架的方案来解决了方面测试中的从属问题,并综述了国内外方面测试 的研究现状。 第3 页 国防科技大学研究生院学位论文 第四章介绍了免织入单元测试框架的测试原理,提出使用注释操作符机制在 源代码和字节码两个层面进行关联及操作控制。 第五章给出了测试数据自动生成策略,提出使用优化的随机算法和迭代松弛 算法相结合的方法生成测试数据。 第六章介绍方面单元测试工具的设计与实现,并给出了相应的案例分析。 第七章对论文的主要工作进行了总结,明晰各部分的主要工作内容,指出在 今后的研究中需要进一步加强的工作。 1 4 论文的研究成果 本文的重要贡献和创新工作主要包括以下几个内容: 提出个方面单元测试工具。该框架主要包含免织入核心测试框架、测试 数据发生器和测试代码发生器三大部分,其中免织入核心测试框架利用建 立方面测试注释库的方式,关联方面源码和字节码,并获取对方面字节码 操作控制。 提出采用优化的随机算法和迭代松弛算法相结合的测试数据生成策略来 提高测试数据生成的效率。 设计并实现免织入方面程序单元测试工具。该测试工具以e c l i p s e 中a j d t 插件的形式提供,能与面向方面编程环境很好地融合。 第4 页 国防科技大学研究生院学位论文 第二章方面程序测试 弟一早 力l e u 往j 予耿u 饥 面向方面编程a o p 1 1 ( a s p e c t o r i e n t e dp r o g r a m s ) 是一种在计算机软件开发过 程中用来显著分割关注点的新技术。传统面向对象编程o o p 中存在横切关注点 ( c r o s s c u t t i n gc o n c e r n s ) ,产生代码交织( c o d et a n g l i n g ) 和代码散布( c o d es c a t t e r i n g ) 的 现象,影响了模块的内聚性和模块之间的独立性;而a o p 技术通过抽取并封装这 些关注点,改善软件程序结构,使得程序设计更加自然化,易于理解和维护。 2 1a o p 概述 计算机科学发展的早期,开发者使用最直接的机器语言来编写程序。不幸的 是,使用这种方式,程序员花在思考一条特殊机器指令的时间远比花在实际问题 上长得多。慢慢的,对底层机器语言进行抽象的高级语言逐渐登上了历史的舞台。 而后出现了结构化语言;如今,我们可以将一个复杂的问题分解成多个过程来完 成其所对应的任务。然而,随着问题进一步复杂化,我们需要更好地技术手段来 应对这些难题。面向对象编程o o p ( o b j e c t o r i e n e t dp r o g r a m m i n g ) 使得我们可以 将一个系统,看作是由许多个相互协作的对象组成的。我们可以使用类将具体的 实现细节隐藏在接口下层;多态性为那些具有相关性的概念提供了一个通用的行 为和接口,并且能够让更多专门的组件在不需要访问基础概念实现的前提下,改 变其某个独特的行为。 编程的方法和语言决定着我们同计算机之间交流的方式。每种新的方法代表 着分解问题的新途径:例如机器码,与机器独立的代码,过程化,类等等;每种 新的方法也使得系统需求映射到程序结构变得更为自然。这些编程方法的不断演 变进化,使得我们构造系统的复杂性也在不断增加。反过来看这一问题也是相当 真实的:我们能够接受如今这些越来越复杂的系统的存在,原因就是因为这些不 断涌现出来的技术使得我们能够应对这些复杂性。 目前,o o p 是多数软件开发项目的首选方法,在对普通行为建模时该方法表 现出了较强实力;传统过程化方法也已在众多大、中、小型项目中获得成功应用, 利用这些技术,软件系统能够较好地被模块化,有效改善了软件的结构,提高了 软件的质量。然而,在一些应用中,仍然存在着无法采用o o p 等方法来模块化的 需求。通常这些需求分散在应用领域的各个角落,例如日志记录、数据持久化、 同步处理、性能优化等等,我们将这些行为统称为“横切关注点 ,显然这些行 为不适合使用传统的过程化或者面向对象方法来描述。 面向方面编程a o p 的出现为解决这一问题提供了契机。a o p 本身是对模块化 第5 页 国防科技人学研究生院学位论文 编程和面向对象编程的一种拓展,而这两种方法都在软件模块化进程中取得了显 著的成果。a o p 的核心思想是,尽管面向对象语言中分等级的模块化方法极为有 效,但是它们天生不具备将一个复杂系统中所有关注点模块化的能力。并且通过 观察现有各类软件系统可以证明在一个复杂的系统应用中,有许多关注点天然 地横切其他一些应用模块。 在处理横切关注点时,a o p 所采取的方法就如同o o p 在处理对象封装和继承 那样,提供了一些语言机制来显示地封装这些横切结构。通过封装,能够模块化 程序中的横切关注点,如此一来也就获得了通常模块化所带来的利处:简化的代 码使得程序开发和维护也变得简单,同时又提高了软件程序的重用性。 2 1 1 横切关注点问题 在实际应用中,我们可以将一个复杂的软件系统看作是多种关注点应用的组 合。一个典型的系统通常会由多种类型的关注点所组成,例如包括事务处理逻辑、 性能监控、数据持久化、h 志和调试记录、身份验证、安全控制、多线程安全控 制和错误检钡4 等等。当然,有时也会涉及一些开发过程中的关注点,例如可理解 性、r 维护性、可跟踪性和演化性等等。图21 展示了在系统中这些关注点是由多 个不同模块所实现的。 横切关注点散布在 图2 l 系统中的关注点 开发者在构造系统时,需要去面对许多不同的需求。广义上讲,我们可以将 这些需求分为核心模块级需求和系统级需求。许多系统级需求之间是相互正交的, 并且有一部分同模块缴需求问也成正交性质。系统级需求往往会横切许多模块级 需求。例如,在典型的企业级应用中,包含身份验证、日志、资源池管理、权限 管理、性能监控和数据管理等横切关注点。其中,每个关注点横切了一些子系统。 例如数据库管理关注点影响着所有商务对象的状态,因此被称作横切关注点。 尽管横切关注点散布在许多模块中,当前所使用的技术仍然倾向于使用一维 第6 页 国防科技大学研究生院学位论文 方法来处理这些需求,迫使这些需求以一维方式映射到实现层。同一维度中往往 充斥着核心模块的实现,剩余的需求不得不在该维度中相互缠绕起来。换句话说, 需求空间是一个多维的空间,然而实现层却是一个一维空间,这一不匹配便导致 了需求与实现间映射关系相当困难。在使用当前的方法时,一些现象指出了实现 横切关注点的方法是值得商榷的。通常我们可以将这些现象分为以下两类 2 1 : 代码交织( c o d et a n g l i n g ) :软件系统中的模块可能同时与多个关注点产 生交互,使得每个模块需要包含多个关注点的实现。例如,开发人员经常 需要同时考虑业务逻辑、性能、同步性、日志和安全等行为,而这些多方 面的需求导致了各个关注点的应用必须和其它关注点同时出现,造成的结 果便是代码发生缠绕现象。 代码散布( c o d es c a t t e r i n g ) :由于从本质上看,横切关注点需要遍布在 多个模块中,那么和这些关注点相对应的代码实现也将遍布在所有这些模 块中。例如,在一个使用数据库的系统中,所有访问数据库的模块都会受 到性能关注点的影响。 在软件系统中,代码交织和代码散布的现象会影响到软件设计和开发的方方 面面: 减弱了代码实现的可跟踪性:在模块中同时实现多个关注点,会导致一个 关注点和其实现之间的关联变得不清晰,减弱了二者之间的映射关系。 降低了生产力:同时实现多个不同关注点,使得开发人员不得不将注意力 从主关注点转移到那些琐碎和周边的关注点上去,直接降低了生产力。 代码可重用性降低:在当前系统环境中,一个模块会应用到多个不同的关 注点,而其他需要使用类似功能的系统却无法直接使用这些模块来获取这 些关注点的能力,不仅降低了代码重用,也大大影响了软件生产力。 代码质量差:代码交织现象会造成代码中存在许多潜在的问题。因此,当 我们同时将多个关注点作为实现目标时,无法对所有关注点的实现都报以 足够的重视,难以避免错误的发生。 难以扩展:由于在可视化和资源上的限制,造成一个设计需求仅能针对当 前提出的关注点。若需要在将来扩展需求,就必须更改其实现部分。然而 由于实现部分并非是模块化的,这就意味着关注点涉及的多个模块都需要 被更改。每个发生改变的子系统都可能导致不一致性的产生,这便需要大 量的测试工作来保证这些变化没有造成错误的产生。 由于横切行为的实现分散在各个模块中,难以被理解和维护。a o p 为解决这 一问题提供了一种方法,即将横切关注点的代码从模块中分离出来,模块化为“方 面”。 第7 页 国防科技大学研究生院学位论文 2 1 2 a o p 实现原理 a o p 的目的是将关注点清晰地分离,从而克服横切关注点可能带来的问题。 其核心思想是,开发人员能以一种松耦合的方式来实现单个关注点,并且把这些 实现组合在一起构成最终的系统。在实际中,a o p 提供了一种模块化横切关注点 的方法来构造松耦合的系统;与之相反的是,在o o p 中则使用模块化普通关注点 方法来构造松耦合的系统。在a o p 中,这些模块化的单元称作方面 3 1 ( a s p e c t ) , 就如同普通关注点的实现在o o p 中被称作类那样。通常,a o p 包括下列三种清晰 的开发步骤,图2 2 给出了a o p 的开发阶段: 1 方面的分解:这一步骤主要是指对需求进行分解,从需求中提炼出横切和 普通的关注点。开发人员需要将核心模块级的关注点从横切系统级的关注 点中分离出来。 2 关注点的实现:各自独立地实现每个关注点; 3 方面的重组:在这步骤中,方面集成器通过创建模块化单元方面来指 定重组的规则。在实际应用中,这一重组的过程,被称作织入【3 】( w e a v i n g ) 或者集成,并使用这些信息来构造最终的系统。 分离 l 的关 方面分解方面重组 图2 2 a o p 的开发阶段 同o o p 区别是,a o p 在处理横切关注点时采用的方法与前者大不相同。在 a o p 中,每个关注点的实现都不知道其它关注点是否“关注”它。一个a o p 的实 现可以借助其他的编程方法作为其基础的方法,这样就能完整地将基础系统的优 点保持下来。例如,一个a o p 的实现若选择o o p 作为基础系统,那么该实现便 能把o o p 善于处理普通关注点实现的能力传承下来。采用这类实现方法,独立的 一般关注点便可以借助o o p 技术,这就好比在许多o o p 语言中使用过程化语言 来作为基础语言一样。 2 1 3 a o p 语言剖析 如同其他编程语言实现一样,一个a o p 的实现通常由两部分组成:语言规范 第8 页 国防科技大学研究生院学位论文 和实现。语言规范描述了语言的结构和语义等内容;而语言的实现部分是指根据 语言规范来检验代码的正确性,并且将这些代码转换成为目标机器可执行的格式。 a o p 语言规范 站在高层次卜看,a o p 的语言由两部分构成: 1 关注点功能的实现:在这一部分中,需要将独立的横切需求映射到代 码上,从而使得编译器可以将这些代码转换为可执行代码。由于关注 点的实现采用指定过程的方式进行,开发人员可以在a o p 巾使用传 统的编程语言例如c 、c 十+ 或者j a v a 。 2织八规则规范:这一规范描述了如何将各个独立的已实现的关注点组 合起来,并形成最终的系统。为了达到这个目的,需要使用或者建市 一种语言柬指定不同实现关注点的组合规则,以构成最终的系统。这 种指定织入规则的语占可以是对现有实现语言的拓展,也可以是一种 完全不同的语言机制。 a o p 语言实现 a o p 语言编译器有两步骤逻辑操作: 1首先需要将各个独立的关注点组合起来; 2 其次是将组合的结果信息转换为可执行的代码。 图23 a o p 语言的实现 图2 3 展示了a o p 语言的实现机制。当然a o p 的实现可以采用多种不同的织 入方式,其中一种方式是采取源码至源码的转换。这种方法要求首先预处理每个 方面的源代码,通过这些处理产生织入后的源码,而后a o p 编译器将这些转换后 的代码插入到基础语占编译器中,并产生最终的可执行代码。举例来说采用这 类方法,。个基于j a v a 语言的a o p 实现首先将每个方面转换为j a v a 的源代码, 然后使用j a v a 编译器将这些源码转换为字节码。同样的方法也可以在字节码一层 进行织入操作;归根到底,字竹码本身仍然是一种源码。此外,下一层执行系统 一个虚拟机的实现也可以是支持a o p 的。例如,在使用这类方法的基于j a v a 第9 页 卜 国防科技大学研究生院学位论文 语言的a o p 实现中,虚拟机首先将加载织入规则,然后将这些规则应用剑随后加 载的类上。转而言之,这种方法可以实现j u s t i n t i m e t 4 j 方式的方面织入。 o o p 是由类、对象和接口等构成的,a o p 也有其独特的术语【3 】,【5 j : 横切关注点( c r o s s c u t t i n gc o n c e r n s ) :我们已在前文对其作了解释,在 此不再重复。 方面( a s p e c t ) :一个方面是对一个横切关注点的模块化,它将那些原本 散落在各处的、用于实现这个关注点的代码归整到一处;在实现中,方面 通常由切入点和通知体组成。方面本身可以理解为软件开发过程中的一种 关注点。与那些核心的主要的组件模块相比,方面是横切这些组件模块的 关注点。 连接点( j o i n tp o i n t ) :连接点是编程语言语义中与方面同等重要的元素。 指程序执行过程中的一点,例如方法调用、字段访问、异常抛出等时刻。 如今,仍然有多种连接点模型等待人们去研究和发展。连接点通常紧密依 赖于实现层的编程语言。 通知体( a d v i c e ) :在特定连接点处所执行的动作,用来实现需求的行为。 在许多a o p 语言中,通知体是由一个切入点和一个行为实体构成的。行 为实体在连接点同切入点匹配处执行,并且这些切入点可以将运行时的信 息暴露给通知中的运行体。 切入点( p o i n t c u t ) :在许多a o p 语言中,一个切入点是对一组动态的连 接点的断言,因此给出某个动态的连接点,切入点可以在运行时决定是否 匹配该连接点;从另一种角度看,切入点是一组连接点的总称,用于指定 横切关注点在程序运行过程的哪一处被应用。 除此之外,a o p 还有许多其他的术语元素,但上述这些元素是a o p 运作机制 的最核心部分。 2 1 4 使用a o p 的好处 使用至今,对于o o p 而言,a o p 是其一种非常受欢迎、且极为有效的补充, 称之为补充是因为a o p 并不是以o o p 的取代者或竞争者的角色出现的。使用a o p 给现有的软件工程带来了如下优势【6 】: 类之间的解耦:当两个类相互依赖时,两个类便是相互关联的,这就意味 着任何一方都不能脱离对方而独自使用。而在a o p 中,将复杂或者附加 的操作从那些基本简单的操作中分离出来成为了可能,使得那些特殊的类 仅需要将注意力放在单个特征实现上。 不同应用层之间的分隔变得清晰:大型的企业级系统通常由许多不同层构 第l o 页 国防科技大学研究生院学位论文 成。每一层都有独特的职能。通常在这层中不需要处理其他诸如安全、异 常处理、交易管理或者日志等特征行为。通过使用a o p ,这些附加的特 征行为可以在需要时透明地加载应用。 模块化横切关注点的实现:a o p 使用最小的耦合来处理每个独立的关注 点,如此一来即使是横切关注点的实现也能够被模块化,减少了系统中代 码的重复和混乱。 更利于重构:重构是一种术语,描述了改变现有系统来完成新的需求所经 历的过程。a o p 进一步推动了重构的能力,因为开发者可以在不需要强 制改变现有代码情况下动态添加更多的功能。 设计决策绑定的延迟:在使用a o p 进行开发过程中,由于可以将各个独 立的需求封装在方面中通过织入来实现,软件架构设计人员可以延迟对将 来的需求设计作决策。 更多的代码重用:因为a o p 将每个方面作为独立的模块实现,每个独立 的模块从而就变得更为松耦合。通常,实现中的松耦合是获得更高代码重 用的关键,a o p 能够在实现中获取比o o p 更好的松耦合性,也就提高了 代码的可重用性。 2 2a o p 与软件测试技术 测试技术和方面技术之间的关系可以从两个角度去考虑。首先,我们可以利 用面向方面技术来辅助现有系统测试工作的实施,当然通常这些系统都是指o o 系统;另一方面,使用a o p 所实现的a o 系统本身也需要进行测试,来保证系统 的可靠性和可信性。 2 2 1 软件测试方法 随着软件应用领域越来越广泛,软件本身质量的优劣也日益受到人们重视, 质量保证能力的强弱直接影响着软件行业的生存与发展。软件测试是一个成熟软 件企业的重要组成部分,是软件生命周期中一项非常重要且非常复杂的工作,对 软件可靠性保证具有极其重要的意义。根据软件开发周期按阶段划分,软件测试 过程主要包含模块测试、集成测试、功能测试、系统测试、验收测试和安装测试 等。模块测试也可称作单元测试,是对程序中的单个子程序或过程进行测试的行 为,即在测试阶段开始时,首先将注意力集中在对构成程序的较小模块的测试上 面;单元测试面对的最小级别的单元,从而相比其他测试过程而言减轻了定位及 纠正错误的难度。集成测试通常用来检测多个模块组合问的协同交互是否正常, 对于一个大型系统而言,集成测试还需要对多个子系统间的交互进行检测,以保 第11 页 国防科技大学研究生院学位论文 证各个部件问正常协作。回归测试是上述软件测试过程没自列出的阶段,然f 却 有着相当重要的作用;本质上看,回归测试包含了多种测试过程,例如单元测试 和集成测试;作用上看,一旦系统程序发生改变就必须进行回归测试,以保证两 点:一是发生变化的部分没有影响原系统的其他功能,另一点是发生变化的部分 功能符合设计需求。由于这三类程序测试过程非常重要且与程序本身关系密切, 所以获得了多数研究人员的重视。 软件测试方法中的黑盒测试和白盒测试是两种最普遍的测试策略【7 】 【8 1 。黑盒测 试又可称为数据驱动的测试或输入输出驱动的测试。使用这种测试方法时,将程 序视为一个黑盒子。测试目标和程序的内部机制和结构完全无关,而是将重点集 中在发现程序不按其规范正确运行的环境条件。白盒测试又称为逻辑驱动的测试, 允许检查程序的内部结构。这种测试策略对程序的逻辑结构进行检查,从中获取 测试数据。此外,软件测试的还有静态测试和动态测试两个术语。静态测试是指 测试不运行的部分只是检查和审阅;动态测试是指通常意义上的测试运 行和使用软件。根据是否执行程序划分,黑盒测试和白盒测试可以分为:静态黑 盒测试、静态自盒测试、动态黑盒测试和动态白盒测试。 静态黑盒测试的任务是测试产品说明书。它是利用各种来源的数据诸如 易用性研究、焦点人群、销售收入等建立的。软件测试人员可以利用书面文档进 行静态黑盒测试,认真查找软件缺陷。不深入代码细节的软件测试方法称为动态 黑盒测试。软件测试人员充当用户来使用操作被测软件,由于测试时测试人员不 知道程序如何工作,因此属于动态的黑盒测试。测试工作是进行输入、接受输出、 检验结果。 静态白盒测试是在不执行程序的条件下有条理地仔细审查软件设计、体系结 构和代码,从而找出软件缺陷的过程,又可称为结构分析。进行静态白盒测试的 主要原因是尽早发现软件缺陷,找出动态黑盒测试难以揭示或遇到的软件缺陷。 动态白盒测试是指利用查看代码功能和实现方式得到的信息来确定哪些要测试, 哪些不要测试和如何开展测试。由于测试人员在测试过程中可以查看并使用代码 的内部结构进行设计和执行测试,所以又可称为结构测试。 黑盒测试只能观察软件的外部表现,即使软件的输入输出都正确,也不能说 明软件是正确编码的,因为程序有可能用错误的计算方式得出正确的结果,白盒 测试却能发现程序中的这些隐患;然而单单使用白盒测试只能说明程序代码符合 设计需求,并不能说明程序的功能复合用户的需求。一旦程序的系统设计偏离了 用户需求,即使1 0 0 正确编码的程序也可能不是用户所要的系统。所以,通常在 实际测试中,通常会将黑盒测试和白盒测试的要素结合起来,形成一个合理但并 不一定十分完美的测试策略。 第1 2 页 国防科技大学研究生院学位论文 2 2 2a o p 技术在测试中的应用 在利用a o 技术来进行测试的系统中,对于被测系统而言测试是一种横切关 注点。换而言之,无论是在o o 系统还是a o 系统中,如果测试行为的确是一种横 切关注点,我们便可以将所有的测试功能都封装在一个方面中。 在多数情况下,测试行为需要将辅助代码插入被测系统中,这些新增加的代 码与被测系统紧密绑定在一起,并且散布在整个系统中,形成典型的代码交织和 散布现象。测试代码横切的例子如,在执行某个测试用例之前,被测系统必须处 于一种特定的状态。这是由于测试驱动需要完成测试初始化和测试用例执行等功 能,因此在被测系统中,测试驱动 9 1 需要具有优先访问权。另一种现象是,被测系 统的响应和状态必须遵守测试先知,同样断言也是由测试先知【lo j 提供的。在测试 结束后,这些测试驱动和测试先知必须能够正常地从被测系统中移除,以保证被 测系统的正常功能不受到影响。 传统的测试方法中,为了使得被测系统有自适应性能力,通常会使用一些特 殊的工具来为被测系统提供自动化测试手段。大多数工具的能力仅限于提供一种 测试手段,例如控制流覆盖。比起传统的测试工具采用的方法,a o p 具有更强的 灵活性。方面语言为程序员提供了许多种测试方法的选择,而这

温馨提示

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

评论

0/150

提交评论