【读书笔记】《深入性能测试-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 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)处理的数据是否确定,参数化数据是测试工程师知道的,而关联数据的内容是不清楚的。

【下一章】

【目录】

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容