本文共 3122 字,大约阅读时间需要 10 分钟。
特殊函数应用注意事项
在进行测试脚本编写时可能遇到一些问题,函数使用后没有按照我们预先的想法执行,而影响结果的正确性。 我在做一个实际测试的项目中,有这样的一个案例 :一个进销存管理系统,要测试进货总额计算是否正确,已知进货商品名称、数量和单价,请参见下表: 从上面的数据可知,进货总额应为2*1380.00+2*859.80+4*450.00
=6279.60
,从页面取得进货总额数据信息转换成浮点数以后与6279.60
对比,如果相等则说明系统关于进货总额部分的处理是正确的,如果不等,说明统计错误。从页面上得到的数值为6279.60
,脚本的计算结果也为6279.60
,为什么系统反馈的提示始终是“预期结果与实际结果不等!
”?。下面我们来看这段脚本,在此仅列出关键部分代码。 //double atof ( const char *string );
char totalprice[64]="6279.60";
float price[3]={1380.00,859.80,450.00};
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)
lr_output_message("
预期结果与实际结果相等!");
lr_output_message("
预期结果与实际结果不等!");
首先,看看在不声明函数atof
时,运行结果如图3
-19
。大家可以看到脚本 lr_output_message("
用atof
格式化输出totalprice
=%f",atof(totalprice));
用atof
格式化输出totalprice
=0.000000
然后,再看看声明函数atof
后,运行结果如图3
-20
,相应脚本的输出结果为 用atof
格式化输出totalprice
=6279.600000
首先,我们声明了atof
函数,但为了演示不声明函数会出现的问题,我们先将这部分代码注释掉。 //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
将三组进货单价*
进货数量相加,并将结果存放到ftotalprice
。 ftotalprice=ftotalprice+price[i]*quantity[i];
在未声明atof
函数时,应用atof
函数,输出atof(totalprice)
,即:将"6279.60"
转换成浮点数,但我们发现运行结果输出“0.000000
”,而声明函数后运行结果输出为“6279.600000
”。 lr_output_message("
用atof
格式化输出totalprice
=%f",atof(totalprice));
LoadRunner
的函数联机帮助原文描述如下: 红色区域的注释信息为:“Note: The function atof, as with all functions that do not return an integer, must be explicitly declared in Vugen .s.
”,这句话的含义就是“注释:atof
函数以及所有非返回整型数值的函数,必须在脚本生成器中明确指出。”, 所以在应用函数时一定要看看联机帮助有无注释部分,正确应用函数。 浮点数的取值是近似值,计算可以得到1380.00*2+859.80*2+450.00*4=6279.60
,而实际结果输出却是6279.600098
,从而说明浮点数取的是近似值。所以不能拿两个浮点数进行比较。如:拿6279.60
和6279.600098
比较判断其是否相等,而应该将浮点数格式化成相同精度的字符串再进行比较,这样可以防止出现意外情况的发生。 lr_output_message("
浮点数取的是近似值请看函数的输出结果:%f",ftotalprice);
格式化ftotalprice
取小数点后两位,并将结果字符串存放到strtmpres
,目的就是和totalprice
字符串进行相同精度的比较,格式化后,输出strtmpres
为“6279.60
”。 sprintf(strtmpres,"%.2f",ftotalprice);
lr_output_message("
保留两位小数格式化的浮点数为:%s ",strtmpres);
最后,加入逻辑控制,如果strtmpres
和totalprice
的内容相同,则输出“预期结果与实际结果相等!
”,否则输出“预期结果与实际结果不等!
”,因为两者内容相同,则输出结果为“预期结果与实际结果相等!
”。 if (*strtmpres==*totalprice)
lr_output_message("
预期结果与实际结果相等!");
lr_output_message("
预期结果与实际结果不等!");
1.
在应用函数时应仔细阅读函数的联机说明和示例,要特别注意有无注释,如果函数事先需要声明,则在应用之前必须先声明后使用。 2.
浮点数的取值是近似值,所以在进行等值判断时,必须取相同的精度,最好转换为字符串后再进行等值比较。 本文转自 fish_yy 51CTO博客,原文链接:http://blog.51cto.com/tester2test/138258,如需转载请自行联系原作者