【读书笔记】《深入性能测试-LoadRunner性能测试》【第6
6.1 检查点
6.1.1 插入检查点的原因
以登录场景为例,当登录失败时,接口其实已经返回了相应的error code,可是因为我们在 Vuser -> Run-Time Settings里的 Error Handling 里选中了 Continue on error,所以虽然出错了,但是登录事务却仍然执行完成了,再加上我们的事务结束函数里一般设置的是AUTO,如下:
lr_end_transaction("用户登录", LR_AUTO),因此系统仍然判定该事务 PASS。
所以我们需要手工增加返回值检查,否则场景运行时的统计分析结果就完全错了。
6.1.2 插入检查点
我们可以把脚本视图切为“Tree View”模式,然后右键单击需要插入检查点的位置,在右键菜单里选择 Insert After... 或者 Insert Before...,但是我们在实际应用中,都不是录制脚本,而是直接写,所以参见下节;
6.1.3 检查点函数
web_find() 和 web_reg_find():
(1)前者是普通函数,后者是注册函数;
(2)前者需要在 Run-Time Settings -> Internet Protocol -> Peferences 窗口勾选上 Enable image and text check 才可用,后者没有这个限制;
(3)前者录制时只能基于 HTML 模式录制的脚本中,而后者没有这个限制;
(4)前者是在返回页面内容显示出来以后才能查找,后者在缓存中查找;
(5)后者执行效率比前者高;
6.1.4 通过检查点判断事务结束状态
web_reg_find("Text=LR_Test", //设置需要查找的 String
"SaveCount=apptype_count", //将查找到的次数存入该变量
LAST)
//lr_eval_string 函数读取 apptype_count 的值是字符型,通过 atoi 转换为整型,才能跟 1 比较
if (atoi(lr_eval_string("{apptype_count}")) >= 1) {
lr_end_transaction("myMerchantList",LR_PASS);
}
else{
lr_end_transaction("myMerchantList",LR_FAIL);
}
6.2 Block(块)技术
LoadRunner 如何在一个脚本中实现不同事务、不同次数的循环或不同百分比的循环呢?
General: Run Logic在某些复杂场景里,你也许需要用到这样的设置。可以在上面的对话框里设置。你也能选中 Block,点击 Properties 对话框,去设置 Sequential 的次数或者 Random 的百分比。
目前,我在实际应用中还未应用到。
6.3 参数化技术
脚本参数化,就是用参数去取代脚本里的常量。参数的来源可以是文本文件,也可以是数据库。参数化的过程体现了数据驱动的思想,即将测试脚本与测试数据剥离开。
6.3.1 参数化的原因及条件
原因:
(1)减小脚本的数量,如果写死常量的话,那必须得复制并修改大量的脚本;
(2)模拟真实场景,每个 Vuser 使用不同的参数值来模拟;
需要进行参数化的一些情况:
(1)日期时间类的常量;
(2)唯一性约束。比如 User ID,Order ID 等在数据库里被作为主键的;
(3)数据约束。指在测试过程中要求提交的业务数据必须是每次都不同,比如动态 token;
(4)缓存数据约束。如果不参数化,每次查询条件都用一样的,从数据库里查询到的结果也就是一致的,所以系统就直接从缓存读取了,而不需要从硬盘将数据读到缓存。导致这样测出来的时间不是真实的响应时间。
6.3.2 创建参数
选中需要被参数化的常量并右键单击,选择“Replace with a parameter”,打开“Select or Create Parameter”对话框
Select or Create Parameter在上述对话框里设置成功一个参数后,会在脚本保存的根目录下自动生成一个参数化文件(.dat)
这里需要注意两点:
(1)参数化文件可以与脚本分离,单独保存在一个参数文件夹,同一套脚本可以共用;
(2)如果多个参数是成组使用的话,可以合并成一个参数化文件;
6.3.3 参数类型属性
常用的:
Date/Time / Random Number / File
注意:随机数设置项里,显示的格式也可以自定义,比如设成:%03lu,则表示不管随机数为多少,都用3位来表示,如随机数为3,那么显示的结果为003。
不常用的:
Group Name / Iteration Number / Load Generator Name / Unique Number / Vuser ID
6.3.4 数据文件
Parameter Properties 1. File path:Browser 设置
用来选择参数文件的路径,需要注意的是,默认参数化时文件是保存在脚本根目录下的,但如果单独放到参数化文件夹下了,就需要选择参数的路径。不过在实际应用中,建议将 File path 设置为相对路径,将脚本的根目录用“.”来代替。
2. Edit with Notepad 设置
记事本打开后,内容中第一行是参数名称,第二行是参数的初始值。参数之间用逗号隔开。你也可以直接用 UltraEdit 或 Notepad++ 打开.dat文件编辑。
3. Select column 设置
指明参数选择的列,实际应用中建议用 By name,直观不易选错。
4.File Format - Column 设置
参数列一般用默认的逗号作为分隔符,也可以选择 Tab 或 空格分隔。
5.File Format - First data 设置
设置成N,就从列标题后的第 N 行开始执行。
6. Select next row 设置
针对 Controller 运行时的 Vuser,决定 Vuser 选择参数的过程。
(1)顺序 Sequential。如果参数化文件中的数据都执行了一遍,则返回到第一行继续执行。
(2)随机 Random。随机读取参数数据。
(3)唯一 Unique。分配一个唯一的有顺序的值给每个 Vuser 作为参数。
当选中了 Unique 时,下面两个选项变为可用状态:
3.1 When out of values:表示当参数不够时的3种处理方式:
3.1.1 Abort Vuser:忽略剩下的所有 Vuser 不再运行
3.1.2 Continue in a cyclic manner:将参数继续循环一次,Vuser 按顺序参数进行迭代
3.1.3 Continue with last value:一直使用最后一个数据进行后面的迭代
3.2 Allocate Vuser values in the Controller:指在 Controller 运行时,2种分配参数的方式:
3.2.1 Automatically allocate block size:由 LoadRunner 自动分配每个 Vuser 使用的参数情况
3.2.2 Allocate XXX values for each Vuser:为每个 Vuser 分析所设置的虚拟用户。
(4)Same link as ***:与某个已定义好的参数取同一行值。要求至少其中的一个参数必须是 Sequential、Random 或 Unique。
(5)Update value on 设置:设置脚本迭代过程中取值的策略,可以在调试脚本的日志中查看表现。
5.1 Each iteration:在同一个迭代过程中,不管同一个参数出现多少次,都只使用同一个值。实际应用中要注意,经常会没选这个值,导致同一个 Action 里上下午接口出错;
5.2 Each occurrence:每次迭代的过程中,参数的值都会更新;
5.3 Once:同一个 Vuser 中一直取同一个值,表中其他的数据不参与迭代过程。
6.3.5 导入数据
LoadRunner 允许利用参数化从数据库里导入数据,提供了两种方式:Microsoft Query 和 指定数据库连接字符串和 SQL 语句,后者在我的实际应用中较多。
(1)在 Parameter Properties 对话框点击 Data Wizard 按钮,则会打开下面的对话框;
Database Query Wizard(2)打开创建新数据源对话框:
创建新数据源(3)现在本机安装 mysql-connector-odbc-3.51.20-win32,在下面的驱动程序列表里就能看到对应的 MySQL ODBC 3.51 Driver。
MySQL ODBC 3.5.1 Driver(4)输入相应的 DB server IP,正确的用户名和密码,就能在 Database 下拉列表里看到相应的数据库。
DB Information(5)数据源建立成功后,可以在选择数据源对话框选择你创建的数据源,然后在下面对话框里的“SQL statement” 编辑框里输入你要查询数据的 SQL,点击 Finish。再稍等片刻(取决于你查询数据量的大小),就能在参数化文件里看到相应的数据了。
Specify SQL statement6.4 关联技术
LoadRunner 中的关联技术一直以来是我不太理解,为什么要跟参数化分开来看。按我个人的理解:“关联”其实可以看做参数化的动态赋值方法。上一节中说的是在脚本执行前给某个参数预先赋值,而“关联”可以说就是在脚本执行时,动态从服务端获取到值,再赋予某个参数。
好了,以上是我个人的疑惑和不解。我们还是先回到书上吧。
6.4.1 关联的原理
关联(Correlation)是把脚本中某些写死的数据(hard-coded)转变成取自服务器返回的、动态的、每次都不一样的数据。常用关联技术:录制中关联、录制后关联和手动关联。
LoadRunner 关联是通过左右边界值来查找服务器返回给客户端的值。
6.4.2 手动关联
我在应用中只使用手动关联,因为比较灵活快捷。常用的关联函数:
web_reg_save_param("userid", //创建变量名称。将
"LB=\"userId\":\"", //需要获取到的动态值的左边界值
"RB=\",", //需要获取到的动态值的右边界值
"Search=Body", //指定在Body 缓冲区中查找
"ORD=ALL", //不填及默认值为1,指查找待匹配的内容第一次出现时,就保存到变量里。设为All 时,是将所有符合条件的值保存在一个数组里。
LAST); //结束参数的标志
理论上关联与参数化的区别:
(1)数据处理方式不同,参数化的数据是由客户端向服务器提交的,而关联是需要获取服务器返回客户端的数据。
(2)处理的数据是否确定,参数化数据是测试工程师知道的,而关联数据的内容是不清楚的。