LoadRunner特殊函数应用注意事项

简介:

特殊函数应用注意事项

在进行测试脚本编写时可能遇到一些问题,函数使用后没有按照我们预先的想法执行,而影响结果的正确性。 我在做一个实际测试的项目中,有这样的一个案例 :一个进销存管理系统,要测试进货总额计算是否正确,已知进货商品名称、数量和单价,请参见下表:
序号
商品名称
进货数量
进货单价
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.           浮点数的取值是近似值,所以在进行等值判断时,必须取相同的精度,最好转换为字符串后再进行等值比较。





本文转自 fish_yy 51CTO博客,原文链接:http://blog.51cto.com/tester2test/138258,如需转载请自行联系原作者

目录
相关文章
|
9天前
|
开发者 Python
Python中的仅限位置参数:简化函数调用与提升代码清晰度
【4月更文挑战第17天】Python 3.8 引入了仅限位置参数,增强函数调用清晰度和安全性。通过`/`语法,开发者可指定某些参数只能按位置传递,防止顺序错误和不必要的关键字参数。这有助于提高代码可读性,确保参数正确传递,并在复杂函数中提升安全性。在实际应用中,仅限位置参数可用于明确参数位置、保持向后兼容性和增强函数安全性。
MindOpt APL建模语言自定小义函数的重要性和示例
在编程和建模语言中,函数是一段独立的、可重复使用的代码块,用于执行特定任务。在MindOpt APL中,自定义函数的使用非常重要,因为它们提高了建模过程的效率、可读性和灵活性。
|
7月前
|
存储 索引 Python
4 个你可能不知道的 Python 迭代工具过滤器函数
在 Python 中,迭代器可以帮助您编写更多的 Pythonic 代码,并且更高效地使用长序列。内置的 itertools 模块提供了几个有用的函数来创建迭代器。
74 0
|
测试技术 数据安全/隐私保护
loadrunner脚本优化-ParameterList参数类型介绍
loadrunner脚本优化-ParameterList参数类型介绍
73 0
|
测试技术
loadrunner 脚本优化-参数化之场景中的参数化取值
loadrunner 脚本优化-参数化之场景中的参数化取值
104 0
|
测试技术
loadrunner 脚本开发-参数化之将内容保存为参数、参数数组及参数值获取
loadrunner 脚本开发-参数化之将内容保存为参数、参数数组及参数值获取
87 0
|
测试技术
loadrunner 脚本优化-参数化方法
loadrunner 脚本优化-参数化方法
231 0
|
人工智能 编译器 C语言
如何使用函数及函数的注意事项
目录 什么是函数? 如何调用函数? 函数的先后关系? 函数的变量空间? 什么是函数? 首先我们来说一说函数的作用,就是一块简单的代码接受零个或多个参数,做一件事情,并返回零个或一个值 void sum(int a,int b) { int i; int sum=0; for(i=a:i<=b;i++) { sum+=i; } printf("%d到%d的和是%d\n",a,b,sum); } 现在我们就写出了一个简单的求和函数和数学中的y=f(x)很像 函数名 sum 返回类型 void 参数表 int a,int b 函数体 大括号里的所有东西 函数头 大括号前
|
算法 编译器 API
MindOpt的可选输入参数有哪些?有什么作用?请阅读本篇!
在编译器中可选参数是指在调用的时候可以选择传入参数或者不传入参数,但在我们MindOpt优化求解器中的意思是指可以选择输入参数控制求解器的行为,如优化方法、求解流程,以及终止条件,或是对远程计算服务进行配置等。
MindOpt的可选输入参数有哪些?有什么作用?请阅读本篇!
python--测试使用不同的方式计算位涡平流项的差异
python--测试使用不同的方式计算位涡平流项的差异
python--测试使用不同的方式计算位涡平流项的差异