论文部分内容阅读
面向方面开发在继承面向对象开发方法的基础之上,采用方面单元对问题领域中的横切关注点进行了模块化封装,提高了系统的可理解性和可维护性,降低了开发成本。但是,面向方面软件仍然由人工实现并可能存在缺陷,需要有效的面向方面测试技术来找出软件中存在的缺陷。与面向对象技术不同,面向方面语言增加了新的语言部件,面向方面软件的行为具有多量化等特征,对面向方面程序的测试研究提出了新的挑战。围绕面向方面软件的方面单元测试技术,重点对方面单元内的介入点进行了相关的测试研究。从单元缺陷类型、介入点的谓词模型、缺陷检测条件和测试充分性准则、测试方法以及测试实现和支持工具等五个方面对方面单元测试技术进行了系统探讨。缺陷模型能够提供测试的目标。由于通过测试来证明被测程序行为的正确性存在理论上的困难,因此有效的测试技术几乎都与一定的缺陷模型有关,可以称为面向缺陷模型的测试。面向缺陷模型的测试,是为了检测特定类型的缺陷是否存在于被测程序之中。测试的有效性很大程度上取决于缺陷模型定义的合理性。缺陷模型中各种缺陷类型按照缺陷位置和特征进行分类,从每种缺陷类型的特征、外部表现,测试可行性分析三个角度进行了深入研究,分离出在单元测试阶段能够检查的缺陷类型,为后续的单元可测模型的构造提供了可靠的基础。被测对象的可测表示是提出测试技术的依据。介入点测试是面向方面程序单元测试的核心问题之一。介入点的语义是在程序的连接点全集中筛选一个预期的连接点子集,因而采用谓词模型给出了介入点的可测表示,包括介入点规约的谓词表示和介入点实现的谓词表示。介入点规约表示为一个预期匹配的连接点集合,则非预期连接点集合等于规约对应连接点集合的补集。介入点实现表示成以连接点属性匹配函数为布尔原子项的布尔表达式,包括介入点的积项和与和项积。介入点的谓词模型支持介入点的静态测试和动态测试。缺陷检测的充要准则和测试用例生成的充分准则是测试方法的理论基础。静态介入点测试采用穷尽测试策略;动态介入点测试采用选择测试策略。穷尽测试策略依赖于缺陷检测的充要准则;选择测试策略依赖于测试用例生成的充分性准则。基于介入点的可测谓词模型,经过证明的缺陷检测充要条件构成了穷尽测试的基础,动态测试域约简的相关定理的证明为约简测试域提供了可靠依据,而测试用例生成的充分性准则指导着动态测试域的选择测试。将介入点划分为静态介入点和动态介入点,并分别进行测试。在静态介入点的测试过程中,首先把被测介入点的规约表示为介入点定义形式,然后与被测介入点实现进行逻辑组合产生测试用例,接着调用面向方面语言编译器执行编译织入完成测试执行,最后通过对织入后字节码的分析获得静态介入点的匹配结果。动态介入点的测试需要对织入后模块进行动态测试,其难度在于动态测试域太大。为了解决这个问题,对动态介入点采用两阶段测试方法:第一阶段进行介入点的静态部分测试并且基于提出的连接点流图采用静态分析获得约简后的动态测试域,其代价较小;第二阶段是在动态测试域内执行动态测试,并通过基于连接点流图的结点覆盖、边覆盖和路径覆盖等充分性准则指导测试用例生成。通过实验表明测试方法具有适用性和有效性。基于AspectJ程序的单元测试原型工具AJUTester提供了对方面单元的测试支持。AJUTester支持介入点测试和通知测试。用户提供被测介入点的介入点规约的表示后,AJUTester可以自动执行静态介入点的测试,可以自动约简介入点的动态测试域,并基于连接点流图对约简后测试域中的测试输入进行覆盖度测量,从而辅助测试人员优化测试用例集。对通知的测试类似于对方法模块的测试。实验表明支持工具AJUTester具有一定实用性。