A.6.8 参数和变量
在VuGen中默认使用{}的字符串称为参数,参数的最大优点就是在LoadRunner函数中可以直接应用,例如:
web_link("test","TEXT={param}",LAST);
可以直接用参数来替换需要点击的链接的名称,并且在运行脚本时,系统会自动解析这个参数并将值读出。
如果希望在测试报告中看到的标题也是参数内容,那么这样写是不正确的:
web_link({param},"TEXT={param}",LAST);
//web_link函数要求第一个逗号前的内容必须是字符串
也不能这样写:
web_link("{param}","TEXT={param}",LAST);
//这个字符串是{param},没有实际的意义
参数并不是能写在LoadRunner函数中的任意位置,如果想要实现对无法直接参数化的部分进行参数化,例如,web_link()函数中的step部分可以这样写:
web_link(lr_eval_string("{param}"),"TEXT={param}",LAST);
注意,lr_eval_string()函数也可以这样写:
Lr_eval_string("{param}+{param1}={param2}");
如果想获得一个字符串的第一个字母的ASCII码可以这样写:
lr_eval_string("{param}")[0];
这种写法会返回param参数中的第一个字母的ASCII码。
参数和变量的最大区别在于:参数必须在双引号中才能应用,而变量如果使用双引号则变成了一个字符串,所以使用lr_eval_string()函数的时候也是使用双引号来调用的。
1.参数和变量的定义方法
常用的参数都是使用Parameter List构建的,这种类型的参数是无须定义的。只要保证脚本中的参数名在参数列表中有同名参数对应即可,这种参数都包含了一组值。
而有些时候需要自己定义一个参数,这个参数是自行使用的,那么就需要使用lr_save_string()函数来实现,将一个字符串保存为一个参数。
例如:
lr_save_string("http://www.51testing.com","website");
这里就是把一个http://www.51testing.com的字符串赋值给了一个叫作website的参数。如果接着编写下面的代码:
web_url("51testing","URL={website}",LAST);
运行这个脚本,访问51Testing网站的请求就会被发送出去。接着可以使用lr_free_parameter()将这个参数的值释放掉,减少对内存的占用。
如果想要把数字和日期写入一个参数可以使用lr_save_int()和lr_save_datetime()函数来实现。
如果需要把一定的格式写成参数,那么可以直接使用lr_param_sprintf()函数,例如:
int index = 56;
char * suffix = "txt";
lr_param_sprintf ("LOG_NAME_PARAM", "log_%d.%s", index, suffix,100); lr_output_message("The new file name is %s",lr_eval_string("{LOG_NAME_ PARAM}"));
其输出的内容为:
The new file name is log_56.txt
由于使用C语言为基础,所以变量的定义相对简单,例如:int i 或char city[100] 。
如果要为一个参数中存放的数字做加1操作,那么可以使用这个函数lr_param_increment。
对于指针型字符串建议使用以下的定义方式,避免脚本长时间运行占用过多内存,甚至导致内存泄露的问题。
Buf=(char *)malloc(1024 * sizeof(char)));
//为变量定义内存使用的大小
而在脚本结束的时候使用下列代码:
free(Buf);
//释放变量所使用的内存
这样定义可以在脚本结束时及时释放内存。注意变量的定义必须要在脚本的最开始(系统函数之前),否则会出现错误,例如:
Action()
{
lr_eval_string("{param}");
int x;
}
运行该脚本就会得到以下错误:
Action.c (5): illegal statement termination
Action.c (5): skipping `int'
c:\\users\\administrator\\appdata\\local\\temp\\noname1\\\\combined_noname1.c (5): 2 errors, not writing pre_cci.ci
将int x;放在lr_eval_string()函数前即可解决该问题。
2.参数和变量的区别
参数是可以直接在系统函数中应用的,绝大多数情况下都可以直接用参数替换掉函数中双引号内的数据。变量是属于C语言的,所以无法直接应用在系统函数中。
参考以下例子,大家可以了解变量和参数处理一个请求的异同点。
变量写法:
char url[100];
strcpy(url, "URL=http://www.51testing.com");
web_url("51testing",url,LAST);
参数写法:
lr_save_string("http://www.51testing.com","url");
web_url("51testing","URL={url}",LAST);
这两种写法结果都是相同的,区别在于使用变量需要生成整个函数中逗号间的所有内容,相对来说比较麻烦;而使用参数可以直接应用在字符串中,相对简洁得多。
3.参数和变量的作用域
参数是全局的,在脚本的任何一个Action中都可以使用;变量一般是局部的,如果跨Action调用会出现未声明的错误。
如果在vuser_init()中,定义一个变量i并且赋值:
Vuser_init()
{
int i;
i=10;
}
在Action()中调用它:
Action()
{
lr_output_message("i =%d",i);
}
脚本运行错误,提示i变量未定义。
如何声明全局变量呢?打开左侧Action列表中的globals.h文件。修改脚本,在globals.h中的//Global Variables后设置全局变量。
#ifndef _GLOBALS_H
#define _GLOBALS_H
//--------------------------------------------------------------------
// Include Files
#include "lrun.h"
#include "web_api.h"
#include "lrw_custom_body.h"
//--------------------------------------------------------------------
// Global Variables
int i;//在这里添加我们的全局变量申明
#endif // _GLOBALS_H
然后在vuser_init()中为i赋值i=10;,最后在Action()中调用,运行脚本可以发现i是一个全局变量,能够在不同的Action中使用。globals.h文件相当于C语言中的头文件,这里可以看到在脚本中调用了lrun.h、web_api.h和lrw_custom_body.h,这3个文件中包含了脚本所需要使用的系统函数,可以自行参考具体内容。
如果我们希望将一些自己定义的.h函数库加载到脚本中,也可以在这里通过编写#include头文件的方式来完成,便于快速使用自定义函数。
例如,我们需要在代码中使用C语言的pow函数,帮助我们计算X的Y次方,那么在这里我们可以这样编写代码。首先在globals.h中添加math.h头文件引用:
#include "lrw_custom_body.h"
#include "math.h" //引用C90头文件
//--------------------------------------------------------------------
// Global Variables
然后在Action代码中编写对该函数库中的pow函数调用:
Action()
{
double x = 2.0, y = 3.0;
lr_output_message ("%lf raised to the power of %lf = %lf\n", x, y, pow(x, y));
return 0;
}
在这里需要注意的是被头文件加载的.h库文件必须符合C90的规范,这里所使用的函数头都是从LCC包中复制出来的Include90版。对于引用的头文件必须存放在LR安装目录下的include子目录中,否则会出现找不到头文件的错误提示。
版权声明:51Testing软件测试网获作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。