总结学到的函数:
web_url();发送get请求函数
web_submit_data();发送get和post函数
web_link();链接函数
web_submit_form();表单提交函数
web_custom_request();任何请求方法函数
web_reg_save_param()关联函数
lr_eval_string();获取参数返回值
lr_save_string();字符串保存到参数中
lr_output_message()把想要信息输出
lr_paramarr_idx();参数数组指定位置参数
lr_paramarr_random();参数数组随机获取lr_start_transaction();开始事务函数
lr_paramarr_len()统计数组个数函数
web_reg_find()检查点函数
web_find()普通检查点函数
atoi();将字符串转换整型函数
itoa();将整型转换为字符串函数
lr_think_time()思考时间函数
lr_start_transaction();开始事务函数
lr_end_transaction();结束事务函数
lr_rendezvous()集合点函数
web_get_int_property()获取状态码函数
一、事务
1.事务的作用
测试人员可以将一个或多个操作步骤定义为一个事务,
可以通俗的理解事务为"人为定义的一系列请求(请求可以是一个或者多个)"。
在程序上,事务表现为被开始标记和结束标记圈定的一段代码区块。
Loadrunner根据事务的开头和结尾标记,计算事务响应时间、成功/失败的事务数。
判断事务结果
自动判断:此处判断的是状态码
手工判断:
通过状态码判断:
//获取服务器http协议返回码函数
HttpRetCode = web_get_int_property(HTTP_INFO_RETURN_CODE);
//判断返回码是否
if (HttpRetCode == 200)
//lr_output_message("The script successfully accessed the discuz home page--- -----
-------------- -----------------");
lr_end_transaction("open", LR_PASS);
else
//输出信息到日志的函数
//lr_output_message("The script failed to access the discuz home page-------- -----
-------------- ----------------- ");
lr_end_transaction("open", LR_FAIL);
通过检查点判断:
if(atoi(lr_eval_string("{num}"))>0)
lr_end_transaction("login", LR_PASS);
else
lr_end_transaction("login", LR_FAIL);
插入开始事务和结束事务的入口:
注意开始事务和结束事务的名字要一样,因为是成对出现的
事务:
lr_start_transaction(“login”);#事务开始时间
lr_end_transaction(“login”, LR_AUTO); #事务结束时间
//在这里LR_AUTO判断的是服务器的返回状态码,而并没有判断该业务是否成功,加个检查点函数去判断
代码如下:
Action()
{
int a;
web_reg_save_param("session", #检查点函数
"LB=name=userSession value=",
"RB=>",
"Ord=1",
LAST);
//打开网站
web_url("打开网站","URL=http://192.168.103.103:1080/webtours/",LAST);
web_reg_find("Search=All",
"SaveCount=number",
"Text=Welcome, <b>{username}</b>",
LAST);
lr_start_transaction("login");#事务开始时间
web_submit_data("登录",
"Action=http://192.168.103.103:1080/webtours/login.pl",
"Method=POST",
"TargetFrame=",
"Referer=",
"Mode=HTML",
ITEMDATA,
"Name=userSession", "Value={session}", ENDITEM,
"Name=username", "Value={username}", ENDITEM,
"Name=password", "Value={pwd}", ENDITEM,
"Name=login.x", "Value=36", ENDITEM,
"Name=login.y", "Value=8", ENDITEM,
"Name=login", "Value=Login", ENDITEM,
"Name=JSFormSubmit", "Value=off", ENDITEM,
LAST);
//lr_end_transaction("login", LR_AUTO); #事务结束时间
//在这里LR_AUTO判断的是服务器的返回状态码,而并没有判断该业务是否成功
//LR_AUTO的实现方式(源码):
/*
a=web_get_int_property(HTTP_INFO_RETURN_CODE);//返回状态码
if(a == 200){
lr_end_transaction("login",LR_PASS);
}else{
lr_end_transaction("login",LR_FAIL);
}
*/
//这个时候可以通过添加检查点的方式来验证业务是否成功,如果存在要检查的内容那么就给一状态LR_PASS,否则给LR_FAIL
//这个时候就用到一个检查点函数:web_reg_find()---->带有reg的为注册型函数--->特点:如果某一请求的响应数据中有想要的数据,那么就将该函数放在请求前面
if(atoi(lr_eval_string("{number}"))>0){
lr_end_transaction("login",LR_PASS);
}else{
lr_end_transaction("login",LR_FAIL);
}
return 0;
}
插入检查点函数入口:
检查点函数配置
生成的检查点函数:
web_reg_save_param("session",
"LB=name=userSession value=",
"RB=>",
"Ord=1",
LAST);
二、检查点函数的使用
web_reg_find 检查点的使用见上面代码
web_find检查点使用:
web_find检查点的入口:
配置:检查的文本内容是页面上的文本显示去作比较
配置完成后显示出的代码:
web_find("web_find",
"LeftOf=,",
"What=Welcome, jojo",
LAST);
但运行的时候需要开启,要不然这个web_find该检查点函数不会被执行
图片检查
web_image_check()
入口:
配置:
生成的代码:
web_image_check("web_image_check",
"Src=/WebTours/images/flights.gif",
"Alt=Search Flights Button",
LAST);
代码如下:
Action()
{
int a;
web_reg_save_param("session",
"LB=name=userSession value=",
"RB=>",
"Ord=1",
LAST);
//打开网站
web_url("打开网站","URL=http://192.168.103.103:1080/webtours/",LAST);
lr_think_time(10);
lr_start_transaction("login");
web_submit_data("登录",
"Action=http://192.168.103.103:1080/webtours/login.pl",
"Method=POST",
"TargetFrame=",
"Referer=",
"Mode=HTML",
ITEMDATA,
"Name=userSession", "Value={session}", ENDITEM,
"Name=username", "Value=jojo", ENDITEM,
"Name=password", "Value=bean", ENDITEM,
"Name=login.x", "Value=36", ENDITEM,
"Name=login.y", "Value=8", ENDITEM,
"Name=login", "Value=Login", ENDITEM,
"Name=JSFormSubmit", "Value=off", ENDITEM,
LAST);
lr_end_transaction("login",LR_AUTO);
//通过web_find函数检查内容是否存在
//web_find函数使用时必须启用image and text checks图片和文本检查项
/*
web_find("web_find",
"LeftOf=,",
"What=Welcome, jojo",
LAST);
*/
//web_image_check函数--->图片检查点
web_image_check("web_image_check",
"Src=/WebTours/images/flights.gif",
"Alt=Search Flights Button",
LAST);
return 0;
}
三、思考时间
作用:更加真实模拟用户发出请求之间的延迟,也就是用户暂停发请求的时间
思考时间设置的策略:
函数:lr_think_time(秒数)
注意点:
1.实际情况下,获取真实场景的系统的性能指标时一般加入思考时间(1-2S)
如果是做压力测试获取系统的峰值指标时,一般忽略思考时间
2.一般情况下,思考时间函数不要放入事务内,以免后期影响计算事务响应时间
四、集合点
作用:
设集合点是为了更好模拟并发操作。设了集合点后,
运行过程中多个用户可以在集合点等待到一定条件后再一起发后续的请求。
设置策略:
Controller—scenario–Rendezvous–policy
1.当%x的全部用户到达集合点时,开始释放
2.当%x的正在运行的用户到达集合点时,开始释放
3.当x个的用户到达集合点时,开始释放
限制虚拟用户之间的超时时间为xxS
插入集合点入口:
代码:
Action()
{
int a;
web_reg_save_param("session",
"LB=name=userSession value=",
"RB=>",
"Ord=1",
LAST);
//打开网站
web_url("打开网站","URL=http://192.168.103.103:1080/webtours/",LAST);
lr_rendezvous("集合点");
lr_start_transaction("login");
web_submit_data("登录",
"Action=http://192.168.103.103:1080/webtours/login.pl",
"Method=POST",
"TargetFrame=",
"Referer=",
"Mode=HTML",
ITEMDATA,
"Name=userSession", "Value={session}", ENDITEM,
"Name=username", "Value=jojo", ENDITEM,
"Name=password", "Value=bean", ENDITEM,
"Name=login.x", "Value=36", ENDITEM,
"Name=login.y", "Value=8", ENDITEM,
"Name=login", "Value=Login", ENDITEM,
"Name=JSFormSubmit", "Value=off", ENDITEM,
LAST);
lr_end_transaction("login",LR_AUTO);
//通过web_find函数检查内容是否存在
web_find("web_find",
"LeftOf=,",
"What=Welcome, jojo",
LAST);
return 0;
}
再来一个比较全的脚本吧
iwebshop的登录
Action()
{
//open
web_url("open","URL=http://192.168.103.103:8888/iwebshop/",LAST);
//click denglu
web_url("click","URL=http://192.168.103.103:8888/iwebshop/index.php?controller=simple&action=login",LAST);
web_reg_find("Search=All",
"SaveCount=num",
"Text={username}",
LAST);
//LOGIN
lr_start_transaction("开始事务点");
web_submit_data("web_submit_data",
"Action=http://192.168.103.103:8888/iwebshop/index.php?controller=simple&action=login_act",
"Method=POST",
"TargetFrame=",
"Referer=",
"Mode=HTML",
ITEMDATA,
"Name=callback", "Value=", ENDITEM,
"Name=login_info", "Value={username}", ENDITEM,
"Name=password", "Value=123456", ENDITEM,
LAST);
// lr_output_message(lr_eval_string("{username}"));
// lr_output_message("output de neirong shi:%s",lr_eval_string("{username}"));
if(atoi(lr_eval_string("{num}"))>0){
lr_end_transaction("开始事务点",LR_PASS);
}else{
lr_end_transaction("开始事务点",LR_FAIL);
}
return 0;
}