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():
(免费领取Python自动化学习资料 工具,面试宝典面试技巧,加QQ群,785128166,群内还会大佬技术交流)
(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 如何在一个脚本中实现不同事务、不同次数的循环或不同百分比的循环呢?
在某些复杂场景里,你也许需要用到这样的设置。可以在上面的对话框里设置。你也能选中 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 设置(免费领取Python自动化学习资料 工具,面试宝典面试技巧,加QQ群,785128166,群内还会大佬技术交流)
指明参数选择的列,实际应用中建议用 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 导入数据 (海量免费测试资料加1140267353,群内还会有同行一起交流哦~)
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。
(免费领取Python自动化学习资料 工具,面试宝典面试技巧,加QQ群,785128166,群内还会大佬技术交流)
MySQL ODBC 3.5.1 Driver
(4)输入相应的 DB server IP,正确的用户名和密码,就能在 Database 下拉列表里看到相应的数据库。
DB Information
(5)数据源建立成功后,可以在选择数据源对话框选择你创建的数据源,然后在下面对话框里的“SQL statement” 编辑框里输入你要查询数据的 SQL,点击 Finish。再稍等片刻(取决于你查询数据量的大小),就能在参数化文件里看到相应的数据了。
Specify SQL statement
6.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)处理的数据是否确定,参数化数据是测试工程师知道的,而关联数据的内容是不清楚的。