网上订购地址: [url]http://www.china-pub.com/39876[/url]
转载请注明:作者 及其 原文链接
特殊函数应用注意事项
在进行测试脚本编写时可能遇到一些问题,函数使用后没有按照我们预先的想法执行,而影响结果的正确性。
我在做一个实际测试的项目中,有这样的一个案例
:一个进销存管理系统,要测试进货总额计算是否正确,已知进货商品名称、数量和单价,请参见下表:
序号
|
商品名称
|
进货数量
|
进货单价
|
1
|
电视机
|
2
|
1380.00
|
2
|
电冰箱
|
2
|
859.80
|
3
|
微波炉
|
4
|
450.00
|
表3-3:
商品进货列表
从上面的数据可知,进货总额应为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;
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)
{
lr_output_message("
预期结果与实际结果相等!");
}
else
{
lr_output_message("
预期结果与实际结果不等!");
}
return 0;
}
首先,看看在不声明函数atof
时,运行结果如图3
-19
。大家可以看到脚本
lr_output_message("
用atof
格式化输出totalprice
=%f",atof(totalprice));
在未声明函数atof
函数时,输出结果为
用atof
格式化输出totalprice
=0.000000
显然这不是期望的结果。
然后,再看看声明函数atof
后,运行结果如图3
-20
,相应脚本的输出结果为
用atof
格式化输出totalprice
=6279.600000
那么为什么会出现这样的结果呢?
图3
-19
:未声明atof
函数运行结果
图3
-20
:声明atof
函数后运行结果
脚本解析:
首先,我们声明了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
int i; //
临时整型变量
将三组进货单价*
进货数量相加,并将结果存放到ftotalprice
。
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));
为什么会这样?
LoadRunner
的函数联机帮助原文描述如下:
图3
-21
:atof
函数联机帮助
红色区域的注释信息为:“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("
预期结果与实际结果相等!");
}
else
{
lr_output_message("
预期结果与实际结果不等!");
}
【作者提示】
1.
在应用函数时应仔细阅读函数的联机说明和示例,要特别注意有无注释,如果函数事先需要声明,则在应用之前必须先声明后使用。
2.
浮点数的取值是近似值,所以在进行等值判断时,必须取相同的精度,最好转换为字符串后再进行等值比较。