班里有个致力于做性能测试的学生,最近一直在研究性能测试方面的知识。买了些可读性价值比较高的书,问了些书中的事例。但有些案例是有错误的。比如说:
《软件性能测试与LoadRunner实战》中 “特殊函数应用注意事项” 章节中 的错误。
里面讲了一个进销存管理系统,要测试进货总额计算是否正确,已知进货商品名称、数量和单价。
序号 |
商品名称 |
进货数量 |
进货单价 |
1 |
电视机 |
2 |
1380.00 |
2 |
电冰箱 |
2 |
859.80 |
3 |
微波炉 |
4 |
450.00 |
进货总额应为2*1380.00+2*859.80+4*450.00=6279.60,从页面取得进货总额数据信息转换成浮点数以后与6279.60对比,如果相等则说明系统关于进货总额部分的处理是正确的,如果不等,说明统计错误。从页面上得到的数值为6279.60,脚本的计算结果也为6279.60。
#include "web_api.h"
//double atof ( const char *string );
Action()
{
char totalprice[64]="6279.60"; //进货总额的期望结果
float price[3]={1380.00,859.80,450.00};//进货商品单价数组
int quantity[3]={2,2,4};//进货商品数量数组
char strtmpres[64];//错放格式化浮点字符串的临时变量
float ftotalprice=0;//存放计算进货总额变量,初始化为0
int i;
//计算 进货总额
for (i=0;i<=2;i++)
{
ftotalprice=ftotalprice+price[i]*quantity[i];
}
//在未声明atof函数时,应用atof函数,输出atof(totalprice),即:将"6279.60"转换成浮点数,//但我们发现运行结果输出“0.000000”,而声明函数后运行结果输出为“6279.600000”。
lr_output_message("用atof格式化输出totalprice=%f",atof(totalprice));
//浮点数的取值是近似值,计算可以得到1380.00*2+859.80*2+450.00*4=6279.60,而实际结//果输出却是6279.600098,从而说明浮点数取的是近似值。所以不能拿两个浮点数进行比
//较。
lr_output_message("浮点数取的是近似值请看函数的输出结果:%f",ftotalprice);
//格式化ftotalprice取小数点后两位,并将结果字符串存放到strtmpres,目的就是和//totalprice字符串进行相同精度的比较,格式化后,输出strtmpres为“6279.60”。
sprintf(strtmpres,"%.2f",ftotalprice);
lr_output_message("保留两位小数格式化的浮点数为:%s ",strtmpres);
//将转化后的结果与预期结果相对比。
if (*strtmpres==*totalprice)
{
lr_output_message("预期结果与实际结果相等!");
}
else
{
lr_output_message("预期结果与实际结果不等!");
}
return 0;
}
其实本题目重点说明了
1. Atof函数不声明,字符串值转化为浮点数值得时候会变成0值。
2. 说明了float的类型的值都是近似值,两个浮点数之间不能做“等于”的比较,所以应把float的类型的值转化为格式化的字符串值再进行“等于”比较。通过设定的预期结果字符串和实际结果字符串进行比较得出最终的测试结果。
例子举的特别好,但是最后字符串比较的方法有错误。估计是指针的概念理解上有些问题。
#include "web_api.h"
//double atof ( const char *string );
Action()
{
char totalprice[64]="6599.91";//预期结果是错误的。
float price[3]={1380.00,859.80,450.00};
int quantity[3]={2,2,4};
char strtmpres[64];
float ftotalprice=0;
int i;
for (i=0;i<=2;i++)
{
ftotalprice=ftotalprice+price[i]*quantity[i];
}
lr_output_message("用atof格式化输出totalprice=%f",atof(totalprice));
lr_output_message("浮点数取的是近似值请看函数的输出结果:%f",ftotalprice);
sprintf(strtmpres,"%.2f",ftotalprice);
lr_output_message("保留两位小数格式化的浮点数为:%s ",strtmpres);
if (*strtmpres==*totalprice) // if (strcmp(strtmpres, totalprice)==0)
{
lr_output_message("预期结果与实际结果相等!");
}
else
{
lr_output_message("预期结果与实际结果不等!");
}
return 0;
}
上面的例子我把预期结果改成了“错误”的"6599.91",但第一个字符‘6’并没有变,程序运行后的结果还是“ 预期结果与实际结果相等!” 为什么呢?
因为
if (*strtmpres==*totalprice) 只是对两个字符数组所存字符串的第一个字符的比较。后面的字符根本没有作比较。
字符串比较要么使用循环,一个一个比,要么使用strcmp进行比较。
当然使用strcmp更简单。所以把if (*strtmpres==*totalprice)修改成—〉if (strcmp(strtmpres, totalprice)==0)即可。