在使用loadrunner12过程中总结的一些心得,希望能够帮助到你们。
LoadRunner,是一种预测系统行为和性能的负载测试工具。通过模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整个企业架构进行测试。企业使用LoadRunner能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。
火狐和谷歌浏览器录制的时候,最好同时开启Fiddler。
版本:loadrunner12.02
链接: https://pan.baidu.com/s/1dWvnknMuLZW3LHahl5sgMA 提取码: vjrs
文档里有详细的安装步骤
用大白话就是:录脚本的、跑脚本的、分析结果的
一般对于常见的应用软件,可以根据软件的结构来选择协议:
红色按钮或者Ctrl+R开启录制(要录制的URL地址不要填错)
把支持字符集UTF-8勾上,否则录制出来的脚本,中文可能乱码
可以在录制的过程中添加事务(方便计算事务的响应时间)和集合点(方便并发同时进行)
可以对脚本进行自定义编辑,比如:添加cookie、参数话、关联、检查点等
具体查看–>五、优化脚本
点击回放按钮,可以让脚本重新发送我们录制过的WEB请求
结束后的界面,绿色代表回放成功,红色代表脚本执行失败
VuGen菜单可用的快捷键
Ctrl+Shift+Space:显示函数语法
Ctrl+Alt+B:步骤工具箱
Ctrl+Alt+P:快照
Ctrl+Alt+S:步骤导航器
Ctrl+H:快速替换
F4:运行时设置
Action的迭代
1.init录制的一般是用户登录的时候;action录制的一般是操作的事件;end录制的一般是退出的事件 ( 它们的区别是 init 和 end 只能运行一次, 而action可以迭代运行多次 )
2.所以开始录制时首先将操作设置到vuser_init
3.登录录制好后 , 就通过快捷工具栏设置到action , 那么接下来的脚本就会写到action里面去.
4.准备登出时就设置到vuser_end.
事务作为性能测试的重要指标,如果不添加事务,无法统计对应接口的事务响应时间
// 事务的开始
lr_start_transaction("login", LR_AUTO);
// ...事务
// 事务的结束
lr_end_transaction("login", LR_AUTO);
事务还可以与关联或检查点结合使用,来判断事务的结束
lr_rendezvous(“集合点名称”);
认识集合点之前我们先看看普通的压力测试:普通的压力测试是哪一个请求ready了 就发出去(比如我们设置是1000并发用户登录 没有设置集合点 这种情况下可能某个时候loadrunner中ready的请求有30个了 他也会发送出去这30个请求)。
设置了集合点的并发测试:比如100并发登录 有设置集合点 那么loadrunner会等有100个请求ready了才会一起将这100请求同时提交给服务器处理。
注意:集合点可以放在事务外面/里面都可以 如果放在事务里面可能会导致统计的事务响应时间过长 所以一般是将集合点放置在事务外面的
场景中设置集合点策略
web_reg_save_param()函数
所谓的关联(correlation)就是把脚本中某些写死的(hard-coded)数据,转变成是撷取自服务器所送的、动态的、每次都不一样的数据。
由于自动关联很不靠谱,人还是比机器更智能,所以我们只介绍手动关联,手动关联的执行步骤大致如下:
1、使用相同的业务流程与数据,录制二份脚本
2、找出两份脚本中不同的地方
3、确定脚本中有差异的地方是否需要关联
4、确定关联函数的插入位置
5、使用web_reg_save_param函数手动建立关联
6、参数化要关联的动态值
7、回放脚本验证关联是否成功
因为web_reg_save_param函数为注册函数,必须在动态值的前面,相当于先声明,后作用。注意:并不是在动态值的前面就行了,一定得在该动态值所属的请求前。
web_reg_find()函数
VuGen是根据服务器端返回的状态码来判断脚本是否执行成功,如果状态码为200,那么VuGen就认为是成功了。但是脚本未必执行成功,因为大多数的系统出错未必会返回错误页面,而是返回消息提示框。比如录制的注册脚本,同样的用户名每次都显示是执行成功,但是同样的用户名显然是不可能每次都能注册成功,这个时候就需要添加检查点,对服务器返回的内容进行检查,比如验证网页上是否存在指定的Text或者Image。
注意:
常用的有
(1)file格式:(可以一个参数,也可以多个参数绑定使用)
Select next row【选择下一行】:
顺序(Sequential):按照参数化的数据顺序,一个一个的来取。
随机(Random):参数化中的数据,每次随机的从中抽取数据。
唯一(Unique):为每个虚拟用户分配一条唯一的数据
Update value on【更新时的值】:
每次迭代(Each iteration) :每次迭代时取新的值,假如50个用户都取第一条数据,称为一次迭代;完了50个用户都取第二条数据,后面以此类推。
每次出现(Each occurrence):每次参数时取新的值,这里强调前后两次取值不能相同。
只取一次(once) :参数化中的数据,一条数据只能被抽取一次。(如果数据轮次完,脚本还在运行将会报错)
(2)Unique Number格式:获得一个唯一的数据,在做某些主键属性的时候比较方便。当需要大量用户名时,我们可以参数化话用户名后的编号,将其设置为唯一的取值即可(比如5个用户并发,迭代新增10个商品,如果每个用户的Block设置的为100,那么第一个用户新增的商品编号为001010,第二个用户新增的商品编号为101110,以此类推)
(3)Iteration Number(迭代编号):适用于多用户并发,同时迭代新增相同的数据(比如,5个用户并发,迭代新增10个商品,5个用户新增的商品编号都为001~010)
多用户并发,主要是需要将用户名和密码(密码相同可以不用)参数化。通常使用file格式,将用户名和密码对应起来。
并且选择下一行设置为“Unique”,更新值的时间设置为“Once”。
==注意:==不同用户之间数据不同,所以可能还需要对其他的数据也进行参数化,否则,并发可能会失败。
例如,现在有5个用户,迭代10次,并发新增商品,从001开始。每个Vuser的块大小设置的为100。
那么用户1新增的商品为001-010,用户2新增的商品为101-110,以此类推。
虽然只迭代了10次,但是用户1的块大小为100,他所分配的商品为001~100,所以用户2是从101开始的。
以单据导入为例,单据上传成功后,会返回”文件上传成功“的报文,但是导入文件完全导入成功,并不会返回报文。
因此需要手动查询导入记录,查看最上面一条记录的导入文件处理状态来判断文件是否导入成功。
在脚本回放之后,找到查询单据导入记录的请求,通过快照查看请求返回的报文
需要判断是第一行导入记录的文件处理状态,所以找到对应的文件处理状态字段,通过其左右边界进行关联
// 判断单据导入是否“处理成功”的参数
int retcode_sucess;
int retcode_fail;
// 开启单据导入的事务
lr_start_transaction("单据导入");
// 关联
web_reg_save_param("status",
"LB=fileStatus\":\"",
"RB=\",\"totalRows",
"Ord=1",
"NotFound=ERROR",
"Search=All",
LAST);
// 将返回报文中的“导入文件处理状态”转码为UTF8,避免获取的中文为乱码
lr_convert_string_encoding(lr_eval_string("{status}"), LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"fileStatus");
// 比较获取到的“导入文件处理状态”是否为处理成功,是的话retcode为0
retcode_sucess = strcmp(lr_eval_string("{fileStatus}"), "处理成功");
retcode_fail = strcmp(lr_eval_string("{fileStatus}"), "处理失败");
if (retcode_sucess == 0){
lr_end_transaction("单据导入",LR_PASS);
return 0;
}
// 当retcode_fail为0时,即获取到的“导入文件处理状态”为处理失败,事务失败
else if (retcode_fail == 0){
lr_end_transaction("单据导入",LR_FAIL);
return 0;
}
(1)如果只是对测试环境中的系统进行性能测试,可以和开发沟通,暂时将验证码屏蔽或者将验证码生成全部改成相同的字符。
(2)通过url+base64加密后的账号密码(不过这个具体要看后端是否支持这样)
比如:
// 账号和密码
{
"username": "A001",
"password": "123456"
}
通过Base64 encode为:
ewoJInVzZXJuYW1lIjogIkEwMDEiLAoJInBhc3N3b3JkIjogIjEyMzQ1NiIKfQ
在url后面加上 ?spm=ewoJInVzZXJuYW1lIjogIkEwMDEiLAoJInBhc3N3b3JkIjogIjEyMzQ1NiIKfQ 便可以直接登录绕过验证码
// 获取token
web_reg_save_param("session",
"LB=access_token\":\"",
"RB=\",\"domain",
"Ord=1",
"NotFound=ERROR",
"Search=All",
LAST);
// ...登录
// 自动填入token
web_add_auto_header("Authorization",
"Bearer {session}");
// 将返回报文中的“导入文件处理状态”转码为UTF8,避免获取的中文为乱码
lr_convert_string_encoding(lr_eval_string("{status}"), LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"fileStatus");
// 比较获取到的“导入文件处理状态”是否为处理成功,是的话retcode为0
retcode_sucess = strcmp(lr_eval_string("{fileStatus}"), "处理成功");
retcode_fail = strcmp(lr_eval_string("{fileStatus}"), "处理失败");
唯一编号
当参数话设置为“唯一编号”,且更新值时间设置为“Each iteration”时
如果新建块在Run之中,那么迭代的时候,上面的设置并不会起效果,迭代10次,始终都是001
有三种解决办法
可以先看一下浏览器的版本是否太新,如果太新,建议重新下个旧些的。
如果版本没有问题,录制后脚本还是为空,可以试试边开启Fiddler边进行脚本的录制。
可以把用到的参数或者数据打印在控制台,方便回放的时候调试
lr_output_message(lr_eval_string("A{num}"));
用于组织、驱动、管理和监控负载测试
添加脚本文件后,便会进入设计页面,为了做脚本运行前的场景设计
设置并发的用户数,同时启动还是间隔启动。持续时间是按完成前一直运行(可设置多次迭代)还是持续时间。
有助于您查看、分析和比较性能结果。
脚本在controller跑完后,点击分析结果,即可进入Analysis
主要包含了摘要报告和图
包含了: