文档介绍:软件测试培训(二)
冯子亮
四川大学计算机学院
2016-7-2
一、ATM程序静态测试
二、ATM程序动态测试
目录
类之间的调用关系
一、ATM程序静态测试
ATM
Bank
BaseDisplay
Account
Account
ATM中各类的定义
方式:
对照检查单,对代码进行检查
示例检查项
类的数据成员的初始化工作放在构造函数中,把清除工作放在析构函数中。
静态测试-手动
类的数据成员的初始化工作
来源说明:《高质量C++编程指南》“第9章类的构造函数析构函数与赋值函数”
根据经验,不少难以察觉的程序错误是由于变量没有被正确初始化或清除造成的,而初始化和清除工作很容易被人遗忘。
Stroustrup 在设计C++语言时,充分考虑了这个问题并很好地予以解决
把对象的初始化工作放在构造函数中,把清除工作放在析构函数中。
当对象被创建时,构造函数被自动执行;当对象消亡时,析构函数被自动执行。
简称初始化表
构造函数有个特殊的初始化方式叫“初始化表达式表”;位于函数参数表后,函数体{} 之前。
这说明该表里的初始化工作发生在函数体内的任何代码被执行之前。
构造函数初始化表的使用规则:
如果类存在继承关系,派生类必须在其初始化表里调用基类的构造函数。
类的const 常量只能在初始化表里被初始化,因为它不能在函数体内用赋值的方式来初始化
类的数据成员的初始化可以采用初始化表或函数体内赋值两种方式,这两种方式的效率不完全相同。
非内部数据类型的成员对象应当采用第一种方式初始化,以获取更高的效率。
对于内部数据类型的数据成员而言,两种初始化方式的效率几乎没有区别,但后者的程序版式似乎更清晰些。
编译,运行ATM,是一个空框架
在其中添加我们的测试代码testATM()
void testAtm()
{
Account ount;
}
运行代码, 程序正常
Account类检查
上述代码,使用了默认构造函数
检查发现,Account类三个成员变量,使用默认构造函数,只初始化了2个
剩下的myPassword,使用了默认的类string构造
问题:对于非内部数据类型,最好使用初始化列表方式初始化myPassword
包含一个vector,以及一个vector计数
问题:析构时vector没有删除
Bank类检查
三个成员变量
Account* ount;
Bank* myBank;
BaseDisplay* myDisplay;
仅仅初始化了2个
myBank = bank;
myDisplay = display;
编写测试代码
Bank myBank;
Account *a1 = ();
a1->setPassword("123");
a1->deposit(99);
BaseDisplay b;
ATM myAtm(&myBank, &b);
(1,"123");
(ATM::REQUEST_BALANCE,0);
ATM类检查