面向对象软件测试
面向对象软件的特点及其对测试的影响
面向对象程序三大特征:封装性、继承性、多态性。
封装是指将对象的数据和操作包装在一起,从而使对象具有包含和隐藏信息(如内部数据和代码)的能力。
继承性是指基于现有的类(称为父类或基类)创建新类(称为子类或派生类)的机制。
类为方法提供不同的实现方式,但能够以相同名称调用的功能。
面向对象软件对测试的影响:增加了软件测试的难度;带来了传统软件设计技术所不存在的错误;或者使得传统软件测试中的重点不再显得突出;或者使原来测试经验认为和实践证明的次要方面成为了主要问题。面向对象程序的结构不再是传统的功能模块结构,作为一个整体,原有集成测试所要求的逐步将开发的模块搭建在一起进行测试的方法已成为不可能。
面向对象软件测试的不同层次及其特点
面向对象软件的测试分为4个层次:方法测试、类测试、类簇测试、系统测试。
类测试:
- 内容:检验这个类是否只做规定的事情,确保一个类的代码能够完全满足类的说明所描述的要求。对于设计复杂的类可以简化为几个子类进行测试。
- 方法:代码检查和执行测试用例。
- 构建类测试用例:根据类说明(用OCL表示)确定测试用例和根据类的状态转换图来构建类的测试用例。
- 类测试标准:基于类状态的覆盖率(类的状态转换图)、基于约束的覆盖率(类说明)、基于代码的覆盖率。
- 构建测试驱动程序方法:(1)有条件编译的驱动程序(2)静态方法充当测试驱动程序(3) 建立独立“tester”类。
- 子类的测试:(1)继承的成员函数在子类中做了改动(2)成员函数调用了改动过的成员函数的部分时需要对子类进行测试。
对象交互的测试根据类的类型可以分为原始类测试,汇集类测试和协作类测试。原始类:简单的、独立的类;汇集类:汇集类在其说明中使用对象,但是实际上从不请求这些对象的服务。汇集类往往存放这些对象的引用(或指针),实现这些对象的实例的创建或删除。协作类测试:不是汇集类的非原始类。
汇集类测试:使用测试原始类的方法来测试汇集类;汇集类的测试目的主要保证那些实例被正确加入集合和被正确的从集合中移出,以及测试用例说明的集合对其容量有所限制。
协作类测试。
面向对象的集成测试的步骤:先进行静态测试,再进行动态测试。静态测试一般利用测试软件的”可逆性工程“功能,通过源程序得到类关系图和函数功能调用关系图,检测程序结构和程序的实现是否有缺陷、是否达到了设计要求。动态测试步骤:(1)先选定检测的类,仔细给出类的状态和相应的行为、类或成员函数间传递的消息、输入或输出的界定等。(2)确定覆盖标准。(3)利用结构关系图确定待测类的所有关联。(4)根据程序中类的对象构造测试用例,确认使用什么输入激发类的状态、使用类的服务和期望产生什么行为等。
面向对象的集成测试常用的测试技术:抽样测试;正交阵列测试。
面向对象的系统测试
与传统的软件测试无区别。
面向对象软件测试模型
面向对象的开发模型将开发分为面向对象分析(OOA)、面向对象设计(OOD)和面向对象编程(OOP)3个阶段。因此面向对象的软件测试分为面向对象分析的测试、面向对象设计的测试和面向对象编程的测试。
面向对象分析的测试(OOA Test)
面向对象分析(OOA):把E-R图和语义网络模型(即信息造型中的概念)与面向对象程序设计语言中的重要概念结合在一起而形成的分析方法,最后得到问题空间的图表的形式描述。OOA的结果为后面阶段类的选定和实现、类层次结构的组织和实现提供平台。OOA的测试重点在其完整性和冗余性。
OOA阶段的测试分为五个方面:(1)对认定的对象的测试(2)对认定的结构的测试(3)对认定的主题的测试(4)对定义的属性和实例关联的测试(5) 对定义的服务和消息关联的测试。
- 对认定的对象的测试:认定的对象是否全面?认定的对象是否具有多个属性?只有一个属性的对象不能抽象为独立的对象;认定为同一对象的实例是否有共同的、区别于其他实例的共同属性?认定为同一对象的实例是否提供或需要相同的服务?如果服务随着不同的实例而变化,认定的对象就需要分解或利用继承性来分类表示;认定的对象是否有必要?对象代表的实例信息应在系统中持续保持,且为系统提供或从系统得到关于它的服务;认定的对象的名称是否准确、适用?
- 对认定的结构的测试:结构指多种对象的组织方式,分为分类结构和组装结构。分类结构体现了问题空间中实例的一般与特殊的关系,组装结构体现了问题空间中实例整体与局部的关系。
(1)分类结构的测试: 高层的对象能否派生出下一层对象?低层对象能否抽象出高一层对象? 所有的对象能否抽象出在现实中有意义的对象?高层的对象的特性是否完全体现下层的共性?低层的对象是否有高层特性基础上的特殊性?
(2)组装结构的测试:整体(对象)和部件(对象)的组装关系是否符合现实的关系?整体的部件是否有实际应用?整体中是否遗漏了有用的部件?部件能否组装新的有现实意义的整体? - 对认定的主题的测试:主题是在对象和结构的基础上更高一层的抽象。测试内容::是否贯彻“7+原则?主题个数超过7个时对主题进行归并;主题所反映的对象和结构是否具有相同和相近的属性以及服务?主题是否是对象和结构的抽象,是否便于理解OOA结果的概貌?主题间的消息联系是否代表了其所反映的对象和结构之间的所有关联?
- 对定义的属性和实例关联的测试:属性是描述对象或结构所反映的实例的特性,实例关联是反映实例集合间的映射关系。测试内容::属性是否适用于对应的对象和分类结构的现实实例?属性是否与对应的实例关系密切?属性能否依赖于其他属性被独立理解?属性在分类结构中的位置是否恰当,低层对象的共有属性是否在上层对象属性体现?对象的属性是否完整?实例关联是否符合现实?实例关联是否定义完整?特别需要注意“1-多”和“多-多”的实例关联。
- 对定义的服务和消息关联的测试:服务指对象和结构所要求的行为。测试内容:对象和结构在不同状态下是否定义了相应的服务?对象或结构所需要的服务是否定义了相应的消息关联?定义的消息关联所指引的服务提供是否正确?沿着消息关联执行的线程是否合理?是否符合现实过程?定义的服务是否重复?是否定义了能够得到的服务?
面向对象设计的测试(OOD Test)
OOD是对OOA的进一步细化和更高层的抽象。OOD通过对类或结构的重新组合或适当的补充,以方便实现功能的重用和扩增,不断适应用户的要求。OOD阶段的的测试分为3个方面:(1) 对认定的类的测试(2)对构造的类层次结构的测试(3)对类库的支持的测试。
- 对认定的类的测试:类是否涵盖了OOA中所有对象?类是否能体现OOA中定义的属性?类是否能实现OOA中定义的服务?类是否对应一个明确的数据抽象?类是否尽可能少地依赖其他类?类中的方法是否只有单用途?
- 对构造的类层次结构的测试:类层次结构是否涵盖了所有类?类层次结构是否能体现OOA中定义的实例关联?类层次结构是否能实现OOA中定义的消息关联?子类是否具有父类没有的新特性?子类间的共同特性是否完全在父类中得以体现?
- 对类库的支持的测试:并不直接影响当前软件的开发和功能实现,主要作为对高质量类层次结构的评估。子类中对含义基本相同的操作,是否有相同的接口?类中方法功能是否单纯,相应实现的代码行是否较少?类的层次结构是否是深度大、宽度小?
面向对象编程的测试(OOP Test)
面向对象编程的测试主要集中两个方面:数据成员是否满足数据封装的要求?类是否实现了要求的功能?