Loadrunner定义了很多用于性能测试脚本编写和增强的方法,本文总结了web测试时经常会使用到的方法,掌握这些方法之后,基本可以不依赖录制就能完成脚本编写和增强。
1、web常用方法
1.1、web_url方法
模拟用户请求,实现HTTP请求中的GET方法。
语法如下:
intweb_url(constchar*StepName,constchar*url,<List of Attributes>,[EXTRARES,<List of Resource Attributes>,] LAST );//参数说明://StepName:测试结果中显示的名称,也可用作自动事务的名称//url:需要访问的网页地址//List of Attributes:支持属性如下://FtpAscii:FTP下载文件时使用,不常用//TargetFrame:包含当前资源或连接的frame标签名//Resource:请求的URL是否是一个资源,0不是,1是//RecContentType:响应头的文本类型//Referer:URL引用的页面//Snapshot:快照名称,用于关联//Mode:录制模式,HTML或HTTP//EXTRARES:分界函数,指示下一个参数将是资源属性列表//List of Resource Attributes:资源属性列表,支持以下资源属性://URL:通过URL地址要下载的web资源//Refer:发送下载请求的页面地址//ENDITEM:列表中每个资源的标志符//LAST:参数列表结束标记
返回值如下:
成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)
示例如下:
int status;
status =web_url("index","URL=http://127.0.0.1:1080/WebTours/index.htm","Resource=0","RecContentType=text/html","Referer=","Snapshot=t1.inf","Mode=HTML",
LAST);lr_output_message("status=%d",status);//运行结果:status=0
1.2、web_image方法
模拟单击图片,必须在有前置操作的上下文中使用
语法:
intweb_image(constchar*StepName,<List of Attributes>,[EXTRARES,<List of Resource Attributes>,] LAST );
返回值:
成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)
示例:
web_image("SignOff Button","Alt=SignOff Button","Snapshot=t110.inf",
LAST);//Alt为html结构中图片的alt属性值
1.3、web_link方法
模拟用户单击指定属性链接,必须在有前置操作的上下文中使用
语法:
intweb_link(constchar*StepName,<List of Attributes>,[EXTRARES,<List
of Resource Attributes>,] LAST );//List of Attributes:支持下列的属性://Text:超链接中的文字,必须精确匹配。//Frame:录制操作时所在的 Frame 的名称。//TargetFrame、ResourceByteLimit//Ordinal:如果用给定的Attributes筛选出的元素不唯一,则使用此属性来指定其中的一个。如:“SRC=pic.gif”,“Ordinal=3”标记的是 SRC的值是“pic.gif”的第3张图片
返回值:
成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)
1.4、web_submit_data方法
生成表单的POST或GET请求,与上下文无关
语法:
intweb_submit_data(constchar*StepName,constchar*Action,<List of Attributes>,
ITEMDATA,<List of data>,[ EXTRARES,<List of Resource Attributes>,]LAST);//Action:Form表单中的action属性,即提交数据时执行操作的http地址//List of Attributes://Method:表单提交方法:POST或GET(默认值:POST)//EncType:编码方法//EncodeAtSign:以其ASCII表示法编码“@”符号。Yes或No。//TargetFrame:包含当前链接或资源的帧的名称。//Referer、Mode(HTTP/HTML)//UserAgent:标识将执行该步骤的浏览器以外的组件//ITEMDATA:数据域和属性的分隔符//List of data:表单提交的内容,上下文无关,格式为:“name=name1”, “value=value1”, ENDITEM,//EXTRARES:数据域和资源属性列表分隔符//List of Resource Attributes:资源属性列表
返回值:
成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)
示例:
web_submit_data("reservations.pl","Action=http://127.0.0.1:1080/cgi-bin/reservations.pl","Method=POST","RecContentType=text/html","Referer=http://127.0.0.1:1080/cgi-bin/reservations.pl?page=welcome","Snapshot=t9.inf","Mode=HTML",
ITEMDATA,"Name=advanceDiscount","Value=0", ENDITEM,"Name=depart","Value=PEK", ENDITEM,"Name=departDate","Value=05/28/2022", ENDITEM,"Name=arrive","Value=SHA", ENDITEM,"Name=returnDate","Value=05/29/2022", ENDITEM,"Name=numPassengers","Value=1", ENDITEM,"Name=seatPref","Value=Window", ENDITEM,"Name=seatType","Value=First", ENDITEM,"Name=.cgifields","Value=roundtrip", ENDITEM,"Name=.cgifields","Value=seatType", ENDITEM,"Name=.cgifields","Value=seatPref", ENDITEM,"Name=findFlights.x","Value=65", ENDITEM,"Name=findFlights.y","Value=5", ENDITEM,
LAST);
1.5、web_submit_form方法
提交表单,此函数可能必须在前一个操作的上下文中执行。录制时会判断浏览器中是否有cache的内容,如果有web_submit_form函数中只保存和缓存不相同的数据。其他同web_submit_data。
1.6、web_custom_request方法
发送自定义的http请求。
语法:
Int web_custom_request (const char *RequestName, <List of Attributes>,[EXTRARES, <List of Resource Attributes>,] LAST );
//List of Attribute:支持属性如下:
//URL:页面地址
//Method:提交方式,如POST/GET
//TargetFrame
//EncType:编码类型
//RecContentType:响应头的内容类型
//Referer
//Body:请求体
//RAW BODY
//BodyFilePath:作为请求体传送的文件的路径
//Resource、ResourceByteLimit、Snapshot、Mode
//ExtraResBaseDir
//UserAgent:用户代理
//Binary
//ContentEncoding:指定请求体的使用指定的方式进行编码
//EXTRARES:分隔符
返回值:
成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)
使用示例:
web_custom_request("login","URL=https://www.xxxx.com/login","Method=POST","RecContentType=application/json;charset=UTF-8","Referer=https://exam.cata.org.cn/","Mode=HTTP","EncType=application/json","body={\"code\":\"1q2w\",\"password\":\"xxxx\",\"str\":\"xxxxxx\",\"username\":\"xxx\"}",
LAST);
1.7、web_find方法
从HTML页面中查找指定的文本字符串
语法:
intweb_find(constchar*StepName,<Attributes and Specifications list>,char*searchstring, LAST);//支持的属性://Frame:多Frame时,定义要查找的Frame范围//Expect:定义检查成功的标准:found(默认)/notfound//Matchcase:搜索是否区分大小写//Repeat:第一次发现待查字符串时,是否继续搜索。yes/no//Report:指定那种情况下在执行日志中显示检查结果:success/failure/always(默认)//Onfailure:检查失败后,Vuser是否终端,设为abort时,运行时中的error-handling设置不生效,脚本中断;未指定该值,则error-handling设置生效//RightOf:要查找的字符串右边内容//LeftOf:要查找的字符串左边内容//Searchstring:需要查找的字符串,格式为"What=stringxxx",不区分大小写
返回值:
成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)
示例:
web_find("find_string","RightOf=aaa","LeftOf=bbb","What=name",
LAST);//注意:1、该函数在请求的页面内容完全显示出来以后在页面中查找,故需写道打开页面的动作之后;//2、必须启用内容检查选项
1.8、web_reg_find方法
从HTML页面中查找指定的文本字符串
语法:
intweb_reg_find(constchar*attribute_list, LAST);//attribute_list:通过Name=Value传参,Text/TextPfx/TextSfx必须有一个,其他属性可选。//Text:要搜索的字符串,肥哦那个;//TextPfx:要搜索的字符串的直接前缀//TextSfx:要搜索的字符串的直接后缀//Search:搜索的范围:Headers、Body(默认)、Noresource(仅在HTML请求体中搜索,不含头和资源)、ALL//SaveCount:匹配个数,若指定了该值,且未使用Fail,无论是否找到,检查不会失败//Fail:设置检查函数在什么状态下失败,Found/NotFound(默认)//ID:日志文件中标识此函数的一个字符串//RelFrameId:相关联的FrameId
返回值:
成功时返回LR_PASS (0),失败时返回 LR_FAIL (1)
示例:
示例1:
web_reg_find("Fail=NotFound","Search=Body","SaveCount=1","Text=Web Tours",
LAST
);
示例2:
Action(){web_reg_save_param("userSession","LB=name=\"userSession\" value=\"","RB=\"/>",
LAST);web_url("index","URL=http://127.0.0.1:1080/WebTours/index.htm","Resource=0","RecContentType=text/html","Referer=","Snapshot=t1.inf","Mode=HTML",
LAST);web_reg_find("Text=Welcome","SaveCount=WelcomeCount",//记录Text出现的次数
LAST);web_submit_data("login.pl","Action=http://127.0.0.1:1080/cgi-bin/login.pl","Method=POST","RecContentType=text/html","Referer=http://127.0.0.1:1080/cgi-bin/nav.pl?in=home","Snapshot=t4.inf","Mode=HTML",
ITEMDATA,"Name=userSession","Value={userSession}", ENDITEM,"Name=username","Value=jojo", ENDITEM,"Name=password","Value=bean", ENDITEM,"Name=JSFormSubmit","Value=on", ENDITEM,"Name=login.x","Value=51", ENDITEM,"Name=login.y","Value=10", ENDITEM,
LAST);lr_output_message(lr_eval_string("{WelcomeCount}"));if(atoi(lr_eval_string("{WelcomeCount}"))>0){//atoi:将字符串转化为整型lr_output_message("Login success!");}else{lr_output_message("Login failure!");}return0;}//运行结果://2//Login success!
web_find和web_reg_find对比:
1、web_find必须开启内容检查才可生效;web_reg_find不必
2、web_find在返回页面中查;web_reg_find在缓存中查
3、web_find效率较低
4、总结:更推荐使用web_reg_find
1.9、web_reg_save_param方法
将请求的动态数据信息保存到参数,一般用于参数关联
语法:
intweb_reg_save_param(constchar*ParamName,<List of Attributes>, LAST);//ParamName:参数名,将关联的文本字符串保存在该参数//List of Attributes://Convert:可选,HTML_TO_URL(将HTML编码数据转换为URL编码数据格式)/HTML_TO_TEXT(将HTML编码数据转为纯文本数据格式)//IgnoreRedirections:可选,Yes时,不搜索重定向(300-303、307)返回的信息//LB:必选,参数左边界//RB:必选,参数右边界//NOTFOUND:可选,当边界未找到时,生成一个空串,error(当边界未找到时,报错);warning(未找到时,设置参数计数为0,并继续执行脚本)//ORD:可选,匹配的序号或出现的次数,默认为1,设置为ALL,则将参数值保存在数组中//Search:可选,搜索范围:Headers、Body、ALL//SaveLen:找到的值的字符按串长度(在指定偏移量中),默认-1,表示到字符串末尾//SaveOffSet:找到的值的子字符串的偏移量,默认为0,从搜索到的字符串中取子串。
示例:
//设置userSession参数关联web_reg_save_param("userSession","LB=name=\"userSession\" value=\"","RB=\"/>",
LAST);//打开WebTours主页web_url("index.htm","URL=http://127.0.0.1:1080/WebTours/index.htm","Resource=0","RecContentType=text/html","Referer=","Snapshot=t1.inf","Mode=HTML",
LAST);
注意:在关联期间可以捕获的参数的最大长度的默认值为256个字符,如果需要使用到超过256字符的关联参数,需要使用web_set_max_html_param_len函数增加最大有效长度:
web_set_max_html_param_len("1024");//login_token参数超长,需要增加最大长度web_reg_save_param("login_token",//login_token参数长度超过256"LB={\"token\":\"","RB=\",\"","Search=Body",
LAST);
1.10、web_add_header方法
将指定请求头添加到下一个HTTP请求中,如:
web_add_auto_header("content-type","application/json;charset=UTF-8");
1.11、web_add_auto_header方法
将指定的标头添加到所有后续HTTP请求中,如:
web_add_auto_header("token","xxxxxx");//后面的请求都自动带上token
添加了之后,后续所有请求请求头中都会带token。
2、lr常用方法
2.1、lr_start_transaction
为性能分析标记事务的开始,具体如下:
intlr_start_transaction(constchar* transaction_name);//transaction_name:事务名//如:lr_start_transaction("tran01_login");
2.2、lr_end_transaction
为性能分析标记事务的结束,具体如下:
intlr_end_transaction(constchar* transaction_name,int status);//status:事务的结束状态:共有LR_PASS(通过)、LR_FAIL(失败)、LR_AUTO(自动)、 LR_STOP(暂停)//如:lr_end_transaction("tran01_login",LR_AUTO);
2.3、lr_rendezvous
设置集合点,具体如下:
intlr_rendezvous(constchar* rendezvous_name);//rendezvous_name:集合点名称//如:lr_rendezvous("旅客值机");
2.4、lr_think_time
设置思考时间,单位秒,如:
lr_think_time(22);
2.5、lr_eval_string
返回脚本中一个参数的当前值:
格式:lr_eval_string("{参数名}");
2.6、lr_save_string
将以NULL结尾的字符串保存到参数中
lr_save_string(constchar*param_value,constchar*param_name)//param_value:指定字符串值//param_name:参数名//如:将字符串value1保存至参数name1://lr_save_string("value1", "name1");
示例如下:
Action(){lr_save_string("value1","name1");lr_output_message("name1 is:%s",lr_eval_string("{name1}"));lr_save_string(lr_eval_string("{name1}"),"name2");lr_output_message("name2 is:%s",lr_eval_string("{name2}"));return0;}//运行结果://name1 is:value1//name2 is:value1
2.7、lr_save_var
将变长字符串保存到参数中
intlr_save_var(constchar* param_value,unsignedlong constvalue_len,unsignedlongconst options,constchar*param_name);//param_value:待分配给参数的值。//value_len:值的长度(以字节为单位)。//options:参数选项,当前为0。//param_name:参数名称。
示例如下:
Action(){lr_save_string("abcde12345","string1");lr_output_message(lr_eval_string("{string1}"));lr_save_var(lr_eval_string("{string1}")+3,4,0,"string2");//从string1下标3处开始截取,截取长度为4,将结果赋值给string2lr_output_message(lr_eval_string("{string2}"));return0;}//运行结果://abcde12345//de12
2.8、lr_save_datetime
将当前日期和时间保存到参数中
voidlr_save_datetime(constchar*format,int offset,constchar*name);//format:格式化信息/*
%a 星期几的简写
%A 星期几的全称
%b 月分的简写
%B 月份的全称
%c 标准的日期的时间串
%C 年份的后两位数字
%d 十进制表示的每月的第几天
%D 月/天/年
%e 在两字符域中,十进制表示的每月的第几天
%F 年-月-日
%g 年份的后两位数字,使用基于周的年
%G 年分,使用基于周的年
%h 简写的月份名
%H 24小时制的小时
%I 12小时制的小时
%j 十进制表示的每年的第几天
%m 十进制表示的月份
%M 十时制表示的分钟数
%n 新行符
%p 本地的AM或PM的等价显示
%r 12小时的时间
%R 显示小时和分钟:hh:mm
%S 十进制的秒数
%t 水平制表符
%T 显示时分秒:hh:mm:ss
%u 每周的第几天,星期一为第一天 (值从0到6,星期一为0)
%U 第年的第几周,把星期日做为第一天(值从0到53)
%V 每年的第几周,使用基于周的年
%w 十进制表示的星期几(值从0到6,星期天为0)
%W 每年的第几周,把星期一做为第一天(值从0到53)
%x 标准的日期串
%X 标准的时间串
%y 不带世纪的十进制年份(值从0到99)
%Y 带世纪部分的十制年份
%z,%Z 时区名称,如果不能得到时区名称则返回空字符。
%% 百分号
*///offset:时间偏移量/*
DATE_NOW(现在的日期)
TIME_NOW(现在的时间)
ONE_DAY(一天的时间)
ONE_HOUR(一小时的时间)
ONE_MIN(一分钟的时间)
*///name:保存的参数名
示例如下:
Action(){lr_save_datetime("%Y-%m-%d",DATE_NOW+3*ONE_DAY,"threeDay");lr_output_message(lr_eval_string("{threeDay}"));return0;}//保存3天后的日期到参数threeDay中,如今天为20220606,运行结果如下://2022-06-09
2.9、lr_output_message
将消息打印到输出窗口
2.10、lr_error_message
3、C语言常用方法
脚本增强时,为了对返回的数据做处理,经常会使用c语言字符串处理函数,常用的函数总结如下:
3.1、数据类型定义
Loadrunner中常用的C数据类型包括整型和字符串,定义方法示例如下:
注意:定义数据必须要写在脚本的最前面,否则会报错。
char str1[]="aabbcc";//定义后需要即刻赋初值char* str2, str3[10], str4[10];//定义字符串str2;str3,str4长度为10long num1 =12345678;//定义长整型num1,并赋初值 int num2;//定义整型num2
str2 ="112233";//给str2赋值
num2 =123;//给num2赋值lr_output_message("str1 is %s", str1);lr_output_message("str2 is %s", str2);itoa(num1,str3,10);//取num1值,转为10进制的字符串itoa(num2,str4,16);//取num2值,转为16进制的字符串lr_output_message("str3 is %s", str3);lr_output_message("str4 is %s", str4);
运行结果如下:
/*
str1 is aabbcc
str2 is 112233
str3 is 12345678
str4 is 7b
*/
3.2、sprintf
将格式化的字符串输出到目标字符串(一般为数组)
sprintf(char*string_buffer,constchar*format_string[, args]);//string_buffer:目标字符串(一般为数组)//format_string:一个或多个格式化字符//args:一个或多个可选的打印参数
示例如下
int num1 =001;char str1[20],* str2 ="abc";sprintf(str1,"%d+%s", num1, str2);lr_output_message("str1 is %s", str1);//运行结果:str1 is 1+abc
3.3、strstr
返回字符串中首次出现子串的地址。
char*strstr(constchar*str1,constchar*str2);//str1:被查找的目标//str2:要查找的对象//运行结果:若str2为str1的字串,则返回str2首次出现地址,若不是,则返回NULL
示例如下:
char* str1 ="abcdefg";char* str2 ="cde";char* str3 ="cdf";lr_output_message("substr2 is %s",strstr(str1, str2));lr_output_message("substr3 is %s",strstr(str1, str3));lr_output_message("substr4 is %s",(char*)strstr(str1, str2));if(strstr(str1, str3)==NULL){lr_output_message("fail!!!");}//运行结果如下:/*
substr2 is cdefg
substr3 is (null)
substr4 is cdefg
fail!!!
*/
3.4、strcat
连接两个字符串。
char*strcat(char*to,constchar*from );//将from连接到to后,连接后的字符串值赋给to
示例:
char str1[]="abc";//注意不能定义为char *str1 = "abc";这种方式定义的字符串不可变char* str2 ="def";strcat(str1, str2);lr_output_message(str1);//运行结果:abcdef
3.5、strncat
连接两个字符串,最多n位,如:
char str1[10]="abcdef";char str2[10]="123456";strncat(str1, str2 ,3);lr_output_message(str1);//运行结果:abcdef123
3.6、strcpy
复制一个字符串到另一个字符串
char*strcpy(char*dest,constchar*source)
示例:
char str1[100];strcpy(str1,"abcdef");lr_output_message(str1);//运行结果:abcdef
3.7、strncpy
复制一个字符串到另一个字符串,最多复制n个字符,示例如下:
char str1[20],str2[20];strcpy(str1,"abcdef");strncpy(str2, str1,3);//str1的前3个字符复制到str2lr_output_message(str1);lr_output_message(str2);lr_output_message((char*)strncpy(str2, str1,3));//运行结果/*
abcdef
abc
abc
*/
3.8、strchr
返回字符串中指定字符后的字符串,未找到则返回NULL
char*strchr(constchar*string,int c)
示例:
char*str1 ="abcdecfg";char*str2,*str3, str4;
str2 =(char*)strchr(str1,'c');//strchr表示第一个出现的字符//不能写成"c",单引号引起的字符代表整数,双引号为字符串//(char *)为强制类型转换,将后面表达式强制转为char*类型lr_output_message("str2 is %s", str2);
str3 =(char*)strrchr(str1,'c');//strrchr表示最后一个出现的字符lr_output_message("str3 is %s", str3);
str4 =strchr(str1,'m');lr_output_message("str4 is %s", str4);//运行结果:/*
str2 is cdecfg
str3 is cfg
str4 is (null)
*/
3.9、strcmp/stricmp
比较字符串
intstrcmp( constchar *string1,constchar*string2 );intstricmp(constchar*string1,constchar*string2 );//strcmp大小写敏感,stricmp大小写不敏感//string1 < string2时,返回-1//string1 > string2时,返回1//string1 = string2时,返回0
示例:
char*str1 ="AAA";char*str2 ="aaa";lr_output_message("result is %d",strcmp(str2, str1));lr_output_message("result is %d",strcmp(str1, str2));lr_output_message("result is %d",stricmp(str1, str2));//运行结果:/*
result is 1
result is -1
result is 0
*/
3.10、strlwr
将字符串转为小写
char*strlwr(char*string);
示例:
char str1[10]="AAA";strlwr(str1);lr_output_message(str1);//运行结果:aaa
3.11、strlen
返回字符串长度,如:
char str1[10]="abcdef";lr_output_message("str1 length is %d",strlen(str1));//运行结果:str1 length is 6
3.12、sizeof
判断数据类型或者表达式长度,如:
char str1[123];lr_output_message("str1 size is %d",sizeof(str1));lr_output_message("int size is %d",sizeof(int));lr_output_message("long size is %d",sizeof(long));lr_output_message("char size is %d",sizeof(char));//运行结果如下:/*
str1 size is 123
int size is 4
long size is 4
char size is 1
*/
3.12、menset
将某一块内存中的内容全部设置为指定的值,通常为新申请的内存做初始化工作
void*memset(void*str,int c,size_t n)
如:
char str1[20];strcpy(str1,"abcdefg");memset(str1,'#',3);lr_output_message(str1);//运行结果:###defg
实际初始化内存使用方法如下:
char str1[20];strcpy(str1,"abcdefg");memset(str1,0,sizeof(str1));//也可以写成:memset(str1, '\0', sizeof(str1));lr_output_message("str1 is %s", str1);//运行结果:str1 is
版权归原作者 zwhnsh 所有, 如有侵权,请联系我们删除。