LR脚本开发之参数化之一

1 脚本开发
1.1 参数化
1.1.1 为什么要参数化
如果用户在录制脚本过程中,填写提交了一些数据,比如要增加数据库记录。这些操作都被记录到了脚本中。当多个虚拟用户运行脚本时,都会提交相同的记录,这样不符合实际的运行情况,而且有可能引起冲突。为了更加真实的模拟实际环境。需要各种各样的输入,参数化输入就成为了一种不错的方法。
参数化包含以下两项任务:
1) 在脚本中用参数取代常量值(即脚本录入的唯一数据值);
2) 设置参数的属性以及数据源。
注意:不是所有常量值都需要进行参数化(具体见1.3.2节)
1.1.2 如何进行参数化
1.1.2.1 确定哪些数据要参数化
哪些数据需要进行参数化,往往对于刚开始接触一套新系统的测试人员来说,是比较复杂的。往往因为不同的理解和侧重点,不同的测试人员根据脚本代码列出的参数化对象也不一样,因此,需要对脚本进行辨识,并同时结合业务进行分析,一般参数化的步骤如下:
1.1.2.1.1 方法一
1、 了解业务及数据库表
梳理业务逻辑并理清业务发生时的数据关系,整理操作数据来源相关表和操作生成数据相关表,并进行归类(一般归为公共类和业务类,业务类中又包括依赖业务和自身业务)
如在物资供应操作中:
1) 组织单位、登录用户、仓库等,归为公共类;
2) 烟农、合同归为依赖业务类;
3) 物资种类信息、物资供应单信息归为自身业务类;

汇总分类后分析各类各自数据在数据库中的关联关系。

2、分析操作步骤和模块表单,整理归类参数化数据
其次,从录制过程来进行梳理:

201608261472142394135478.jpg LR脚本开发之参数化之一 Tester 第1张

这里我们需要填入用户名和密码
201608261472142395750134.jpg LR脚本开发之参数化之一 Tester 第2张

这里,从上述模块表单和操作中,我们分析可能需要参数化的项目:
1) 公共类
登录用户帐号

55010101

登录用户帐号ID

audfztsotsotsotsotsotso100000003

组织单位CD

组织单位ORG_UNIQUE_CD

仓库

55010101仓库

2) 业务类
供应对象编号

550101016510000000

供应对象名称

PERF10000000

身份证号

35052119851000000

物资编码

0101002

物资名称

钾肥A类

包装规格

1公斤/公斤

表单上还有诸如供应方案信息栏中的种植品种、种植面积、合同收购,物资供应信息栏的计量单位、供应数量、金额等数据,为什么没有纳入到列表里?原因很简单:在进行参数化时,能尽量少参数化对象就少参数化对象,像比如种植品种、种植面积这些,每个烟农通过合同都可以设成一样的值,计量单位、供应数量、金额也都可以设为一样的,这些对象的值可以不随着供应对象的变化而变化的,就不需要进行参数化。

好,通过上述列表,我们整理出了可能进行参数化的对象,这个时候,我们就把参数化对象的值拿到录好的脚本中查询,看是否存在该数据,如供应对象编号是:550101016510000000,


201608261472142395116976.jpg LR脚本开发之参数化之一 Tester 第3张

201608261472142396109235.jpg LR脚本开发之参数化之一 Tester 第4张

我们发现,在脚本中存在相应的数据值,且业务上来说,烟农的种植主体编号是可以变化的,那么,我们确认这个值就是我们参数化的对象。按同样方法检查脚本,数值相同的则归到一个参数化对象里,数值不同的,则新建参数化对象。
注意:
参数化前需将参数化对象名称和参数值记录下来
参数化对象

参数值

FRM_CD

550101016510000000

CERTIFICATE_NO

350521198510000000

…………………….

3、检查发现并分析脚本特殊数据:
当我们对上述比较直观的对象进行参数化后,重新检查下脚本,发现还是有一些我们没有进行参数化的对象,比如8a3c开头的值(业务程序生成的数据的主键ID默认都是8a3c开头)

201608261472142396848883.jpg LR脚本开发之参数化之一 Tester 第5张

首先,我们取一个8a3c的值进行分析,如上图中所示“materialId%22%3A%228a3c341d5180c561015184acfcd80005” 这边显示,materialid的值是8a3c341d5180c561015184acfcd80005,通过跟业务组开发人员的沟通,我们知道,materialId代表的是物资种类的ID,跟我们的操作是有关联的,我们就去找相关的表,查询是否数据库中存在该ID值
201608261472142397110208.jpg LR脚本开发之参数化之一 Tester 第6张

数据库中存在相关的记录,结合实际操作业务又发现,不同的烟农在进行物资供应的时候是会选择不同的物资的,因此,这个ID值也是一个变化的值,所以8a3c341d5180c561015184acfcd80005这个值也是我们一个需要参数化的对象。脚本里相同值我们都归为一个参数化对象MATERIAL_ID并记录在表格里。
记录后继续检查下一个怀疑对象。

4、 整合SQL
对上述两点的分析结果进行整合,开发SQL脚本查询LR使用的数据组合并导出成DAT文件供LR参数化使用
如MS_MA_WZGY_FARMER.DAT文件中我们整合了烟农的编号,身份证号,姓名,归属行政区划。(注:这里ORG_UNIQUE_CD主要用来备注烟农的归属组织单位,以用来与登录单位使用的DAT进行关联对应,不具体用来参数化)

201608261472142398308518.jpg LR脚本开发之参数化之一 Tester 第7张

5、对具体数据值进行参数化:
如将脚本中的550101016510000000替换成参数化对象FRM_CD

201608261472142398824993.jpg LR脚本开发之参数化之一 Tester 第8张

使用鼠标右键中的替换方式(具体见2.1.2.2节)或手工替换成{FRM_CD}的方式对所有的550101016510000000的值进行替换。其他参数化对象也按这种方式进行参数化。
注意:
由于不同的action中都会出现550101016510000000这个烟农值,所以,我们要检查所有的action并进行替换,避免遗漏。

注意:
在参数化对象中,我们往往会发现我们需要替换的数据值比较相似,比如55010101,5501010165100000000,55010100000000000001,当在同一个脚本中这三个值都出现的时候,我们在进行替换的时候首先找长度最长的进行替换5501010165100000000,然后再逐长度递减替换,这样做的目的是为了避免我们在替换55010101的时候,把本该是别的参数化对象的值替换成了类似{ORG_CD}65100000000,这样,在替换{FRM_CD}值的时候,我们就惊奇的发现,整个脚本中不存在可替换的对象了。
1.1.2.1.2 方法二
录入脚本只代表你使用的一串相关数据所做的操作,是否需要参数化从脚本中无法直观的看出,因此,可以采用同一模块操作录制两套脚本进行对比的方法分析需要进行参数化的对象。
那如何录制两套可以进行对比的脚本呢?我们拿具体的例子来进行分析:

201608261472142399117823.jpg LR脚本开发之参数化之一 Tester 第9张

这里是物资供应模块,两套脚本录制使用相同的登录帐号进入到模块中,接下来,我们分析下这个模块的要素:
1) 需要录入种植主体;
2) 需要选择物资。
开始结合实际业务进行分析,提出疑问:在实际操作中,录入的种植主体是否相同?选择的供应方案是否一致?物资是不是也是五花八门?答案是肯定的,可以不一样。

好吧,那这个时候,录制脚本我们采用不同的种植主体,不同的物资进行录制,录制完成后保存下来进行对比:
1) 首先我们根据录制脚本中的注释(在录制过程中,我在准备录制供应单基本信息、准备录制供应方案信息和准备录制物资供应信息前都加了注释来说明注释后的脚本请求是属于哪个信息栏的)

201608261472142400943451.jpg LR脚本开发之参数化之一 Tester 第10张

201608261472142400137825.jpg LR脚本开发之参数化之一 Tester 第11张

这样,我们具体分析下每个信息栏的请求,首先分析“供应单基本信息录入”,我们会发现两个不同种植主体编号的录入结果不一样
201608261472142401472343.jpg LR脚本开发之参数化之一 Tester 第12张

因此,我们可以确定,这是一个可以进行参数化的对象。
2)接下来,我们根据这种思路,在对比分析不同的注释下提交的请求脚本,我们发现,在物资供应信息栏的相关代码下,物资种类的ID和物资规格的ID也不相同
201608261472142402253726.jpg LR脚本开发之参数化之一 Tester 第13张

我们可以确定,还有物资种类和规格需要进行参数化。
3)查询同一个脚本中是否还存在与发现的参数化对象相同的数值(如种植主体的CD值“5501010165100000”在一个录制脚本中会多次出现),统一将这些脚本中的value值归为一个FRM_CD的参数化对象并全部进行替换。
201608261472142402634180.jpg LR脚本开发之参数化之一 Tester 第14张

1.1.2.2 参数化方法
1、方法一:
选中要参数化的数值,右键---【Replace with a new parameter
201608261472142403277018.jpg LR脚本开发之参数化之一 Tester 第15张

201608261472142404374190.jpg LR脚本开发之参数化之一 Tester 第16张

2、方法二:
菜单【insert】----【new Parameter…
1.1.2.3 添加参数化数据的几种方式

201608261472142404627425.jpg LR脚本开发之参数化之一 Tester 第17张

1.1.2.3.1 方式一:通过Create Table****编辑数据
201608261472142405353478.jpg LR脚本开发之参数化之一 Tester 第18张

201608261472142405531945.jpg LR脚本开发之参数化之一 Tester 第19张
201608261472142405531945.jpg LR脚本开发之参数化之一 Tester 第19张

点击Create Table 会出现表格,在表格,再次点击Edit with Notepad ,然后会打开一个记事本,我们可以对记事本进行添加数据
201608261472142406618439.jpg LR脚本开发之参数化之一 Tester 第20张

1.1.2.3.2 方式二:通过dat文件添加数据
参数化类型选择“file”

201608261472142407209770.jpg LR脚本开发之参数化之一 Tester 第21张

点击File输入框后面的“Browse..”按钮,找到本地的dat数据文件,进行添加就可以了。
201608261472142407107241.jpg LR脚本开发之参数化之一 Tester 第22张

需要注意的是,文件里面的数据不要乱写,每条数据一行,不然会读取有误。
1.1.2.3.3 方式三:****其他类型设置
如果我们要参数化的不是一个文件,比如是特定的日期时间,可以从Parameter type 列表中进行选择
201608261472142408109282.jpg LR脚本开发之参数化之一 Tester 第23张

201608261472142409361241.jpg LR脚本开发之参数化之一 Tester 第24张

这里可以设置日期时间格式,循环迭代方式,不过除了file类型外,其他用的不多。

1.1.2.4 参数化之间的关联
假设我们已经对用户名进行了参数化,或对密码进行了参数化,这样是不是脚本就能正常跑了,不好说。因为用户名和密码不是一一对应关系,每次运行脚本时取的用户名和密码没有对应上的话肯定就会出问题。
假设,我们已经对用户名已经进行了参数化,参数名为【username】,下面设置密码参数化与用户名关联。

201608261472142409220785.jpg LR脚本开发之参数化之一 Tester 第25张

点击“Properites…”会打开编辑用户名参数化窗口。File列表框中,刚才保存用户名信息的文件"username.dat"。
201608261472142410128492.jpg LR脚本开发之参数化之一 Tester 第26张

点击“Add Column…”,添加新的一列信息,用于放置密码。
201608261472142411533681.jpg LR脚本开发之参数化之一 Tester 第27张

点击“Edit with Notepad”再次编辑参数化数据文件,使用户名密码建立一一对应关系。
201608261472142411662422.jpg LR脚本开发之参数化之一 Tester 第28张

完成之后,我们已经成功对用户名和密码进行了参数化,并且让用户名和密码形成了对应关系。

1.1.2.5 参数化列表说明

201608261472142412905714.jpg LR脚本开发之参数化之一 Tester 第29张

常用类型:
n File: 来自某文件,该文件需要符合一定格式
n Date/Time: 日期时间,可定制格式。
n Random Number:随机值
n Unique Number: 唯一值,设置起始值,范围,注意使用次数不要超过范围

Ø Select Next Row
Sequential/Random/Unique/Same Line as
按顺序/随机/唯一/和XX同一行取值
Ø Update value on
Each Iteration/Each occourrence/Once
每次迭代更新/每次碰到更新/只取一次
Ø When Out Of Value
ü 当Select Next Row=Unique时可设置
Abort Vuser/Continue in a cyclic manner/Continue with last value
退出用户/循环使用/使用最后那个值继续
Ø Allocate Vuser values in the controller
ü 当Select Next Row=Unique时可设置
Automatically allocate block size
自动为每个用户分配参数值数量
Allocate XX values for each vuser
固定为每个用户分配多少值

1.1.2.6 数据分配与更新方式组合**** ****参数化举例
参数化过程比较简单,参数化时复杂的是对参数属性的设置。主要是以下两个属性的组合。
Ø 数据分配(select next row )有三个选项: Sequential(顺序读取)、Random(随机读取)、Unique (唯一)
Ø 数据更新(update the value)也有三个选项: Each Occurrence(每次遇到 )、 Each iteration(每次迭代 )、 Once(一直 )
这两个属性可以有九种组合方式,每种方式都不一样,总结一下就是:
sequential为顺序取,每个用户均从第一个参数开始取值。
Unique为唯一,每个用户取值均不同。
Random 为随机,每个用户均随机取值。

1.1.2.6.1 参数化脚本
Action()
{
lr_error_message("ID = %s", lr_eval_string("{param}"));
return 0;
}
1.1.2.6.2 参数化文件

201608261472142412121309.jpg LR脚本开发之参数化之一 Tester 第30张

1.1.2.6.3 场景设计
如下图所示
迭代次数:3次
并发用户数:2个
201608261472142413125019.jpg LR脚本开发之参数化之一 Tester 第31张

1.1.2.6.4 运行结果
以下为9种组合的测试结果:
(1)sequential Once
2个用户 每个用户取值均一样,每个用户的所有迭代中的取值均一样。

迭代1

迭代2

迭代3

用户1

1

1

1

用户2

1

1

1

(2)unique once
2个用户 每个用户取值都唯一,每个用户的所有迭代中的取值均一样。

迭代1

迭代2

迭代3

用户1

1

1

1

用户2

2

2

2

(3)Random Once
2个用户,每个用户为随机取值,每个用户的所有迭代中的取值均一样。

迭代1

迭代2

迭代3

用户1

3

3

3

用户2

5

5

5

(4)Sequential Each iteration
2个用户,每个用户取值均一样,每个用户每次迭代取一个新值。

迭代1

迭代2

迭代3

用户1

1

2

3

用户2

1

2

3

(5)Unique Each iteration
2个用户 每个用户取值都唯一,每个用户每次迭代取一个新值。

迭代1

迭代2

迭代3

用户1

1

2

3

用户2

4

5

6

(6)Random Each Iteration
2个用户,每个用户为随机取值,每个用户每次迭代均随机去一个值。

迭代1

迭代2

迭代3

用户1

3

5

1

用户2

5

2

4

(7)Sequential Each ocurrance
2个用户,每个用户取值均一样,每个用户每次遇到均取一个新值。

迭代1

迭代2

迭代3

用户1

1

2

3

用户2

1

2

3

(8) unique Each occurrance
2个用户,每个用户取值都唯一,每个用户每次遇到均取一个不同的值。

迭代1

迭代2

迭代3

用户1

1

2

3

用户2

4

5

6

(9) Random Each Occurrence
2个用户,每个用户为随机取值,每个用户每次遇到均随机去一个值

迭代1

迭代2

迭代3

用户1

3

5

1

用户2

5

2

4

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

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,800评论 6 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,497评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,053评论 25 707
  • 在学堂教书时,我对很多经典爱不释手,5000年的中华传统文化,它是那么的悠久,随着社会发展,更多的人开始关注我们老...
    采之言阅读 11,545评论 4 4