代码的重点在于success = GetTemperature(&temperature);,这行代码调用GetTemperature()取环境温度,如果操作成功,success等于1,操作不成功,success等于0;取得的环境温度保存在局部变量int temperature中。假设在实际环境中测试,调用的都是实际代码。我们首先要设定预期的温度gExpectTemperature,例如设为25,这是全局变量,容易做到。我们还要测试各种环境温度下程序的行为,例如,至少要测试25,大于25和小于25三种情况,显然,这是很困难的,真实的环境温度在短时间内很难大幅变化,即使大幅变化,也未必符合测试需求,这就是不可控。
失真的内部输入
失真是打桩造成的,是打桩的必然后果。上面的示例,假如GetTemperature()未实现,或者由于解耦合的目的必须隔离,或者试图解决不可控的问题打桩来代替,桩代码大致是这个样子(代码清单4.4.cpp):
int GetTemperature(int* pTemperature)
{
return 0;
}
直接返回0,此外什么也不做。调用GetTemperature()后,success总是为0,环境温度temperature未初始化,测试无法进行。
一种思路是修改桩代码,使它实现一些功能,例如,给每个用例起一个名字,桩代码判断当前用例名并做合适的操作。这种方法比较麻烦,并且只能适应简单情形。一个桩可能被多个被测函数调用,一个被测函数又可能调用多个桩,要维护用例名与桩行为之间的匹配关系,无疑是一场噩梦。
难于设定的内部输入
前面介绍自然内部输入时提到:如果圆的外接正方形a1要得到某个预期的值,要传递合适的半径r,这是通过外部输入来获得预期的内部输入,即需要倒推外部输入。很多时候,这个工作是很困难的,例如,要设定圆的面积为10.00,半径应该是多少?另外,很多时候,为了获得一个简单的内部输入,需要做复杂的初始化工作,请看下面的示例(代码清单4.5.cpp):
/*
函数说明:
功能: 将PERSON对象指针保存到表格中,如果名字已存在,则不
保存并返回0
参数: pData, 需保存的对象指针
map, 保存对象指针的映射表
返回: 如果加入失败,返回0,否则返回非0值
*/
int AddPerson(PERSON* pData, CPersonMap2* map)
{
文章来源于领测软件测试网 https://www.ltesting.net/