在Loadrunner录制脚本及执行的过程中,经常会用到变量参数化来进行一些不同组合及唯一性值的设定,对于Loadrunner参数化的文章也很多,在此也不在繁述,今天我们就探讨下如何更高效的进行Loadrunner参数化,以更好的提高工作效率。
很多人在接触参数化时,都多少有这这样的困扰:我的参数化设置执行结果和我预期的结果有很大区别!在很多系统中对数据唯一性要求很高的话,我们会经常碰到这样的情形:我的脚本成功执行完毕,但是到后台一查数据却发现,数据没有执行进入系统,这样的测试案例根本无法对系统性能进行评估。
首先我们先看一下再Loadrunner参数管理器中的2个设定项select next row和update value on,很多朋友在刚开始接触参数化时会对这2个设定项产生混淆,我们可以从2个特定的维度和覆盖角度进行理解:
Select next row是针对于所有vu的取值方式进行限定的,此指标是针对于全局的
Update value on是针对每一个用户每一次循环过程中如何更新值进行限定的
根据上面的定义,我们来逐个对这2个设定项内的选项进行说明
Select next row
Sequential:所用用户分配相同参数,以顺序方式进行分配
Random:所有用户分配随机参数,以随机方式进行分配
Unique:所有的用户分配不同参数,以顺序方式进行分配
Update next row
Each iteration:当前循环内值不变
Each occurrence:当前循环内只要触发就进行值的更新
Once:执行过程中不更新(即在脚本执行前进行取值,然后在执行过程中均取该值)
然后我们就可以根据这样的句式来理解参数分配的方式:当脚本开始时,为< --select next row -- >,在< -update
next row -- >。通过这样的方式对在执行过程中参数分配方式可以有更直观的理解;
下面我对以上的选项做一个排列组合,供大家参考
Sequential
Random
Unique
Each iteration
所有vu均取参数列表的第一行,在循环结束后取第二行
所有vu随机选取参数列表内参数,在循环结束后取第二个随机数
所有vu按顺序取不同值,在循环结束后取下一个未被使用的值
Each occurrence
所有vu均取参数列表的第一行,在当第二次出现时取第二行值,即使在同一迭代内
所有vu随机选取参数列表内参数,在当第二次出现时取第二个随机数,即使在同一迭代内
所有vu按顺序取不同值,在第二次出现时取下一个未被使用的值,即使在同一迭代内
Once
所有用户取参数列表的第一行,在脚本执行过程中均为该值
所有用户随机选取参数列表内唯一参数,在脚本执行过程中均为该值
所有vu按顺序取不同值,在脚本执行过程中均为该值
在参数设置的过程中,可能会遇到参数列表内数据量小于(VU*循环数)的情况,若可能出现该情况的组合中,参数管理器中会出现when out of
value选项,来配置参数用尽后的操作方式,我们可以选择退出vu,从新轮循以及使用最后一个值,根据测试需求设定即可
对于Allocate
Vuser values in the Controller选项一般情况下默认选择Automatically
allocate block size即可,若选择手动设定则block size的数量需于脚本循环数对应。
以上对Loadrunner参数化设置进行了说明,现在我们再来看一些在实际使用过程中比较实用的参数设置方式
Iteration Number:返回当前循环次数
UserID:返回当前VU的ID值
Group Name:返回次脚本在当前场景内Group名称
Load Generator Name:返回脚本执行的测试机名称
在脚本参数化的过程中,以参数的应用对脚本执行回馈有着很大的帮助,在脚本执行完毕后如果需要查询和统计每个VU的参数取值以及执行情况,则这些参数化的使用将使你受益良多。
其次由于以上参数类型具有一定的唯一性,可以通过适当的组合来获得一组有规则可循的唯一值,在后期性能分析过程中的数据分析阶段事半功倍。
例如我们可以用UserID+Iteration
Number来确定一个唯一值作为脚本内某些数据的参数使用,则省去了繁琐的数据准备及设置工作并且容易查找;同理,在多脚本或多测试机执行的场景中可以加入Group Name以及Load Generator Name来区分。
假设存在:
数据:A、B、C
虚拟用户:Vuser1、Vuser2、Vuser3
脚本中参数出现三次,脚本迭代三次
怎样取下一行数据?
Sequential:顺序,所有虚拟用户按照顺序读取数据表
Random:随机,所有虚拟用户随机形式读取数据表
Unique:唯一,所有虚拟用户每次各取一值(不重复)
什么时候访问数据表完成数据更新?
Each iteration:每次迭代以后
Each occurrence:每次出现参数
Once:每出现一个虚拟用户
实例:
顺序
Sequential + Each iteration
第一次迭代 无论参数任何时候出现Vuser1、Vuser2、Vuser3取A
第二次迭代 无论参数任何时候出现Vuser1、Vuser2、Vuser3取B
第三次迭代 无论参数任何时候出现Vuser1、Vuser2、Vuser3取C
Sequential + Each occurrence
第N次迭代
参数第一次出现Vuser1、Vuser2、Vuser3取A
第N次迭代 参数第二次出现Vuser1、Vuser2、Vuser3取B
第N次迭代 参数第三次出现Vuser1、Vuser2、Vuser3取C
Sequential + Once
第N次迭代
无论参数任何时候出现Vuser1取A Vuser2取B Vuser3取C
随机
Random + Each iteration
第N次迭代 无论遇到该参数多少次Vuser1都只取A,或者B,又或者C,本次迭代不再更新
第N次迭代 无论遇到该参数多少次Vuser2都只取A,或者B,又或者C,本次迭代不再更新
第N次迭代 无论遇到该参数多少次Vuser3都只取A,或者B,又或者C,本次迭代不再更新
在N+1次迭代,每个Vuser重新随机抽取数据
Random + Each occurrence
第N次迭代
第一次遇到该参数Vuser1、Vuser2、Vuser3在A、B、C中随机抽取一个
第N次迭代 第二次遇到该参数Vuser1、Vuser2、Vuser3重新在A、B、C中随机抽取一个
第N次迭代 第三次遇到该参数Vuser1、Vuser2、Vuser3重新在A、B、C中随机抽取一个
在N+1次迭代,每个Vuser继续保持每遇到一次参数就重新抽取一次数据
Random + Once
第N次迭代
无论遇到该参数多少次Vuser1都只取A,或者B,又或者C
第N次迭代 无论遇到该参数多少次Vuser2都只取A,或者B,又或者C
第N次迭代 无论遇到该参数多少次Vuser3都只取A,或者B,又或者C
在N+1次迭代,每个Vuser不会重新抽取数据
唯一
注意:使用该Unique类型必须注意数据表有足够多的数。
比如Controller中设定20个虚拟用户进行5次循环,那么编号为1的虚拟用户取前5个数,编号为2的虚拟用户取6-10的数,依次类推,这样数据表中至少要有100个数据,否则Controller运行过程中会返回一个错误。
因此以下例子在数据表中加入数据D、E、F、G、H、I。
Unique + Each iteration
第一次迭代 无论参数出现多少次Vuser1取A Vuser2取D
Vuser3取G
第二次迭代 无论参数出现多少次Vuser1取B Vuser2取E Vuser3取H
第三次迭代 无论参数出现多少次Vuser1取C Vuser2取F Vuser3取I
Unique + Each occurrence
第一次迭代 第一次出现该参数Vuser1取A Vuser2取D
Vuser3取G
第一次迭代 第二次出现该参数Vuser1取B Vuser2取E Vuser3取H
第一次迭代 第三次出现该参数Vuser1取C Vuser2取F Vuser3取I
Unique + Once
无论进行多少次迭代 无论参数任何时候出现Vuser1取A Vuser2取B
Vuser3取C
数据D、E、F、G、H、I不取