性能测试工具-LoadRunner
VuGen-关联
目标
1. 理解关联的概念
2. 了解LR自动关联使用
3. 掌握关联函数的使用
一、为什么要学习关联?

在第二天的登录脚本时,如果sessionID写死,即不是动态获取的,会导致两次请求的SessionID错误,在测试机票购物网站时,SessionID在第一次请求页面时,服务器就响应给了客户端(浏览器),抓包可以得出Session。


(这验证了在第一次请求时,服务器就会响应session给客户端即浏览器)
1. 获取动态加载的数据,Session ID
2. 测试的时候需要获取页面上指定的数据,注意是获取,而不是查找;
说明:
Session ID:客户端与服务器交互时,服务器生成的一个唯一标识码;
(通过标识码sessionID,服务器可以区分多次交互对象是否同一客户端,浏览器只要不关闭标识码就不变;)
二、什么是关联(correlation)?
说明:动态获取指定的数据,把获取的数据通过参数化方式在另一处引用;
三、loadrunner常用的关联方式
1. 自动关联 【不推荐】
2. 手动关联-函数 【推荐】
自动关联(了解)
说明:LoadRunner11.0的VuGen利用自带的一些关联规则,使用关联函数对需要进行的关联数据进行数据关联;启用
提示:
1. 自动关联LoadRunner提供两种方式:
1). 启用录制脚本能自动关联-在录制的时候如果有符合关联规则的就直接进行关联;
(注意:此种方式依赖于LR自带的规则或新建的规则)
2). 脚本录制完成并且运行完一次后,打开扫描工具,进行扫描需要关联的数据;
(注意:利用工具必须先运行一遍脚本)
2. 自动关联调用的是关联函数 web_reg_save_param_ex();
(web_reg_save_param_ex与web_reg_save_param功能大致相同,它可以使用正则表达式和过滤器)
1)自动关联-启用自动关联设置

提示:
1. 启动自动关联位置:工具菜单(Tool)->Recording Option
2)自动关联-扫描工具

说明
1. 启动:打开扫描工具-Ctrl+F8 或者菜单栏(Vuser)->Scan Script for Correlations
2. 扫描:扫描之前先运行一遍脚本
3. 关联:图中个第二步Correlation Results内进行关联;
自动关联总结
1. 自动关联-启用自动关联设置:采用自带或设定的规则在录制脚本的时候自动关联
2. 自动关联-扫描工具:前后运行两次,搜索两次不同之处为需要关联的数据,进行确认关联
3. 自动关联无论那种方式,都是采用调用关联函数的方法,工具智能人更智能建议掌握接下来关联函数的使用
手动关联【重点】
说明;手动关联就是直接调用关联函数;
关联函数 web_reg_save_param()
说明:
1). 执行顺序:LR中函数内含reg为注册函数,注册函数是在下一个Action Function完成时执行。
2). 函数位置:注册函数【必须】放到下一个Action Function(要进行关联数据所在的函数)函数之前;
案例 1

说明:使用web_reg_save_param()函数把红框选中内容关联给welcome参数
案例1 脚本
Action()
{
// 打开WebTours首页
web_url("首页","URL=http://127.0.0.1:1080/WebTours/",LAST);
return 0;
}
案例1 操作分析
1. 在Web_url函数之前插入关联函数 web_reg_save_param() # 因为注册函数是在下一个Action Function完成时执行,即在获取要关联数据函数之前执行
2. 调用lr_eval_string()来读取关联函数的参数引用名称,并通过lr_output_message()函数输出到日志
案例1 操作实施
1、插入web_reg_save_param()方法

说明:
1. 在web_url函数之前空白行,点击鼠标右键
2. 选择insert菜单->new Step
2)输入要查找的函数

说明:
1). 图1:输入要查找函数的关键词或全称
2). 图2:找到匹配出的函数,双击或点击图3
3). 图3:选中图2,点击图3进行选中函数参数设置
3)设置函数参数

参数:
1). Parameter Name:参数名称(被引用时使用)
2). Left Boundary(LB):左边界
3). Right Boundary(RB):右边界
4). Not Found:关联失败时,处理方式
5). Search in:匹配搜索响应代码范围
注意:
单引号(')、双引号(")、反斜杠()、回车换行等需要转译字符,加上转移字符[]
本质:是通过正则表达式,来匹配并获取数据的,和jmeter中的关联概念一样。
4)如何查看页面元素响应代码
通过页面查看源代码 F12

参数化并输出到日志

脚本代码
Action()
{
//关联
web_reg_save_param("Webcome",
"LB=</H1>
",
"RB=
"
"<br>",
"NotFound=ERROR",
"Search=All",
LAST);
// 打开WebTours首页
web_url("首页","URL=http://127.0.0.1:1080/WebTours/",LAST);
lr_output_message("Webcome值为:%s",lr_eval_string("{Webcome}"));
return 0;
}
练习:关联实现打开首页并登录脚本
Action()
{
# 解决session问题,注意位置,session在第一次请求服务器时就得到了
web_reg_save_param("Session",
"LB=name=userSession value=",
"RB=>",
LAST);
// 打开WebTours首页 抓包分析得出是Get请求
web_url("首页","URL=http://127.0.0.1:1080/WebTours/",LAST);
// 模拟登录,抓包分析得出是Post请求
web_submit_data("登录",
"Action=http://127.0.0.1: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=26", ENDITEM,
"Name=login.y", "Value=6", ENDITEM,
"Name=JSFormSubmit", "Value=off", ENDITEM,
LAST);
return 0;
}
VuGen-检查点
目标
1. 了解什么是检查点
2. 掌握LR中检查点的使用
一、为什么学习检查点?
需求
1. 录制网站登录脚本 http://127.0.0.1:1080/WebTours/
2. 运行脚本是,检查登录用户是否为jojo
登录脚本
Action()
{
# 解决session问题,注意位置,session在第一次请求服务器时就得到了
web_reg_save_param("Session",
"LB=name=userSession value=",
"RB=>",
LAST);
// 打开WebTours首页 抓包分析得出是Get请求
web_url("首页","URL=http://127.0.0.1:1080/WebTours/",LAST);
// 模拟登录,抓包分析得出是Post请求
web_submit_data("登录",
"Action=http://127.0.0.1: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=26", ENDITEM,
"Name=login.y", "Value=6", ENDITEM,
"Name=JSFormSubmit", "Value=off", ENDITEM,
LAST);
return 0;
}
二、检查点
说明:检查点是在回放脚本期间搜索指定的文本或图片,从而验证服务器响应数据的正确性;
提示:
1). LR中的检查点的使用-是调用 web_reg_find()函数
2). 在LR中使用检查点的时候必须开启 Enable Image and text check(启用图片和文本检查)
3). 要使用检查点录制模式必须是HTML-based mode 且为 web_submit_form模式
函数web_reg_find()
说明:web_reg_find为LR检查点函数;
参数:
1. Text:要检查的文本内容【必填】
2. Search:搜索响应数据范围- ALL、Body、Header【选填】
3. Fail:失败条件-NotFound/Found 【选填】
4. SaveCount:匹配结果数量且返回到参数中【选填】
注意:
1. 函数包含reg为注册函数,注册函数必须放到依赖执行函数之前(依赖:函数运行后的数据给注册函数使用)
检查点操作方式有三种,这里着重学习手动写脚本添加检查点。
1. 使用HTML-based mode 且为 web_submit_form模式录制登录
2. 开启 Enable Image and text check(启用图片和文本检查)
3. 在特定位置插入检查点函数 web_reg_find()
1)使用HTML-based mode模式

启动:F4或菜单(Vuser)->Run-Time Settings
2)开启Enable Image and text check

启动:F4或菜单(Vuser)->Run-Time Settings
3)手动写脚本,插入检查点函数web_reg_find()
插入检查点函数 web_reg_find()
(注意包含reg为注册函数,位置必须放到依赖执行函数之前)

(这个截图是录制脚本的截图,不是手写脚本的截图,不过没关系,照样用)
**查找函数

设置参数

参数:
1. Search for specific Text:搜索特定文本
2. Search in:搜范范围
1). All :搜索Body+Headers
2). Body:只搜索Body
3). Headers:只搜索Headers
3. Save count:搜索满足条件的数量,并保存在指定的参数名中
4. Fail if:检查失败的条件
1). NotFound 没有找到检查失败 -推荐
2). Found 找到了检查失败
最终脚本代码
Action()
{
// 关联 session
web_reg_save_param("Session",
"LB=name=userSession value=",
"RB=>",
LAST);
// 打开WebTours首页 抓包分析得出是Get请求
web_url("首页","URL=http://127.0.0.1:1080/WebTours/",LAST);
// 插入 注册检查函数 web_reg_find()
web_reg_find("Fail=NotFound",
"Search=Body",
"SaveCount=num",
"Text=jojo",
LAST);
// 模拟登录,抓包分析得出是Post请求
web_submit_data("登录",
"Action=http://127.0.0.1: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=26", ENDITEM,
"Name=login.y", "Value=6", ENDITEM,
"Name=JSFormSubmit", "Value=off", ENDITEM,
LAST);
// 使用传统普通检查文本函数,这个要在设置里面开启Enable Image and text check
web_find("web_find",
"What=jojo",
LAST);
// 使用检查图片
web_image_check("web_image_check",
"Src=images/hp_logo.png",
LAST);
return 0;
}
VuGen-事务
目标
1. 了解什么是事务
2. 掌握事务的常用方法
一、为什么学习事务?
需求:
1. 统计订票网站登录业务需要的具体时间;
2. 登录账户不是jojo,则登录业务失败;
问题:统计时间有很多办法可以做到(在jmeter中也可以对一个请求统计时间,对页面的一次请求也可以称作为事务,但不能对业务集合标记为事务),
但如何把登录业务标记成功或失败呢?
二、什么是事务?
概念:事务(Transaction)是用户在应用软件上操作的一个业务或多种业务集合(actions)的统称;
作用:
1. 通过事务可标记业务开始和结束,并且可统计相应业务的操作时间(事务时间)【重点】
2. 通过事务状态机制,可判断相应业务执行的成功与失败;【了解】
3. 通过事务来衡量服务器性能;
/*
一个业务:登录业务
业务集合:登录买票业务
*/
三、添加事务
说明:LR添加事务有两种方式:
1). 录制脚本的时候添加【了解】
2). 运行脚本的时候添加【推荐】
添加事务-录制时添加【了解】

添加事务-运行脚本时添加重点

提示:
1. 插入事务开始 lr_start_transaction("Name")
1. 插入方式:
1). Ctrl+T
2). 鼠标右键Insert->Start Transaction
3). 工具栏菜单(Insert)->Start Transaction
2. 参数
Name:事务名称
2. 插入事务结束 lr_end_transaction("Name", "status")
1. 插入方式:参考插入事务开始
2. 参数
Name:事务名称和开始事务名相同;
status:标志事务状态
1). LR_AUTO: 自动-由LR判断 【推荐】
2). LR_PASS:通过
3). LR_FAIL: 失败
4). LR_STOP: 停止
注意:
1. 插入事务时,不要包含lr_think_time()函数,否则导致事务时间不准
2. 事务名称(中文、英文),建议英文;
3. 事务名称开始和结束必须相同 如:登录(Login)
4. 事务必须成对出现 lr_start_transaction("登录"); ... lr_end_transaction("登录", LR_AUTO);
事务的添加我们就了解了这里,接下来我们了解下事务的响应时间
事务时间

说明:
1). 一个事务的时间是指事务持续时间(Duration Time)从事务的开始到结束;
2). 事务时间包含:
1). 响应时间
2). 浪费时间(Wasted Time)
3). 思考时间(Think Time)
4). 事务自身执行时间
3). 在运行脚本后,运行日志内有事务时间、Wasted Time时间,单位为秒;
1)响应时间

说明:
1. 响应时间=T1+T2+T3+T4+T5+T6+T7
2. 客户端浏览器解析渲染响应数据不算响应时间
2)wasted Time (浪费时间)
说明:LR自动会把一些函数执行的时间统计为浪费时间,比如(关联、检查点)等函数
3)Think Time((思考时间)
说明:lr_think_time()函数
4) 事务自身执行时间
说明:lr_start_transaction("")和lr_end_transaction("", LR_FAIL)这两句代码执行的时间;
事务时间 汇总
1. 站在代码角度,事务的开始与结束,其实就是指定一段代码为一个事务;
2. 而代码段内可以包含思考时间、业务代码、事务函数,所以说事务时间包含响应(业务)
时间、思考时间、事务自身、其他函数(浪费时间)
3. 事务时间=响应时间+浪费时间+思考时间+事务自身执行时间
需求 解决方案分析
1. 在登录函数之前插入开始事务
2. 获取登录后的用户名
3. 判断登录用户名是否为jojo,如果是
插入结束事务并且事务状态为:LR_PASS,
否则
插入结束事务,事务状态为:LR_FAIL;
问题:如何判断登录名是否为jojo?
strcmp函数
说明:比较两个字符串(匹配大小写)是否相等,并返回int型数值;
用法:result = strcmp( string1, string2);
result:
1). <0 string1小于string2;
2). 0 string等于string2;
3). >0 strring大于string2;
提示:如果要忽略大小写请使用 stricmp函数,用法参考strcmp
需求解决代码
Action()
{
// 定义变量
int result;
# 解决session问题,注意位置,session在第一次请求服务器时就得到了
web_reg_save_param("Session",
"LB=name=userSession value=",
"RB=>",
LAST);
// 打开WebTours首页 抓包分析得出是Get请求
web_url("首页","URL=http://127.0.0.1:1080/WebTours/",LAST);
// 插入开始 事务
lr_start_transaction("登录");
// 获取登录后的用户名
web_reg_save_param("username",
"LB=Welcome, <b>",
"RB=</b>,",
LAST);
// 模拟登录,抓包分析得出是Post请求
web_submit_data("登录",
"Action=http://127.0.0.1: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=26", ENDITEM,
"Name=login.y", "Value=6", ENDITEM,
"Name=JSFormSubmit", "Value=off", ENDITEM,
LAST);
// 输出username
lr_output_message("username 值为%s ",lr_eval_string("{username}"));
// 判断是否为jojo
result=strcmp(lr_eval_string("{username}"),"jojo");
//注意:输出变量是直接读取,参数读取需要用lr_eval_string()读取
//lr_output_message("判断的结果值为:%d",result);
// 判断是否相等,相等插入LR_PASS事务状态
if (result==0) {
lr_output_message("登录的用户为jojo通过");
// 插入事务 状态为通过
lr_end_transaction("登录", LR_PASS);
}else{
lr_output_message("登录的用户不是jojo失败");
// 插入事务 状态为失败
lr_end_transaction("登录", LR_FAIL);
}
return 0;
}
执行结果如图

相关资料
响应登录信息

总结
1. 什么是事务
2. 插入开始事务和结束事务快捷键
3. 事务状态及作用
4. strcmp函数作用及返回值
VuGen-集合点
目标
1. 了解集合点概念
2. 掌握集合的使用
一、为什么要学习集合点?
需求:
1. 10个用户"同时"登录订票网站,统计服务器处理登录事务性能;
问题
1. 10个用户同时登录,如何保证10个虚拟用户同时(忽略绝对论,最大程度去模拟)去操作?
集合点(rendezvous)
说明:在指定的地点集合指定虚拟用户(Vuser),条件满足时集合的虚拟用户,同时去操作同一事务;
提示:
1. 在VuGen脚本内可以插入集合点,要运行集合点必须配合下一章《Controller》知识点,我们在这里
先学习如何基于VuGen创建集合点;
2. 前面了解的并发测试就是基于集合点来完成【重点】
集合点创建

方式:
1. 指定插入位置,鼠标右键->Insert->Rendezvous 【推荐】
2. 工具栏菜单(Insert)->Rendezvous
参数:
Rendezvous Name:集合点名称-在Controller场景运行时使用 如:Login
提示:
1. 集合点创建,相当于找好集合的地方,那么到底应该那些用户及集合多少用户需要单独设置
1. 集合点要设置和运行,必须在Controller工具内完成;
2. Controller工具我们目前还没有学习,我们在这里先学习使用它如何设置集合点
集合点设置
1)、基于当前脚本 创建Controller场景

1. 菜单工具(Tools)->Create Controller Scenario
(基于当前脚本直接创建场景)
2)选择场景及虚拟用户数

1. 场景模式:Manual Scenario(手工场景)
2. Numberof Vusers:虚拟用户数
提示:
场景模式:我们还没了解,在这里暂时使用下手工场景
虚拟用户数:为并发用户数,我们这里以需求10个并发登录为例
3)Controller工具内设置集合策略
**打开集合点设置

Controller工具-菜单(Scenario)->Rendezvous

说明:
1. 创建场景时10个用户,默认10个用户都参与集合点
2. 可指定用户不参与集合点 选择用户-单击Disable VUser按钮
3. Policy:设置集合用户策略
policy集合策略

1. 集合策略:
1). 当所有虚拟用户中的x % 到达集合点进释放;
2). 当所有正在运行的虚拟用户中的x %到达集合点时释放;
3). 当x 个虚拟用户到达集合点时释放; 【推荐】
2. 时间:
1). Timeout between Vusers:默认30秒-当指定时间内还未达到以上集合策略用户数量时,释放已集合用户去执行;
3. 提示:
1). 集合点的插入和场景设置我们就学习完了,集合点的执行我们在学习完Controller工具,在操作;
代码
Action()
{
// 定义变量
int result;
# 解决session问题,注意位置,session在第一次请求服务器时就得到了
web_reg_save_param("Session",
"LB=name=userSession value=",
"RB=>",
LAST);
// 打开WebTours首页 抓包分析得出是Get请求
web_url("首页","URL=http://127.0.0.1:1080/WebTours/",LAST);
//插入集合点,集合点在此位置-放到事务之前
lr_rendezvous("集合点登录");
// 插入开始 事务
lr_start_transaction("登录");
// 获取登录后的用户名
web_reg_save_param("username",
"LB=Welcome, <b>",
"RB=</b>,",
LAST);
// 模拟登录,抓包分析得出是Post请求
web_submit_data("登录",
"Action=http://127.0.0.1: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=26", ENDITEM,
"Name=login.y", "Value=6", ENDITEM,
"Name=JSFormSubmit", "Value=off", ENDITEM,
LAST);
// 输出username
lr_output_message("username 值为%s ",lr_eval_string("{username}"));
// 判断是否为jojo
result=strcmp(lr_eval_string("{username}"),"jojo");
//注意:输出变量是直接读取,参数读取需要用lr_eval_string()读取
//lr_output_message("判断的结果值为:%d",result);
// 判断是否相等,相等插入LR_PASS事务状态
if (result==0) {
lr_output_message("登录的用户为jojo通过");
// 插入事务 状态为通过
lr_end_transaction("登录", LR_PASS);
}else{
lr_output_message("登录的用户不是jojo失败");
// 插入事务 状态为失败
lr_end_transaction("登录", LR_FAIL);
}
return 0;
}
集合点设置 注意事项
1. 集合点只能在手工场景模式内使用
2. 多个脚本需要同步并发,可以在不同脚本内设置相同集合点,在一个场景内搭建这些脚本;
3. 如果脚本内没有设置集合点,在Controller内集合点策略设置功能不生效
4. 集合点只能在Action部分添加,init、end无法添加
提示:手工场景我们现在还没有学习,在学完手工场景的时候我们在回顾下以上注意事项;