面向对象技术产生了更好的系统结构,更规范的编码风格,它极大地优化了数据使用的安全性,提高了程序代码的可重用性,使得一些人就此认为面向对象技术开发出的程序无须进行测试。应该看到,尽管面向对象技术的基本思想保证了软件应该有更高的质量,但实际情况却并非如此;因为无论采用什么样的编程技术,编程人员的错误都是不可避免的,而且由于面向对象技术开发的软件代码重用率高,错误的重复发生概率也会更高,更需要进行严格的测试,以避免错误的大量重现。本文介绍Date.increment方法的测试。
01、类说明
CRC(Class-Responsibility-Collabortor,类—责任—协作者)是目前比较流行的面向对象的分析建模方法。在CRC建模中,用户、设计者、开发人员都将参与其中,完成对整个面向对象工程的设计。
CRC卡是一个标准的索引卡集合,包括3个部分,即类名、类的职责、类的协作关系,每一张卡片都将表示一个类。类名是卡片所描述类的名字,被写在整个CRC卡的最上方;类的职责包括这个类对自身信息的了解,以及这些信息将如何运用,这部分将被写在CRC卡的左边;类的协作关系指代另一些与当前类相关的类,通过这些类可以获取想要的信息或者进行相关操作,这部分被写在CRC卡的右边。
在测试本方法时,应先使用“类—责任—协作者”(CRC)卡对Date类进行说明,然后根据Date类的伪代码分析出程序图如图1所示。
■ 图 1 testIt 和 Date 类的程序图
类CalendarUnit提供了一个方法自其继承的类中设置取值,并提供了一个布尔方法说明其继承类中的属性是否可以增1,其伪代码如下。
class CalendarUnit(
//abstract class
int currentpos;
CalendarUnit(pCurrentpos)
currentpos = pCurrentpos;//结束 CalendarUnit
setCurrentpos(pCurrentpos)
currentpos = pCurrentpos;//结束 setCurrentpos
abstract protected Boolean increment();
}
要测试Date.increment方法需要开发类testIt用作测试驱动,即创建一个测试日期对象,然后请求该对象对其本身增1,最后打印新值,其伪代码如下。
class testItl
main()(
testdate = instaniate Date(testMonth,testDay,testYear);
Testdate.increment();
Testdate.printDate();
//结束 testIt
下面给出Date类的CRC卡中的信息,如表2所示。
■ 表2 Date类的CRC卡
Date类的伪代码如下。
class Date{
private Day d;
private Month m;
private Year y;
public Date( int pMonth,int pDay,int pYear){
y = instaniate Year(pYear);
m = instaniate Month(pMonth,y);
d = instaniate Day(pDay,m);
)//结束 Date构造函数
increment()
if(!d.increment()){
if(!m.increment())
y.increment();
m.setMonth(1,y);
else
d.setDay(1,m);
//结束 increment
printDate()
System.out.println(m.getMonth() +"/" + d.getDay() + "/"+ y.getYear());
}//结束 printDate
}//结束 Date
testIt类和Date类的程序图如图2所示。
■ 图 2 testIt 和 Date 类的程序图
02、设计测试用例
正如黑盒测试部分介绍的那样,等价类测试是逻辑密集单元的明智选择。Date.increment操作处理日期的3个等价类如下。
D1={日期:1≤日期<月的最后日期}。
D2={日期:日期是非12月的最后日期}。
D3={日期:日期是12月31日}。
实际上,对应Date.increment程序图有3条路径。
path1:9-10-18。
path2:9-10-11-12-13-14-17-18。
path3:9-10-11-15-16-17-18。
它们构成了Date.increment的基路径,不难算出Date.increment程序图的圈复杂度为3。另外,这些等价类看起来是松散定义的,尤其是D1,其引用了没有月份说明的最后日期,即没有指明是哪个月份。这样,问题又进一步被转化为Month.increment方法的测试。