一、参数化策略
1、Select next row(How? 如何取?)取值方式
选择下一行
1)Sequential:顺序的
每个VU都从第一行开始,顺序依次向下取值;
数据取完可以从头循环重复使用;
--每个VU取值序列相同
2)Unique:唯一的 (VU和VU之间值不重复)
从第一行,对于VU唯一依次向下取值;
如果数据不足,需要按照指定策略进行取舍;
--每个VU取值序列不相同
举例:目前有10行数据:a1 a2 a3 ... a10,2个VU,每次迭代时更新数据,一共迭代2次(表示需要更新2次)。
按照SE组合:顺序+每次迭代 VU1(a1, a2) VU2(a1, a2)
按照UE组合:唯一+每次迭代 VU1(a1, a2) VU2(a3, a4)
3)Random: 随机取 (更真实效果)
每个VU都随机获取参数池中数据,值可以重复;
4)Same line as xxx: 和xxx参数同行取值、策略一致
比如:password 设置为 Same line as username
2、Update value on (When? 何时取?)更新时机
结论:何时更新能够决定每个VU需要取几次数据
1)Each Iteration: 每次迭代 (默认,最常用)
脚本Action每迭代一次,需要重新取参数的值;
2)Each Occurrence: 每次遇到 (不常用,不好控制)
脚本中参数出现一次,则算遇到一次
3)Once: 仅取一次
每个VU仅取值一次,不再改变(从一而终)
3、When out of values: 当超过值的策略
前提:使用Unique策略时才有效,考虑值不够用时的策略。
1)Abort Vuser: 放弃VU VU不再执行脚本,并且报错
(最常用)
2)以循环方式继续:循环从第一行开始继续取(重复)
3)以最后一个值继续:重复取最后一个值(重复)
二、练习1
某参数现有备用数据a1 a2 a3 ... a30,使用VuGen完成(只有1VU),脚本迭代3次,默认迭代一次参数只出现一次,完成以下策略组合的结果:
1)顺序 + 每次迭代:a1 a2 a3
2)唯一 + 每次迭代:a1 a2 a3
3)随机 + 每次迭代:a18 a5 a21
4)顺序 + 每次遇到:a1 a2 a3
5)唯一 + 每次遇到:a1 a2 a3
6)随机 + 每次遇到:a6 a30 a8
7)顺序 + 一次:a1 a1 a1
8)唯一 + 一次:a1 a1 a1
9)随机 + 一次:a5 a5 a5
新建脚本param1,设置一些参数{name}和{pwd},给定数据,指定不同策略进行检验:
Action.c(6): 用户名:{name},密码:{pwd}
原样输出表示参数不认识(未定义)
如何解决?需要在Parameter List中定义(参数池)
类型 + 数据 + 策略
将param1备份为param2,外部循环Action迭代改为2次;
Action代码中增加内循环3次。 for语法
(好比迭代一次参数遇到3次)
for循环语法(Java/C/C++):
之前语句0;
for(初始化语句1; 循环条件2; 步进语句3) {
循环体4;
}
之后语句5;
执行顺序:0 1 2 4 3 2 4 3 2 4 3 2为假 5 循环3次
比如:3次循环
for(int i=0; i<3; i++){ // 0 1 2
...
}
for(int i=0; i<=3; i++){ // 1 2 3
...
}
for(int i=3; i>=1; i--){ // 3 2 1
}
三、练习2
某参数现有备用数据a1 a2 a3 ... a30,使用VuGen完成(只有1VU),脚本迭代2次,迭代一次参数出现3次,完成以下策略组合的结果:
1)顺序 + 每次迭代:a1 a1 a1, a2 a2 a2
2)唯一 + 每次迭代:a1 a1 a1, a2 a2 a2
3)随机 + 每次迭代:a9 a9 a9, a16 a16 16
4)顺序 + 每次遇到:a1 a2 a3, a4 a5 a6
5)唯一 + 每次遇到:a1 a2 a3, a4 a5 a6
多用户时考虑块大小,VuGen只有1VU,块大小不起作用,象征性写1即可。
改为:外循环5次,内循环10次
使用Unique,就要考虑When out of values:
a) Abort Vuser: 放弃VU 越界会报错Action.c(5): Error
-- 推荐使用! 保证数据不重复,满足业务需求
b) 循环继续取: 正常循环取值,不会报错 数据可能重复
c) 持续最后一个: 持续取值,会报错Action.c(5): Error
6)随机 + 每次遇到:a15 a1 a6, a9 a1 a19
7)顺序 + 一次:a1 a1 a1, a1 a1 a1
8)唯一 + 一次:a1 a1 a1, a1 a1 a1
9)随机 + 一次:a3 a3 a3, a3 a3 a3
Action.c(5): Error: Parameter 'name':
No more unique values for this parameter in table
没有 更多 唯一 值 针对 参数 name.dat
'name.dat' [unique range is 1-30].
VU 被放弃 根据 xxx 策略
The Vuser is aborted according to "When Out Of Values" policy.
四、多用户分块的概念 块 Block
1、使用控制台管理多用户时,使用Unique策略时,首先考虑分块的问题,分块时保证用户数据不重复的关键。
分块后,每个VU选择自己块内数据,能够保证VU之间不会重复使用数据。 分块--数据的隔离
2、测试过程中,如果参数池数据不够,场景运行会报错。
建议:使用Unique策略时,保证数据充足,允许必要的浪费。
3、块大小:分配给每个VU的数据量;
4、分块的方式:
1)自动分块:块大小根据VU的需要自动分配--按需分配
2)手动分块:块大小可以自己设置
<1> 刚好够用
<2> 有所富余--推荐使用
<3> 有所不足--参考When out of values策略
每个VU在自己的块内数据进行取舍:
a. 放弃VU;(推荐) b.循环方式继续; c.持续最后一值
五、在控制台中查看运行日志(多用户,产生多个日志文件)
1、打开控制台:加载param1脚本
指定日志输出的位置:
Controller -> Results菜单 -> Results Settings 结果设置
-> 窗口:
Result Name: res 存放日志的目录名,可以修改
Directory: C:... 默认长路径,建议改短,自己指定
-> C: 新建目录 lrlog
-> 点击Browse -> 指定目录:C:lrlog
另外,还有两个选项:
每次执行场景,产生新的日志文件;
每次执行的结果会覆盖之前的日志文件;(选择)
2、为了能够生成日志文件,需要设置Run-time Settings:
-> Log -> Always send message 总是发消息
3、其它设置:
VU数量:10
VU行为:默认初始化、同时启动、运行直到结束
运行场景,观察C:lrlog目录
每个VU都会产生一个日志文件:
param1_1.log .... param1_10.log
组名_VU的id.log
重要提示:VuGen修改完数据和策略 -> 编译脚本
-> 控制台中及时刷新脚本 -> 才可生效
Insufficient records for parameter 'name' in table to provide the Vuser with unique data
强调:Unique策略时,数据分配必须要充足,避免报错。
六、综合练习题
某参数现有备用数据a1 a2 a3 ... a30,使用Controller设置3个VU运行脚本,脚本迭代4次,默认迭代一次参数只出现一次,完成以下策略组合的结果:
1)顺序 + 每次迭代:<重要> SE组合
VU1:a1 a2 a3 a4
VU2:a1 a2 a3 a4
VU3:a1 a2 a3 a4
2)唯一 + 每次迭代:<重要> 默认自动分块 块大小: 4
VU1:a1 a2 a3 a4
VU2:a5 a6 a7 a8
VU3:a9 a10 a11 a12
自动分块 块大小: 4
第一块:a1 a2 a3 a4 VU1
第二块:a5 a6 a7 a8 VU2
第三块:a9 a10 a11 a12 VU3
3)随机 + 每次迭代:<重要>
VU1:a10 a1 a6 a15
VU2:a3 a6 a12 a21
VU3:a5 a9 a1 a8
4)顺序 + 每次遇到:
VU1:a1 a2 a3 a4
VU2:a1 a2 a3 a4
VU3:a1 a2 a3 a4
如果迭代一次遇到2次:
VU1:a1 a2 a3 a4 a5 a6 a7 a8
VU2:a1 a2 a3 a4 a5 a6 a7 a8
VU3:a1 a2 a3 a4 a5 a6 a7 a8
5)唯一 + 每次遇到:<重要> 手动分块 块大小:6
VU1:a1 a2 a3 a4
VU2:a7 a8 a9 a10
VU3:a13 a14 a15 a16
手动分块 块大小:6
第一块:a1 a2 a3 a4 a5 a6 VU1
第二块:a7 a8 a9 a10 a11 a12 VU2
第三块:a13 a14 a15 a16 a17 a18 VU3
6)随机 + 每次遇到:
VU1:a6 a3 a19 a2
VU2:a22 a1 a7 a19
VU3:a5 a9 a23 a16
7)顺序 + 一次:<重要>
VU1:a1 a1 a1 a1
VU2:a1 a1 a1 a1
VU3:a1 a1 a1 a1
8)唯一 + 一次:<重要> 默认自动分块 块大小:1
VU1:a1 a1 a1 a1 满足VU之间值不重复
VU2:a2 a2 a2 a2
VU3:a3 a3 a3 a3
自动分块 块大小:1
第一块:a1 VU1
第二块:a2 VU2
第三块:a3 VU3
9)随机 + 一次:<重要>
VU1:a8 a8 a8 a8
VU2:a16 a16 a16 a16
VU3:a3 a3 a3 a3
10)唯一 + 每次迭代:<重要> 手动分块 块大小:5
VU1:a1 a2 a3 a4
VU2:a6 a7 a8 a9
VU3:a11 a12 a13 a14
手动分块 块大小:5
第一块:a1 a2 a3 a4 a5 VU1
第二块:a6 a7 a8 a9 a10 VU2
第三块:a11 a12 a13 a14 a15 VU3
查看多用户执行结果的方法2:VuGen就能模拟
打开VuGen 使用param1 -> Parameter List
-> Simulate Parameter... 模拟参数化(多用户时)
-> 窗口:
Vusers: Number of Vuser: 3
Scenario run mode: 场景运行模式
Run until completion: 运行直到结束(取决于迭代次数)
Number of iteration to run: 4 迭代4次
-> 点击Simulate 模拟
对比两种方法:
方法1:优点:通用,获取运行的日志文件
缺点:配置过程比较繁琐
方法2:优点:配置非常方便
缺点:每次遇到时无法模拟(用得不多)
无法记录日志文件
以上参数类型:File类型 使用自定义文件保存参数池数据
实际项目中常用的组合:
1)SE组合:顺序 + 每次迭代
Sequential + Each Iteraction 数据可重复
2)UEA组合:唯一 + 每次迭代 + 放弃VU 数据不重复
Unique + Each Iteraction + Abort Vuser
3)RE组合:随机 + 每次迭代 数据更随意,可重复
Random + Each Iteraction
七、其它参数类型
1、Date/Time 日期/时间
用途:脚本中需要使用日期数据时,获取当前系统时间,使用不同日期格式表示。
to_char date -> char 提取关心的日期信息
to_date char -> date 生成date数据 入库
计算机中保存日期数据的本质:长整数-毫秒数
从1970年1月1日0点 到 某一时刻的毫秒数
128639837868
128639837869
计算机有算法(历法)将该值推算出所有的日期信息:
世纪、年、月、日、时、分、秒、毫秒
将param1另存为 param3
需求:获取以下格式的当前系统时间数据
举例 格式字符串
04/21/2017 %m/%d/%Y
20170421 %Y%m%d
2017-04-21 16:26:18 %Y-%m-%d %H:%M:%S
说明:Date/Time类型适合获取不同格式的当前系统时间;
File类型可以自己填写某个具体时间。
2008-08-08 20:08:08
2、Iteration Number:迭代编号
用途:获取一组有序的递增的值
格式:%d
%01d
...
%05d 具有5位数值,不够的使用0补齐
00001 00002 ... 00100 01000 ...
3、Random Number:随机编号
用途:工具根据指定的规则、范围自动生成一组随机数
设置:Min: 1 Max: 100 %06lu
表示6位 1~100随机数 不够0填补
比如 000001 000100
UEA: 唯一+每次迭代+放弃VU
版本1:File类型,数据由自己指定
版本2:Unique Number类型,数据由工具规则产生
4、Unique Number: 唯一编号 (UEA版本2) 重点
用途:根据指定的规则自动为不同VU生成一组唯一的编号
原理:分块、块大小
具体配置:
<1> Start: 1 数据起始值 下一次:1001 2001 ...
<2> Block size per VU: 100 块大小
10VU,使用UEA版本2,脚本迭代80次
VU1: 1~100 VU2: 101~200 .. VU10: 901~1000
<3> Sample: Hello00001 数值举例
<4> Number: Hello%05d 数据格式
<5> Update value: Each iteration 更新时机 每次迭代
<6> When out of values: Abort Vuser 放弃VU
技术(技术专家) + 业务(领域专家):
手机号:138-1181-0086
运营商 地区 不同用户
项目案例:针对某电信项目中账户注册功能进行性能测试,其中需要对脚本中的手机号进行参数化,要求手机号不能重复使用。需要1000VU在线执行注册功能,持续运行1小时,已知1个小时内平均每个VU执行437次注册,请提供参数化具体策略。手机号使用138开头。
思路:不重复 - 唯一 UEA 版本1 或 版本2?
File Unique Number
将param3备份为testMobile
用户id: {uid} 手机号:{number}
uid的策略:Vuser ID VU的id 格式:%05s
number的策略:UEA版本2 Unique Number
具体配置:
<1> Start: 1 数据起始值 下一次:500001 1000001..
<2> Block size per VU: 500 块大小
既要让数据充足,又要便于后续的计算
VU1: 1~500 VU2: 501~1000 ....
1000个VU分配了:1000 * 500 = 500000
<3> Sample: 13800000001 数值举例
<4> Number: 138%08d 数据格式
<5> Update value: Each iteration 更新时机 每次迭代
<6> When out of values: Abort Vuser 放弃VU
将脚本载入控制台,设置场景:
1)Run-time Settings:
<1> 迭代次数:430 (不超过500)
<2> Pacing: 没有要求
<3> Log: 选择Always send message 能生成日志文件
<4> VU模拟:使用线程方式--省资源
2)Results Settings: 指定日志输出目录 C:lrlog
es1
3)设置1000VU
4)VU行为:默认初始化、同时加载、运行直到结束
-> 运行场景
归纳最常用的策略组合: 着重说明其项目中应用场合
1)SE组合: 顺序+每次迭代 最常用
2)UEA组合:唯一+每次迭代+放弃VU 数据唯一时使用
关键:分块 块大小
版本1:File类型 数据由自己填写(工作量大)
版本2:Unique Number类型 数据由规则产生
3)RE组合:随机 + 每次迭代 用户访问具有随机性