面向对象的软件测试技术

软件评测师教程(第7章):面向对象的软件测试技术 目录软件评测师教程(第7章):面向对象的软件测试技术1 面向对象概述2 面向对象技术2 1 什么是对象和类2

软件评测师教程(第7章):面向对象的软件测试技术

1 面向对象概述

OOP(面向对象编程)减少了编写代码的总量,却不一定提高了软件的质量。例如,某个类被修改了,那么所有依赖该类的代码都必须重新测试。因此就需要一些新的测试理念和测试方法了。

2 面向对象技术

2.1 什么是对象和类

对象:万物皆对象
类:实现抽象类型的工具
实例:类的某一个具体实现
过程式编程语言:程序=算法+数据
面向对象编程语言:程序=对象+消息

2.2 封装,继承和多态

  • 封装:把数据和操作结合为一体,构成的一个具有类类型的对象的描述。使程序更加紧凑,同时避免数据紊乱带来的调试和维护的困难。
  • 继承:增加了程序的可扩充性,并为代码重用提供了强有力的手段。
  • 多态:使程序员在设计程序时可以对问题进行更好的抽象,易设计出重用性和维护性俱佳的程序。

封装的特点:

  1. 一个对象应具有明确的功能,并且有一个或几个接口以便和其他对象相互作用。
  2. 对象的内部实现(数据和操作)是受保护的,外界不能访问它们。只有对象中的代码才能访问该对象的内部数据。这称为数据隐藏。
  3. 封装简化了程序员对对象的使用,只需要输入是什么,输出是什么,而对类内部进行了什么操作不必追究。

继承的特点

  1. 继承可以从一个类派生另一个类
  2. 派生的类继承了其子类和祖父类的数据成员和成员函数。
  3. 派生类可以增加新的属性和新的操作。
  4. 派生类继承的成员函数不合适时可以不用。

多态的特点

  1. 多态性就是多种表现形式
  2. 一个对外接口,多种表现形式
  3. 多态的实现,一般通过在派生类中重定义基类的虚函数来实现。(C++的虚函数)

由于面向对象软件独有的多态、继承、封装等特点,使OOP程序设计比传统语言设计产生错误的可能性更大。因此也需要一种面向对象的测试模型。

3 面向对象测试模型

面向对象的开发模型突破了传统的瀑布模型,将开发分为面向对象分析(OOA),面向对象设计(OOD),面向对象编程(OOP)三阶段。

结合传统的测试步骤的划分,我们把面向对象的软件测试分为:面向对象分析的测试,面向对象设计的测试,面向对象编程的测试,面向对象单元测试,面向对象集成测试,面向对象确认和系统测试。

4 面向对象软件的测试策略

4.1 OOA的测试

把E-R图和语义网络模型,即信息造型中的概念,与面向对象程序设计语言中的重要概念结合在一起而形成的分析方法。

  1. 对认定的对象测试:对象是否全面等
  2. 对认定的结构测试:分类结构和组装结构
  3. 对认定的主题测试
  4. 对定义的属性和实例关联的测试
  5. 对定义的服务和消息关联的测试

4.2 OOD的测试

以OOA为基础归纳出类,并建立类结构或进一步构造成类库,以实现分析结果对问题空间的抽象。OOD归纳的类即可以是对象简单的延续,也可以是不同对象的相同或相似的服务。因此OOD是OOA进一步细化和更高层的抽象。

  1. 对认定的类测试
  2. 对构造的类层次结构的测试
  3. 对类库的支持的测试

4.3 OOP的测试

面向对象程序是把功能的实现分布在类中,能正确实现功能的类,通过消息传递来协同实现设计要求的功能。正是这种面向对象程序风格,将出现的错误能精确地确定在某一具体的类。因此,在面向对象编程(OOP)阶段,忽略类功能实现的细则,将测试的目光集中在类功能的实现和相应的面向对象程序风格上,主要体现为两个方向(假设编程语言为C++)。

  • 数据成员是否满足数据封装的要求

基本原则:数据成员是否被外界(数据成员所属的类或子类以外的调用)直接调用。即改变数据成员的结构时,是否影响了类的对外接口,是否会导致相应的外界必须改掉。
注意点:有时强制类型转换会破坏数据的封装特性。

  • 类是否实现了要求的功能

类所实现的功能都是通过类的成员函数执行的,测试类的功能实现时,应该首先保证类成员函数的正确性。可以用单元测试进行验证。
类成员函数见的作用和类之间的服务调用时单元测试无法确定的,因此需要进行面向对象的集成测试。

4.4 面向对象的单元测试

一些传统的测试方法在面向对象的单元测试中都可以使用。如等价类划分法,因果图法,边界值分析法,逻辑覆盖法、路径分析法,程序插装法等。难度较小,一般由程序员完成。

4.5 面向对象的集成测试

对OO软件的集成测试有两种不同的策略,第一种称为基于线程的测试(thread based testing);第二种称为基于使用的测试(use based testing)。

面向对象的集成测试分为两步:先进行静态测试,再进行动态测试。

静态测试主要针对程序的结构进行,检测程序结构是否符合设计要求。通过源程序得到类关系图和函数功能调用关系图。
动态测试设计测试用例时,需要上述的功能调用结构图、类关系图或者实体关系图,确定不需要重复测试的部分,从而优化测试用例,减少测试工作量,使得进行的测试能够达到一定覆盖标准。
覆盖标准是:

  • 达到类所有的服务要求或服务提供的一定覆盖率;
  • 依据类间传递的消息,达到对所有执行线程的一定覆盖率;
  • 达到类的所有状态的一定覆盖率;
  • 使用现有工具来得到程序代码执行的覆盖率。

具体的设计用例的步骤:
1)先选定检测的类,确定出类的相应状态、相应行为,类和成员函数间传递的消息,输入或输出的界定。
2)确定覆盖标准
3)利用结构关系图确定待测类的所有关联
4)根据程序中类的对象构造测试用例,确认什么输入激发类的状态,使用类的服务和期望产生什么行为等。
5)设计异常输入,确定是否有不合法的行为发生等。

4.6 面向对象软件的确认和系统测试

尽量搭建与用户实际使用环境相同的测试平台,应该保证被测系统的完整性,对暂时没有的系统设备部件,应采用相应的模拟手段。
OO软件确认和系统测试具体的测试内容与传统系统测试基本相同,包括:功能测试、强度测试、性能测试、安全测试、恢复测试、易用性测试、安装/卸载测试等。

5 面向对象软件测试用例设计

关注于设计合适的操作序列以测试类的状态。

Berard提出了一些测试用例的设计方法,主要原则如下:

  • 对每个测试用例应当给予特殊的标识,并且还应当与测试的类有明确的联系。
  • 测试目的应当明确。
  • 应当为每个测试用例开发一个测试步骤列表,列表包含以下内容
  1. 列出所要测试的对象的专门说明
  2. 列出要做为测试结果运行的消息和操作
  3. 列出测试对象可能发生的例外情况
  4. 列出外部条件
  5. 列出为了帮助理解和实现测试所需要的附加信息。

5.1 传统测试用例设计方法的可用性

尽管OO软件的局限性、封装性、信息隐藏、继承性和对象的抽象这些特性使得测试用例设计带来了额外的麻烦和困难,但是黑盒测试技术不仅仅适用于传统软件,也适用于OO软件测试。白盒测试也用于OO软件类的操作定义。

5.2 基于故障的测试

5.3 基于场景的测试

5.4 OO类的随机测试

5.5 类层次的分割测试

5.6 由行为模式(状态、活动、顺序和合作图)导出的测试