面向对象的软件测试案例 | Date.increment方法的测试

举报
TiAmoZhang 发表于 2023/12/15 10:51:41 2023/12/15
【摘要】  面向对象技术产生了更好的系统结构,更规范的编码风格,它极大地优化了数据使用的安全性,提高了程序代码的可重用性,使得一些人就此认为面向对象技术开发出的程序无须进行测试。应该看到,尽管面向对象技术的基本思想保证了软件应该有更高的质量,但实际情况却并非如此;因为无论采用什么样的编程技术,编程人员的错误都是不可避免的,而且由于面向对象技术开发的软件代码重用率高,错误的重复发生概率也会更高,更需要进行严格

 面向对象技术产生了更好的系统结构,更规范的编码风格,它极大地优化了数据使用的安全性,提高了程序代码的可重用性,使得一些人就此认为面向对象技术开发出的程序无须进行测试。应该看到,尽管面向对象技术的基本思想保证了软件应该有更高的质量,但实际情况却并非如此;因为无论采用什么样的编程技术,编程人员的错误都是不可避免的,而且由于面向对象技术开发的软件代码重用率高,错误的重复发生概率也会更高,更需要进行严格的测试,以避免错误的大量重现。本文介绍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方法的测试。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。