面向对象的软件单元测试概述
使集成测试目标清晰)
以方法为单元还是以类为单元,根据具体环境确 定最适合的方法。
“操作”是指类函数定义,“方法”指其实现。
面向对象的单元测试-以方法为单元
传统的单元测试是针对程序的函数、过程或完成某一特定 功能的程序块。单独的看待类的成员函数,与面向过程程 序中的函数或过程没有本质的区别,传统的测试方法在面 向对象单元测试中都可使用,如等价类划分法、因果图法、 边值分析法、逻辑覆盖法、路径分析法等等。
采用这四个概念开发的软件系统是面向对象的。
面向对象技术
面向对象方法的出现,实际上是程序设计 方法发展的-个返朴归真过程。
面向对象的实质:
❖ 从系统的组成上来进行分解。对问题自然分割, 利用类及对象作为基本构造单元,以更接近人 类思维的方式建立问题域模型,从而使设计出 的软件尽可能直接地描述现实世界,构造出模 块化的、可重用的、可维护性好的软件,并能 控制软件的复杂性降低开发维护费用。
面向对象的软件单元测试概述
技术创新,变革未来
面向对象的基本概念
对象 类 消息 接口 封装 继承 多态
面向对象的基本概念
Peter Coad 和 Edward Yourdon 提出下列等式认 识面向对象方法: 面向对象 = 对象(Object) + 分类(Classification) + 继承(Inheritance) + 通过消息的通信 (Communication with message)
面向对象编程的特性使得对成员函数的测试又不完全等同 于传统的函数或过程测试。不再孤立地测试单个操作,而 是将操作作为类的一部分。尤其是继承特性和多态特性, 使子类继承或重载的父类成员函数出现了传统测试中未遇 见的问题。考虑如下两个问题:
(1)继承的成员函数是否都不需要测试? (2)对父类的测试是否能照搬到子类?
➢例
Base::Redefined()含有如下语句:
If (value<0) message(“less”); else if (value==0) message(“equal”); else message续) 在Derived::Redefined()中定义为: If (value<0) message(“less”); else if (value==0) message(“It is equal”); else { message(“more”); if (value==88) message(“luck”); } …… 在原有对父类Base的测试上,对Derived::Redefined()
对象
对象——是指包含了一组属性以及对这些属性的操作的封 装体。
对象之间存在着一定的关系,对象之间的交互与合作构成 更高级的行为。
❖对象间的由分解所构成的关系,part of层次;
❖具王有五代表由一他种的一头般、特性胳的膊对、象腿之和间的身聚体合组关成系,is a层次; ❖代汽表车更一是般一的种对交象通间在工物具理上或概念上有关的相关关系。
的测试只需作如下改动:将value==0的测试结果期望改动; 增加value==88的测试。
设计测试用例需要能够实例化的“桩”类和起驱动器 作用的“主程序”类;
方法一般比较简单,复杂度较低;
创建桩工作量较大;
测试工作主要集中在集成测试:类内和类间;
例:o-oCalendar的伪代码: 1. CalendarUnit类:两个操作(设置取值和标志) 2. Testlt类(测试驱动器) 3. Date类(获取日期,计算下一日期并打印日期) 4. Day类(设置/获取日期) 5. Month 类(设置/获取月份及天数) 6. Year类(设置/获取年份及闰年判别)
面向对象的单元测试(续)
继承的成员函数是否都不需要测试? 对父类中已经测试过的成员函数,以下两种情况需要
在子类中重新测试: a)继承的成员函数在子类中做了改动; b)成员函数调用了改动过的成员函数的部分。
➢ 例:假设存在父类Base有Inherited()和Redefined()这两 个成员函数,继承父类Base的子类Derived只对Redefined() 做了改动。那么,Derived::Redefined()就需要重新测试; 对于Derived::Inherited(),若它包含了调用Redefined() 的语句 (比如:x=x/Redefined()),就需要重新测试, 否则就不需要。
Testlt类和Date类
Date.increment 8
testIt Date.constructor
1
4
2
5
3
6
7
9
10 11 12 15 13 16 14 17
Date.printDate 19 20
18
Day类
Day.constructor
21
22
Day.setCurrentPos
a
Day.setDay
人乘坐或驾驶汽车 对象是软件开发期间测试的直接目标。 面向对象软件测试所关注的焦点: (1)对象的行为是否符合它的规定说明; (2)该对象与和它相关的对象是否协同工作。
面向对象的单元测试
面向对象测试的单元定义
1. 可以编译执行的最小软件组件;(和传统测试一样,但 放弃了封装的特点)
2. 由一个设计人员开发的软件组件; 3. 只包含单一操作或方法的类或子类。(设计用例方便,
面向对象的单元测试(续)
对父类的测试是否能照搬到子类?
引用前面的假设,成员函数Base::Redefined()和 Derived::Redefined()已经是不同的。那么,按理应该要 对Derived::Redefined()重新测试分析,设计测试用例。 但是由于面向对象的继承使得两个函数相似,故只需要在 对Base::Redefined()的测试要求和测试用例上添加对 Derived::Redefined()新的测试要求和增补相应测试用例。
b
23
23
24
Day.getDay
26 27
Day.increment
28 29
25
30
31 32
33
Month类的程序图