软件测试轻松玩转-LoadRunner性能测试(六)脚本编写

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():

(海量免费测试资料加1140267353,群内还会有同行一起交流哦~)
(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 设置(海量免费测试资料加1140267353,群内还会有同行一起交流哦~)
    指明参数选择的列,实际应用中建议用 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。

(海量免费测试资料加1140267353,群内还会有同行一起交流哦~)

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); //结束参数的标志

(海量免费测试资料加1140267353,群内还会有同行一起交流哦~)

正则表达式

理论上关联与参数化的区别:

(1)数据处理方式不同,参数化的数据是由客户端向服务器提交的,而关联是需要获取服务器返回客户端的数据。
(2)处理的数据是否确定,参数化数据是测试工程师知道的,而关联数据的内容是不清楚的。

猜你喜欢

转载自blog.csdn.net/PythonCS001/article/details/107559217