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、分析操作步骤和模块表单,整理归类参数化数据
其次,从录制过程来进行梳理:
这里我们需要填入用户名和密码
这里,从上述模块表单和操作中,我们分析可能需要参数化的项目:
1) 公共类
登录用户帐号
55010101
登录用户帐号ID
audfztsotsotsotsotsotso100000003
组织单位CD
组织单位ORG_UNIQUE_CD
仓库
55010101仓库
2) 业务类
供应对象编号
550101016510000000
供应对象名称
PERF10000000
身份证号
35052119851000000
物资编码
0101002
物资名称
钾肥A类
包装规格
1公斤/公斤
表单上还有诸如供应方案信息栏中的种植品种、种植面积、合同收购,物资供应信息栏的计量单位、供应数量、金额等数据,为什么没有纳入到列表里?原因很简单:在进行参数化时,能尽量少参数化对象就少参数化对象,像比如种植品种、种植面积这些,每个烟农通过合同都可以设成一样的值,计量单位、供应数量、金额也都可以设为一样的,这些对象的值可以不随着供应对象的变化而变化的,就不需要进行参数化。
好,通过上述列表,我们整理出了可能进行参数化的对象,这个时候,我们就把参数化对象的值拿到录好的脚本中查询,看是否存在该数据,如供应对象编号是:550101016510000000,
我们发现,在脚本中存在相应的数据值,且业务上来说,烟农的种植主体编号是可以变化的,那么,我们确认这个值就是我们参数化的对象。按同样方法检查脚本,数值相同的则归到一个参数化对象里,数值不同的,则新建参数化对象。
注意:
参数化前需将参数化对象名称和参数值记录下来
参数化对象
参数值
FRM_CD
550101016510000000
CERTIFICATE_NO
350521198510000000
…………………….
3、检查发现并分析脚本特殊数据:
当我们对上述比较直观的对象进行参数化后,重新检查下脚本,发现还是有一些我们没有进行参数化的对象,比如8a3c开头的值(业务程序生成的数据的主键ID默认都是8a3c开头)
首先,我们取一个8a3c的值进行分析,如上图中所示“materialId%22%3A%228a3c341d5180c561015184acfcd80005” 这边显示,materialid的值是8a3c341d5180c561015184acfcd80005,通过跟业务组开发人员的沟通,我们知道,materialId代表的是物资种类的ID,跟我们的操作是有关联的,我们就去找相关的表,查询是否数据库中存在该ID值
数据库中存在相关的记录,结合实际操作业务又发现,不同的烟农在进行物资供应的时候是会选择不同的物资的,因此,这个ID值也是一个变化的值,所以8a3c341d5180c561015184acfcd80005这个值也是我们一个需要参数化的对象。脚本里相同值我们都归为一个参数化对象MATERIAL_ID并记录在表格里。
记录后继续检查下一个怀疑对象。
4、 整合SQL
对上述两点的分析结果进行整合,开发SQL脚本查询LR使用的数据组合并导出成DAT文件供LR参数化使用
如MS_MA_WZGY_FARMER.DAT文件中我们整合了烟农的编号,身份证号,姓名,归属行政区划。(注:这里ORG_UNIQUE_CD主要用来备注烟农的归属组织单位,以用来与登录单位使用的DAT进行关联对应,不具体用来参数化)
5、对具体数据值进行参数化:
如将脚本中的550101016510000000替换成参数化对象FRM_CD
使用鼠标右键中的替换方式(具体见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 方法二
录入脚本只代表你使用的一串相关数据所做的操作,是否需要参数化从脚本中无法直观的看出,因此,可以采用同一模块操作录制两套脚本进行对比的方法分析需要进行参数化的对象。
那如何录制两套可以进行对比的脚本呢?我们拿具体的例子来进行分析:
这里是物资供应模块,两套脚本录制使用相同的登录帐号进入到模块中,接下来,我们分析下这个模块的要素:
1) 需要录入种植主体;
2) 需要选择物资。
开始结合实际业务进行分析,提出疑问:在实际操作中,录入的种植主体是否相同?选择的供应方案是否一致?物资是不是也是五花八门?答案是肯定的,可以不一样。
好吧,那这个时候,录制脚本我们采用不同的种植主体,不同的物资进行录制,录制完成后保存下来进行对比:
1) 首先我们根据录制脚本中的注释(在录制过程中,我在准备录制供应单基本信息、准备录制供应方案信息和准备录制物资供应信息前都加了注释来说明注释后的脚本请求是属于哪个信息栏的)
这样,我们具体分析下每个信息栏的请求,首先分析“供应单基本信息录入”,我们会发现两个不同种植主体编号的录入结果不一样
因此,我们可以确定,这是一个可以进行参数化的对象。
2)接下来,我们根据这种思路,在对比分析不同的注释下提交的请求脚本,我们发现,在物资供应信息栏的相关代码下,物资种类的ID和物资规格的ID也不相同
我们可以确定,还有物资种类和规格需要进行参数化。
3)查询同一个脚本中是否还存在与发现的参数化对象相同的数值(如种植主体的CD值“5501010165100000”在一个录制脚本中会多次出现),统一将这些脚本中的value值归为一个FRM_CD的参数化对象并全部进行替换。
1.1.2.2 参数化方法
1、方法一:
选中要参数化的数值,右键---【 Replace with a new parameter】
2、方法二:
菜单【insert】----【new Parameter…】
1.1.2.3 添加参数化数据的几种方式
1.1.2.3.1 方式一:通过Create Table****编辑数据
点击Create Table 会出现表格,在表格,再次点击Edit with Notepad ,然后会打开一个记事本,我们可以对记事本进行添加数据
1.1.2.3.2 方式二:通过dat文件添加数据
参数化类型选择“file”
点击File输入框后面的“ Browse..”按钮,找到本地的dat数据文件,进行添加就可以了。
需要注意的是,文件里面的数据不要乱写,每条数据一行,不然会读取有误。
1.1.2.3.3 方式三:****其他类型设置
如果我们要参数化的不是一个文件,比如是特定的日期时间,可以从 Parameter type 列表中进行选择
这里可以设置日期时间格式,循环迭代方式,不过除了file类型外,其他用的不多。
1.1.2.4 参数化之间的关联
假设我们已经对用户名进行了参数化,或对密码进行了参数化,这样是不是脚本就能正常跑了,不好说。因为用户名和密码不是一一对应关系,每次运行脚本时取的用户名和密码没有对应上的话肯定就会出问题。
假设,我们已经对用户名已经进行了参数化,参数名为【username】,下面设置密码参数化与用户名关联。
点击“ Properites…”会打开编辑用户名参数化窗口。 File列表框中,刚才保存用户名信息的文件" username.dat"。
点击“ Add Column…”,添加新的一列信息,用于放置密码。
点击“ Edit with Notepad”再次编辑参数化数据文件,使用户名密码建立一一对应关系。
完成之后,我们已经成功对用户名和密码进行了参数化,并且让用户名和密码形成了对应关系。
1.1.2.5 参数化列表说明
常用类型:
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 参数化文件
1.1.2.6.3 场景设计
如下图所示
迭代次数:3次
并发用户数:2个
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