jmeter逻辑控制器使用
一、jemeter控制器的种类
1.简单控制器(Simple Controller)
作用:分组,用来组合取样器和其他逻辑控制器
2.循环控制器(Loop Controller)
作用:控制该控制器下请求的循环次数
例如下图中线程数为2,循环控制器次数为3,执行后Home Page执行了2次,News Page执行了6次(线程2*循环3次)
如果勾选了forever,请求将会一直运行
3.一次性控制器(Once Only Controller)
作用:在多线程循环的时候,将使其子节点下的每个线程取样器请求只运行一次,例如登录请求
下图中线程数为2,循环3次,Home Page在Once Only Controller下所以每个线程只运行一次
注意点:循环一次只是针对每个线程的,N个线程数还是会运行N次
4.交替控制器(Interleave Controller)
作用:交替执行该控制器下的请求
下图中交替控制器下有三个请求,每次执行都会按顺序选择一个请求进行执行。当线程组循环次数为5,交替控制器下只有3个请求,循环到第四次后将从第一个(News Page)重新请求
5.随机控制器(Random Controller)
作用:类似于交替控制器,每次执行时随机选择一个控制器
忽略子控制器模块:开启后将子控制器看做一个请求,未开启则是将子控制器当成一组请求
6.随机顺序控制器(Random Order Controller)
作用:类似于简单控制器,将执行每个子节点下的取样器请求一次,但是执行是随机的(即随机执行所有的请求一次)。
随机控制器和随机顺序控制器的不同:随机是随机执行,顺序随机则是对所有请求随机一遍不会存在重复值,例如两个控制器下都有A、B、C三个请求,随机控制器的执行可能是B、C、C,随机顺序的结果则可能是B、C、A
7.吞吐量控制器(Throughput Controller)
执行次数:输入整数
执行百分比:输入0-100的整数
Per User:如果勾选该项则按虚拟用户数(线程数)来计算执行次数,如果没有选中该项则按所有虚拟用户数来计算执行次数。
下图中Per User未勾选,执行后的结果:
勾选Per User的执行结果:
8.if控制器If Controller
该控制器通过判断表达式是否成立来执行请求,当表达式成立执行控制器下的请求
勾选interpret condition as variable expression,表达式的结果必须是是true或者false,也就是说,在右边文本框中输入的条件值必须是 true 或 false(默认情况下)
取消勾选后,可能会导致性能损失很大,并使测试的可扩展性降低,所以不推荐不勾选
请求登录后获取token,如果token不为空,则执行请求A,可以使用以下表达式
不勾选interpret condition as variable expression,设置变量var1 = 1,当表达式成立执行请求A
evaluate for all children:勾选后控制器下的每个请求执行前都会判断一次
9.while控制器
作用:当控制器的条件为真将循环执行控制器下的请求,直到条件为假或不成立
可输入的条件:
不输入任何条件:循环执行请求,控制器最后一个请求失败退出循环
LAST:控制器下最后一个循环的请求失败,退出循环。与空使用情况相似
条件为假,退出循环
表达式:
当参数为表达式时(需要经过__jexl3函数进行转换,可以使用函数助手生成表达式),如果表达式的结果为true,则执行while controller;
反之则不执行,所以在参数中也可以直接输入true或者false来控制是否执行while controller
例如:${__jexl3(“${VAR2}”==“abcd”)}
在Runtime Controller下一直运行A HTTP请求,直到status=2,执行While Controller下的B HTTP请求且执行一次,然后退出循环,如下:
10.switch控制器
switch value:
填写索引值(从0开始),例如控制器下有三个请求,输入1就可以执行第二个请求
当索引值过大时,只会执行第一个请求,例如控制器下有三个请求,输入10,执行的请求仍为第一个
索引值为空,执行第一个请求
当输入非数字时,将会查找相同名称(名称需要完全匹配)的请求执行,当匹配不到名称则会查找"default"名称(不区分大小写)进行匹配,当“default”未匹配到则不会执行任何请求
11.ForEach控制器
作用:ForEach 控制器一般和用户自定义变量/JDBC结果变量一起使用,用于可以遍历读取相关的返回值
该控制器下的 Samplers 和控制器都会被执行一次或多次,每次读取不同的变量值
ForEach 控制器和正则提取器是个好搭档,因为正则提取出来的变量值会用_分隔,而 ForEach 可以省略
实例1:根据用户自定义的变量取值,然后输出变量
也可将输出变量设置为空,一般不建议该做法
当不勾选Add”_”before number的执行效果:
用户自定义的变量有“-”存在,匹配时不勾选时“-”,则无法匹配到数据,控制器的请求不执行
实例2:配合JDBC请求使用
- JDBC 一共返回 100 条数据,通过变量去接住所有数据,对应有 100 个变量(mobile_1 到 mobile_100)
- 循环 100 次,输入变量 mobile_1 - mobile_100 并输出为 new_mobile_1 - new_mobile_100
实例3:
- 这里通过 Result Variable name 去接住所有数据,只有一个变量,是无法循环的
- 所以我们需要通过正则提取器将需要的 mobile 字段的值提取出
-
我们要的其实是箭头的那些,但是正则会提取不必要的字段值(如:mobile_new_11_g0),所以注意 ForEach 的输入变量前缀要写正确
循环 100 次,输入变量 mobile_new_1 - mobile_new_100 并输出为 mobile_1 - mobile_10012.权重控制器(Weighted Switch Controller)
作用:为请求分配权重,控制请求执行的比重
勾选Random choice后会随机选一个子项执行,不能保证子项执行的实际百分比等于预期值
-
13.仅一次控制器
作用:线程组内的请求只会被执行一次,例如10个线程组循环40遍,该控制器下的请求则会被被执行10次,即每个线程组执行一次。
-
14.事务控制器(Transaction Controller)
作用:事务控制器生成一个额外的样本,该样本测量执行嵌套测试元素所花费的总时间。相对于对控制器下的请求做一个统计
Generate Parent Sample:如果选中,事务控制器将作为其他取样器的父级样本,例如控制器下有ABC三个请求,不勾选时聚合报告可以看到ABC以及这个事务的统计数据,勾选后就只能看到事务的统计数据,下图为勾选后的执行结果
Include duration of timer and pre-post processors in generated sample:是否在生成的样本中包括计时器,预处理和后处理的延迟时间,勾选后的统计时间包括控制器范围内的所有处理,而不仅仅是样本。
15.包含控制器(Include Controller)
作用:使用外部的jmx文件,需要配合测试片段一起使用。
测试片段相当于一个独立的部分,可以被其他测试计划引用,类似公共模块或公共方法函数,遇到重复需要的,比如登录、注册之类的,就可以用测试片段和 Include 控制器 。
如果测试使用Cookie管理器或用户定义的变量,这些应该放在顶层测试计划中,而不是包含的文件中,否则不能保证它们工作。
16.临界区控制器(Include Controller)
作用:临界区控制器确保其子元素(采样器/控制器等)将仅由一个线程执行,因为在执行控制器的子元素之前将获取命名锁。可参考:https://blog.csdn.net/weixin_39307626/article/details/123176180
根据锁名来控制并发,同一个锁名之下,在同一时间点只能存在一个运行中,适用于控制并发的场景
锁名类型:
锁名为空,认为每个锁为不同的锁
锁名相同,多个锁认为是同一个锁,同一个时间点只能存在一个运行中
锁名为变量,根据变量值来判断是不是属于同一个锁,变量值为相同时,则认为是同一个锁