loadrunner性能测试总结

在使用loadrunner12过程中总结的一些心得,希望能够帮助到你们。

Loadrunner性能测试

​ LoadRunner,是一种预测系统行为和性能的负载测试工具。通过模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整个企业架构进行测试。企业使用LoadRunner能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。

一、Loadrunner11和12支持的浏览器

  • Loadrunner11 最高ie9、旧版本的火狐或谷歌浏览器
  • Loadrunner12 最高ie11、旧版本的火狐或谷歌浏览器

火狐和谷歌浏览器录制的时候,最好同时开启Fiddler。

二、下载和安装

版本:loadrunner12.02

链接: https://pan.baidu.com/s/1dWvnknMuLZW3LHahl5sgMA 提取码: vjrs

文档里有详细的安装步骤

三、Loadrunner三大组件

用大白话就是:录脚本的、跑脚本的、分析结果的

  1. Virtual User Generator:(虚拟用户生成器) 它是用于创建Vuser脚本的HP工具. 可以使用VuGen通过录制用户执行的典型业务流程来开发Vuser脚本. 使用此脚本可以模拟实际情况. 它只能在Windows平台上录制Vuser脚本 , 但录制的Vuser脚本可以在Windows和Linux平台上运行.
  2. Controller: (控制器) 使您可以从单一控制点轻松 , 有效地控制所有的Vuser , 并在测试执行期间监控场景性能.
  3. Analysis: (分析器) 在HP LoadRunner Controller 或 HP Performance Center 内运行负载测试场景后可以使用Analysis. Analysis图可以帮助您确定系统性能并提供有关事物及Vuser的信息. 通过合并多个负载测试场景的结果或将多个图合并为一个图 , 可以比较多个图.

四、VuGen录制与回放(重点)

1.新建脚本

一般对于常见的应用软件,可以根据软件的结构来选择协议:

  • B/S 结构,选择WEB(Http/Html)协议
  • C/S结构,可以根据后端数据库的类型来选择,如SybaseCTLib协议用于测试
  • 后台的数据库为Sybase的应用;MS SQL Server协议用与测试后台数据库为 SQL
  • Server的应用;对于一些没有数据库的Windows应用,可选用Windows Sockets底层协议。
    在这里插入图片描述

2.脚本编辑页面

在这里插入图片描述

3.录制前准备

红色按钮或者Ctrl+R开启录制(要录制的URL地址不要填错)
在这里插入图片描述

4.录制选项

把支持字符集UTF-8勾上,否则录制出来的脚本,中文可能乱码
在这里插入图片描述

5.开始录制

可以在录制的过程中添加事务(方便计算事务的响应时间)和集合点(方便并发同时进行)
在这里插入图片描述

6.生成脚本

录制结束后,自动生成脚本
在这里插入图片描述

7.编辑脚本

可以对脚本进行自定义编辑,比如:添加cookie、参数话、关联、检查点等

具体查看–>五、优化脚本

8.回放

点击回放按钮,可以让脚本重新发送我们录制过的WEB请求

img

结束后的界面,绿色代表回放成功,红色代表脚本执行失败

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.

五、优化脚本

1.事务开启和结束

事务作为性能测试的重要指标,如果不添加事务,无法统计对应接口的事务响应时间

// 事务的开始	
lr_start_transaction("login", LR_AUTO); 

// ...事务

// 事务的结束
lr_end_transaction("login", LR_AUTO); 
  • LR_AUTO:事物的状态被自动设置,如果事务执行成功,状态设置为PASS,如果执行失败,状态设置为FAIL,如果由于异常中断,状态被设置成STOP.
  • LR_PASS:事务如果执行成功,代码的返回状态就是PASS。
  • LR_FAIL:事务如果执行失败,代码的返回状态就是FAIL。

事务还可以与关联检查点结合使用,来判断事务的结束

2.集合点

lr_rendezvous(“集合点名称”);

​ 认识集合点之前我们先看看普通的压力测试:普通的压力测试是哪一个请求ready了 就发出去(比如我们设置是1000并发用户登录 没有设置集合点 这种情况下可能某个时候loadrunner中ready的请求有30个了 他也会发送出去这30个请求)。

​ 设置了集合点的并发测试:比如100并发登录 有设置集合点 那么loadrunner会等有100个请求ready了才会一起将这100请求同时提交给服务器处理。

注意:集合点可以放在事务外面/里面都可以 如果放在事务里面可能会导致统计的事务响应时间过长 所以一般是将集合点放置在事务外面的

场景中设置集合点策略

在这里插入图片描述
集合策略的设置
在这里插入图片描述

3.关联

web_reg_save_param()函数

​ 所谓的关联(correlation)就是把脚本中某些写死的(hard-coded)数据,转变成是撷取自服务器所送的、动态的、每次都不一样的数据。

由于自动关联很不靠谱,人还是比机器更智能,所以我们只介绍手动关联,手动关联的执行步骤大致如下:
1、使用相同的业务流程与数据,录制二份脚本
2、找出两份脚本中不同的地方
3、确定脚本中有差异的地方是否需要关联
4、确定关联函数的插入位置
5、使用web_reg_save_param函数手动建立关联
6、参数化要关联的动态值
7、回放脚本验证关联是否成功 在这里插入图片描述在这里插入图片描述

​ 因为web_reg_save_param函数为注册函数,必须在动态值的前面,相当于先声明,后作用。注意:并不是在动态值的前面就行了,一定得在该动态值所属的请求前。

4.检查点

web_reg_find()函数

​ VuGen是根据服务器端返回的状态码来判断脚本是否执行成功,如果状态码为200,那么VuGen就认为是成功了。但是脚本未必执行成功,因为大多数的系统出错未必会返回错误页面,而是返回消息提示框。比如录制的注册脚本,同样的用户名每次都显示是执行成功,但是同样的用户名显然是不可能每次都能注册成功,这个时候就需要添加检查点,对服务器返回的内容进行检查,比如验证网页上是否存在指定的Text或者Image。

注意:

  1. 该函数为注册函数,一定要写到请求前面
  2. 函数在缓存中查找相应的内容,即无须等待html页面内容显示出来就可查找
    在这里插入图片描述

5.参数化

在这里插入图片描述

常用的有

(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,以此类推)

img

(3)Iteration Number(迭代编号):适用于多用户并发,同时迭代新增相同的数据(比如,5个用户并发,迭代新增10个商品,5个用户新增的商品编号都为001~010)

img

6.并发

多用户并发,主要是需要将用户名和密码(密码相同可以不用)参数化。通常使用file格式,将用户名和密码对应起来。
在这里插入图片描述
并且选择下一行设置为“Unique”,更新值的时间设置为“Once”。

==注意:==不同用户之间数据不同,所以可能还需要对其他的数据也进行参数化,否则,并发可能会失败。

7.迭代

当更新值时间为”Each iteration“时,一次迭代中可以多次用到这个参数,且参数值都是一样的
在这里插入图片描述在这里插入图片描述

当更新值时间为”Each occurrence“时,一次迭代中若存在多个相同的参数,那么参数在一轮迭代中也会累加
在这里插入图片描述
在这里插入图片描述

每个Vuser的块大小在这里插入图片描述

例如,现在有5个用户,迭代10次,并发新增商品,从001开始。每个Vuser的块大小设置的为100。

那么用户1新增的商品为001-010,用户2新增的商品为101-110,以此类推。

虽然只迭代了10次,但是用户1的块大小为100,他所分配的商品为001~100,所以用户2是从101开始的。

8.例子

以单据导入为例,单据上传成功后,会返回”文件上传成功“的报文,但是导入文件完全导入成功,并不会返回报文。

因此需要手动查询导入记录,查看最上面一条记录的导入文件处理状态来判断文件是否导入成功。在这里插入图片描述

在脚本回放之后,找到查询单据导入记录的请求,通过快照查看请求返回的报文
在这里插入图片描述

需要判断是第一行导入记录的文件处理状态,所以找到对应的文件处理状态字段,通过其左右边界进行关联
在这里插入图片描述

// 判断单据导入是否“处理成功”的参数
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.登录(需要验证码)

(1)如果只是对测试环境中的系统进行性能测试,可以和开发沟通,暂时将验证码屏蔽或者将验证码生成全部改成相同的字符。
在这里插入图片描述
(2)通过url+base64加密后的账号密码(不过这个具体要看后端是否支持这样)
比如:

// 账号和密码
{
	"username": "A001",
	"password": "123456"
}

通过Base64 encode为:
ewoJInVzZXJuYW1lIjogIkEwMDEiLAoJInBhc3N3b3JkIjogIjEyMzQ1NiIKfQ	

在url后面加上 ?spm=ewoJInVzZXJuYW1lIjogIkEwMDEiLAoJInBhc3N3b3JkIjogIjEyMzQ1NiIKfQ 便可以直接登录绕过验证码

2.登录获取token

// 获取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}");
		

3.关联中文失败

// 将返回报文中的“导入文件处理状态”转码为UTF8,避免获取的中文为乱码
lr_convert_string_encoding(lr_eval_string("{status}"), LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"fileStatus");

4.关联和检查点的区别

  • 关联是为了获取动态参数,参数值是服务的随机反馈的。
  • 检查点是为了获取已知返回值,数值是固定的。
// 比较获取到的“导入文件处理状态”是否为处理成功,是的话retcode为0	
retcode_sucess = strcmp(lr_eval_string("{fileStatus}"), "处理成功");
retcode_fail = strcmp(lr_eval_string("{fileStatus}"), "处理失败");

5.迭代失败

唯一编号

当参数话设置为“唯一编号”,且更新值时间设置为“Each iteration”时
在这里插入图片描述

如果新建块在Run之中,那么迭代的时候,上面的设置并不会起效果,迭代10次,始终都是001
在这里插入图片描述

有三种解决办法

  1. 可以把更新值时间改为”Each occurrence“(这种不一定能保证按顺序迭代)
  2. 参数类型改为”迭代编号“(可以保证按顺序,并且5个用户并发,用户之间可以用相同编号)
  3. 如下图,迭代放在Run中,会起效果迭代10次,为001~010。(可以保证按顺序,但是5个用户并发,用户之间的编号是不同的)
    在这里插入图片描述

6.录制后脚本为空

可以先看一下浏览器的版本是否太新,如果太新,建议重新下个旧些的。
如果版本没有问题,录制后脚本还是为空,可以试试边开启Fiddler边进行脚本的录制。

7.调试

可以把用到的参数或者数据打印在控制台,方便回放的时候调试

lr_output_message(lr_eval_string("A{num}"));

七.Controller

用于组织、驱动、管理和监控负载测试

1.选择手动测试场景和场景中的脚本

通常选择手动场景,然后添加脚本文件
在这里插入图片描述

2.设计页面

添加脚本文件后,便会进入设计页面,为了做脚本运行前的场景设计
在这里插入图片描述

3.运行设置

  • 迭代计数(注意迭代块设置的位置)
    在这里插入图片描述

  • 日志的设置(当脚本有问题时,可以设置扩展日志,通过日志分析脚本出问题的原因)
    在这里插入图片描述

  • 思考时间(通常可以忽略思考时间)
    在这里插入图片描述

  • 其他设置
    在这里插入图片描述

4.刷新脚本

当修改过脚本后,需要在组信息中刷新一下脚本,再运行
在这里插入图片描述

5.全局计划

设置并发的用户数,同时启动还是间隔启动。持续时间是按完成前一直运行(可设置多次迭代)还是持续时间。
在这里插入图片描述

6.集合点

设置集合点以及对应的策略
在这里插入图片描述在这里插入图片描述

7.运行页面在这里插入图片描述

8.查看日志

在这里插入图片描述

9.监控服务器资源

在这里插入图片描述
点击资源图后,鼠标右键,添加度量。输入服务器ip地址
在这里插入图片描述

八.Analysis

有助于您查看、分析和比较性能结果。

1.分析结果

脚本在controller跑完后,点击分析结果,即可进入Analysis
在这里插入图片描述

主要包含了摘要报告和图

2.摘要报告

包含了事务的相关信息
在这里插入图片描述

3.图

包含了:

  1. 运行Vuser
  2. 每秒点击次数
  3. 吞吐量
  4. 事务摘要
  5. 平均事务响应时间
    在这里插入图片描述

4.筛选

点击一个图,在属性中进行设置。是否需要筛选思考时间,根据脚本的实际情况
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值