http://www.paper.edu.cn-1-一种基于形式规约说明的类测试框架张凯河海大学计算机及信息工程学院,南京(210098)E-mail:hhzkai@163.com摘要:本文给出了一种基于形式规约说明的类测试框架。该框架不仅可以完成对类内部方法的测试,并且可以考察类内部状态改变的正确性,达到完整的单元测试的目的。同时,由于测试用例是从Object-Z规格说明推导出的,而且整体推导过程也是一个形式化的过程,因此提高了测试的可靠性和有效性。关键词:Object-Z;类测试;测试模板;TTF;有限状态自动机中图分类号:TP3111.引言面向对象技术是一种全新的软件开发技术。它能够产生更好的系统结构,更规范的编程风格,极大的优化了数据使用的安全性,提高了程序代码的重用。但是,由于面向对象技术所独有的多态,继承,封装等新特点,产生了传统语言设计所不存在的错误可能性,或者使得传统软件测试中的重点不再显得突出,或者使原来测试经验认为的次要方面成为了主要问题;另外,面向对象软件测试的策略和方法有了很大不同,测试的焦点也从过程构件转移向类。传统的结构化软件测试技术受到了前所未有的挑战,针对面向对象软件的开发特点,应该有一种新的测试模型。类测试是面向对象软件测试过程中的重要组成部分,但由于面向对象技术的自身特点,使它不能直接使用传统的单元测试技术和方法。对于面向对象软件的类测试,由于类的实例化对象有它自己的状态和依赖于状态的行为,对象的方法既受到对象状态的影响,也有可能改变对象的状态。因此,类测试时不能孤立地测试单个成员方法,而是要把方法作为类的一部分,并与对象的状态结合起来,进行对象状态行为的测试。所以类测试中不仅要包括类成员方法的测试还要包括对象状态行为的测试。单独地测试各个方法是不够的,必须针对类中方法的调用序列进行测试。并且在继承的情况下,子类的重定义、新定义和继承的方法组成的方法序列在子类中仍需测试。2.类测试层次Harrold和Rothermel把对类的单元测试分成三个级别[3]:方法内测试(intra-methodtesting)——对单个成员方法的测试;方法间测试(inter-methodtesting)——对公用方法和它直接或间接调用的方法的测试;类内部测试(intra-classtesting)——对类内部公用方法之间的交互进行的测试。类的重要作用之一是信息隐藏,它对类中所封装的属性和方法进行存取,从而避免类中有关信息被错误的使用。对于类中的方法,只能通过发送消息的方式来激活它。由于一个类是不能执行的,因此对一个类的测试实际上是对类的实例化对象的测试。在执行时,一个类可以被实例化成多个对象,各个对象有相同的方法和不同的属性值,类中的各个方法可以由实例化对象以不同的组合顺序激活[4];另一方面,定义类的目的是为了实现某些功能,类的功能一般不能用单一方法来实现,而是通过类中多个方法的相互协作来实现的。此外,在类的实例化对象中,一个方法的正确执行与该对象的当前状态(属性值)密切相关[7],但此时http://www.paper.edu.cn-2-的属性值是由该对象此前各方法的执行历史决定的,也就是说,类中一个方法的完整测试必须与类的方法执行顺序结合起来。3.基于形式规格说明的类测试框架实现机制基于形式规格说明的类测试框架是以测试用例的抽象定义为基础的一种推导和管理测试用例的机制,包括定义测试输入、预测输出、测试结构和测试实例。Stock和Carrington提出的基于形式规格说明的类单元测试模板框架(TTF),可以在详细设计阶段就生成类测试用例[2]。但是其最大的缺点是无法判断在操作序列执行之后,类是否进入正确的状态。在TTF框架下能够生成每个操作对应的测试用例,对类中的操作进行单一的、逐个的测试,属于方法内部静态测试。在类测试中,仅仅对所有的操作进行静态测试是不够的,还需要在类的激活状态下,检验如:操作以不同组合序列调用的正确性、状态迁移的正确性等。本文提出的类测试框架是对TTF框架进一步扩展,使其能够全面、顺序、灵活的产生完整的类测试用例。整个抽象的类测试框架实现如图1所示。图1基于形式规格说明的类测试框架3.1方法内部测试在方法内部测试阶段,使用结构化方法建立测试模板TT(testtem...