当前位置:文档之家› 第6章面向对象的软件测试

第6章面向对象的软件测试


6,为了保证软件的功能完整性,除了单元测试 和集成测试,还必须经过规范的系统测试.
6.1.1信息隐蔽对测试的影响 6.1.1信息隐蔽对测试的影响
类的重要作用之一是信息隐蔽.它对类中所 封装的信息的存取进行控制,从而避免类中有关 实现细节的信息被错误地使用.该隐蔽机制给测 试带来了困难.
6.1.2封装和继承对测试的影响 6.1.2封装和继承对测试的影响
public AbstractExampleTester(){ super(argumentname); } public Example newObject(argumentname){ return new AbstractExample_Inner(); } public void testAbstractExample_Inner(){ …… } …… }
C lass_A
+operation1() +operation2()
C lass_B
+operation3()
C lass_C
图 6 6 类 之 间 的 继 承 关 系
Class_A类有两个实例 方法operation1()和op eration2(),Class_B 类继承了Class_A类并 且实现了新的实例方法 operation3(),Class_ C类继承了Class_B类, 覆盖了Class_B类的实 例方法operation3()和 实例方法operation2().
1,类本身的复杂程度 2,类在整个系统中的层次 3,开发该类测试驱动程序需要投入的成本 4,类本身的风险程度
6.2.3类测试用例设计 6.2.3类测试用例设计
一般基于如下3个标准设计测试系列,即基 一般基于如下3个标准设计测试系列, 于状态的覆盖率, 于状态的覆盖率,基于限制的覆盖率和基于代码 的覆盖率. 的覆盖率. 设计测试用例的方法有多种: (例子详见教材) 1,根据前置和后置条件确定测试用例
/* AbstractExample.java *创建日期: *创建人员: *修改日期: *修改人员: */ package applet.unedu.tlpe.test; public abstract class AbstractExample implements Example{ …… public AbstractExample(){ …… } …… }
+operation2() +operation3()
+testoperation2() +testoperation3()
图6-7 类测试用例的构建
二,接口类测试 对类进行测试时需要构建可执行的类实例,而 接口不存在任何构造方法无法被实现. 由于接口一定会在某个类中实现,因此就使 用一个实现接口的类来做测试.遵循以下原则: 如果接口没有被任何类实现就无需进行测试. 如果已被别的类实现,那么就针对实现该接口 的类进行测试. (如下图6-8)
ClassName Attributes Operation() 具体类
ClassName Attributes Operation() 抽象类 图6-1 类 UML 接口类 Interface Operation()
类之间的关系分为六类,分别是关联,泛化,实 现,依赖,聚合和组合.每种关系分别使用不同的 符号来表示(如:表6-1所示),并分别用私有的, 保护的和公有的三个关键字来修饰类(如:表6-2所 示).
表6-1 UML类图符号描述
6-2 UML类图
关键词 私有 保护 公有 # + UML符号 说明有的关联对象都是可见的
6.2.2类测试的价值 类测试的价值
选择将每个类作为一个单元进行单独的测试,还 是将其同其他类绑定进行集成测试,需要使用如下3 个要素来进行测试价值的评估:
2,如果抽象类被具体类继承,那么,在创建该 具体类的测试驱动程序时要继承抽象类的测试驱 动程序,在以后的回归测试中,只要执行最低层 的测试类,就可以对其父测试类重新执行一次测 试,同时将测试结果分别返回. 四,重载和覆盖测试 覆盖是在子类中重新定义了从父类中继承的 同名方法;重载与覆盖不同,不是子类对父类同 名方法的重新定义,而是类对自身已有的同名方 法的重新定义. 在测试过程中,可以参考如下两个原则: ① 要对类实例方法的所有重载形式分别进行测试.
/* AbstractExampleTester.java *创建日期: *创建人员: *修改日期: *修改人员: */ package applet.unedu.tlpe.test; public abstract class AbstractExampleTester extends TestCase{ static class AbstractExample_Inner extends AbstractExample{ public AbstractExample_Inner(){ super(argumentname); } }
6.2 类测试基础
1,类测试概念:验证类的实现是否和该类的说明 类测试概念 完全一致. 类测试的方法:通过代码检查或执行测试用例 2,类测试的方法 的方法来有效地进行类测试.(后者优于前者).
3,类测试人员 类测试通常由开发人员来进行;(会带来好处 和不足之处). 4,类测试时间 类的测试伴随着开发过程中的各个阶段,当 类的说明或实现发生变化时应该执行回归测试. 5,类测试过程 为类创建实例-->创造适当的环境-->运行测 试用例(向一个实例发送一个或多个消息)-->通过 参数来检查测试运行的结果-->清除执行测试用例 所需的测试环境.
第六章 面向对象软件的测试
[本章要点] 本章要点]
面向对象软件的测试与传统软件的区别; 类测试价值的评估方法; 类测试用例设计方法; 特殊类的测试方法; 划分面向对象软件测试的方法; 开源工具Junit的使用方法.
[本章目标] 本章目标]
了解面向对象的测试与传统软件测试的异同; 掌握类测试的基础知识; 重点理解针对抽象类以及接口类等特殊类的测试 技巧,设计类测试用例和测试驱动程序的几种方 法; 初步了解Junit,并掌握安装和卸载此工具的方 法,以及如何使用它进行简单的测试.
Class_A
Class_A_TestCase
+operation1() +operation2()
+testoperation1() +testoperation2()
Class_B
Class_B_TestCase
+operation3()
+testoperation3()
Class_C
Class_C_TestCase
编写类测试驱动程序的方法有很多种 ,以Jav a语言为例来说明测试驱动程序设计的结构. (主要以两票系统为例讲解,详见教材) 1,在main方法中写入需要运行的测试用例,即 实现main方法,然后编译,执行该类. 2,在类中实现一个静态测试方法,通过调用该测 试方法来收集每个测试用例的执行结果. 3,实现独立的测试类,它的职责是执行并收集每 个测试用例的结果.
6.3类测试的延伸 6.3类测试的延伸
本节将简要介绍类测试构造思想以及如何对接 口类,抽象类等进行测试的方法. 一,继承层次结构中类的测试 继承是实现接口和代码复用的有效机制.根 据继承机制的特点,父类中被测试用例所测试的 代码被子类继承,只要父类代码没有被子类"覆 盖",那么就不用重新创建这些测试用例. 图6-6显示了各类之间的继承关系:
Interface_A
Class_C_TestCase
+a_method() +b_method()
Class_C +Class_C +a_Method() +b_Method() +c_Method()
+Class_C_TestCase() +a_Method() +b_Method() +c_Method() +newObject() +testA_Method() +testB_Method() +testB_Method()
6.2.4类测试驱动程序设计 6.2.4类测试驱动程序设计
2,根据状态转换确定测试用例 3,根据访问控制修饰符(限定类,属性或方法 被程序里的其他部分访问和调用的修饰符)来 确定测试用例. 从开发的角度:测试驱动的基本思想是在对设计 之前先考虑好测试代码; 从测试的角度:为了执行测试,运行测试用例, 找出软件中隐藏的BUG. 因此,测试驱动程序的构建应该简单,透明, 易维护,能够提供尽可能多的服务,同时兼顾 自增量更新,更理想的情况就是能够复用已存 在的测试驱动程序的代码.
+operation2() +operation3()
根据图6-6中这三个类之间的区别,可以确定继承 的测试用例中是否需要产生新的子类测试用例, 哪些测试用例适用于测试子类,哪些测试用例在 测试子类中不必执行,如下表6-7所示:
类 Class_A 继承类 类方法 operation1() operation2() operation1() Class_B Class_A operation2() operation3() operation1() Class_C Class_B operation2() operation3() False False True False True True False False True False True True 是否改变 是否增加测试用例
由此,可以得出继承层次结构中类测试的测 试用例可以采用如下增补原则: 1)如果子类新增了一个或者多个新的操作,就需 要增加相应的测试用例. 2)如果子类定义的同名方法覆盖了父类的方法, 就需要增加相应的测试用例. 那么,在具体构建类测试用例时可以采用如 图6-7所示的结构.对于基类我们要全部测试, 底层的测试类可以对其父类的测试方法回归.
相关主题