前言:
之前的博客 “JMeter – 事务” 中已介绍过的JMeter事务控制器之外,它还有若干控制逻辑的元件,将在下面篇幅中逐一列举说明。
JMeter逻辑控制器可以对元件的执行逻辑进行控制,除了一次控制器外,其他控制器下都可以嵌套别的种类的逻辑控制器。
补充:
JMeter执行顺序如下:
- 1、配置元件
- 2、前置处理器
- 3、定时器
- 4、采样器
- 5、后置处理器(除非服务器响应为空)
- 6、断言(除非服务器响应为空)
- 7、监听器(除非服务器响应为空)
新手通常会以为Jmeter是按排列顺序执行的,这种错误的理解在使用逻辑控制器时会被放大,从而错以为是逻辑控制器的效果,这个因为Jmeter基础不扎实而导致的坑要切记,不然后面写复杂结构是要吃大亏。
逻辑控制器:
1、ForEach 循环控制器(ForEach Controller)
示例演示:
场景:
通过循环遍历 “用户定义的变量” (用户名集合),并将姓名作为入参进行接口请求。
效果总览:
2、简单控制器(Simple Controller)
简单控制器是最基本的控制器,对jmeter测试运行没有任何影响,可用来命名某些操作,主要用来组合取样器和其他逻辑控制器。
3、包含控制器(Include Controller)
用于引用外部的Jmx文件(测试片段),被导入的Jmx文件不能有线程组,只能包含简单控制器及控制器下的元件。简而言之,相当于封装了一个业务操作单元来调用,类似程序开发中的函数调用。这样的好处是降低了脚本冗余,需要时就直接引用,有点儿java中的方法封装的味道。
实例演示:
场景:
用户下单操作前,需查库存是否充足的流程。将“查库存”的操作进行封装,然后使用 Include控制器进行调用。
查库存操作的测试片段如下:
通过接口获取商品信息,通过Json提取器提取变量,最后通过Include控制器调用“查库存”测试片段,演示如下:
4、运行周期控制器(Runtime Controller)
Runtime 控制器主要用来控制其子元件的执行时长的。
参数说明:
Runtime(seconds):
-
运行时长(单位/秒),默认为1,去掉则默认为0,此时不执行其节点下的元件。
-
和线程组的循环次数也有关系,如果是指定次数的话,总的运行时间 = 循环次数 * runtime 。
-
如果循环次数是永远,那么 Runtime 控制器下的子项也会永远运行。
适用场景:
在系统比较稳定的情况下,持续让系统运行一天一夜,有很多个用户(正常范围内的用户量)不停的发送请求,检验系统的运行稳定性,查看服务器是否有异常出现。
5、Switch 控制器
Switch 条件控制器,类似java中Switch逻辑控制语句。
参数说明:
Switch Value:
匹配值,可以为数字,也可以是字符。当使用字符时,将匹配取样器的名称,如果匹配不上就会找取样器名称为 “default” 的取样器,再如果都找不到就不会执行。
示例演示:
场景:
某业务流程出现多分支,比如当生成某个计划后需要审核,可能出现的结果有三个:审核通过、审核待定、审核拒绝。
第一个取样器的下标为0,其他取样器按顺序依次叠加,随机函数会随机抽取一个执行。
6、While 控制器
While 条件控制器,其节点下的元件将一直运行知道While条件为false。
参数说明:
Condition(function or variable):
接受变量表达式与变量,另外提供了以下3个常量:
-
空(不输入任何值):当循环中最后一个取样器失败后停止,否则一直循环。
-
LAST:当循环前有取样器失败则不进入循环,若进入循环则直到最后一个取样器失败后停止。
-
Otherwise:当判断条件为字符串“false”时停止循环。
补充一些常见值:
-
${var_name}>10:数值大小对比,出现不成立的情况则停止。
-
${BooleanValue}:布尔值字符串,出现false则停止。
7、交替控制器(Interleave Controller)
交替控制器,其节点下的取样器会交替执行。假设我们线程组设置1个线程,循环3次;交替控制器下有两个取样器请求,分别为http1和http2,那么他们的执行顺序为:http1 --> http2 --> http1 。
参数说明:
-
忽略子控制器块:勾选后,会令子控制器失效;不勾选的话子控制会单独作为一个节点执行,一次只允许每个控制器发出一个请求。
-
Interleave across threads:允许跨线程交替执行,勾选后,当线程组线程数大于1时,当前线程首次执行会根据线程数顺序进行交替,后续执行按自己所属线程的上一个次的执行的位置交替。
示例演示:
示例1(不勾选配置):
子交替控制器生效,执行顺序为:12356,三个线程执行了3次。
示例2(忽略子控制器块):
循环控制器失效和子交替控制器都失效了,只允许发出一个请求,执行顺序为:1235,三个线程执行了3次。
示例3(勾选Interleave across threads):
执行顺序为:12356 23561 35612 ,每个线程下次开始执行的位置会后移一位。
8、仅一次控制器(Once Only Controller)
仅一次控制器表示此控制器下的子元件只会执行一次,即便处于循环控制器之下。
示例演示:
场景:
循环控制器循环三次,其中一个取样器只想要执行一次。
结果如上图所示,http3在循环控制器中仅执行了一次。
9、吞吐量控制器(Throughput Controller)
用来控制其下元件的执行次数,并无控制吞吐量的功能,主要用来控制其下的子节点的执行次数与负载比例分配。
参数说明:
- Percent Executions:
按执行次数的百分比来计算执行次数,此时 Throughput 取值是 0~100。
- Total Executions:
按 Throughput 的值来指定执行次数,可以是任意整数,如果小于等于 0,则一次也不执行。
- Per User:
1、如果使用Percent Executions模式。
①、不选“per user”,执行总次数 = 线程数 * 循环次数 * 吞吐量百分比。(最终值的小数位大于5就进1,如 11.51 就取 12,参考“探究配置方式 1”)。
②、选中“per user”,执行总次数 = (循环次数 * 吞吐量百分比)* 线程数 。(其中,若“循环次数 * 吞吐量百分比”的值大于0.5,则进1,如 4 * 13% = 0.52 ,进1,,参考“探究配置方式 2”)
2、如果使用Total Executions模式。
①、不选“per user”,那么吞吐量给定的数字将是执行的总次数。
②、选中“per user”,则执行的总数将是用户数乘以给定的吞吐量数。
示例演示:
场景1:
同一时间段内,有十个用户对系统进行访问,其中两组接口被访问次数分别为3次和5次,场景设计如下:
根据结果可看出,http1接口被访问了3次;http2接口被访问了5次。
探究配置方式 1:
使用 Percent Executions 但不勾选 Per User的场景:
就约等于的计算方式存疑,修改吞吐量的值,进行对比:
未加吞吐量控制器前,http3应该被访问50次,但图上图中配置了吞吐量控制器,计算公式为:线程数 * 循环数 * 吞吐量百分比,最终结果小数位大于5就进1,否则舍去。
探究配置方式 2:
使用 Percent Executions 且勾选 Per User的场景:
就约等于的计算方式存疑,修改吞吐量的值,进行对比:
未加吞吐量控制器前,http3应该被访问50次,但图上图中配置了吞吐量控制器,计算过程为:循环数 * 吞吐量百分比(结果小数位大于5就进1,否则舍去),最后将值 * 线程数 = 执行次数。
10、条件控制器(if Controller)
可以通过某个条件来控制此节点下的元件是否运行。
参数说明:
- Expression (must evaluate to true or false) :
表达式(值必须是true或false)
- Evaluate for all children?:
默认不勾选,判断条件作用于每个子项。
- “use status of last sample”按钮:
点击该按钮,Expression 中会自动填充“${JMeterThread.last_sample_ok}”,表示使用该控制器之前,最后一个取样器的执行结果来控制是否执行。
- Interpret Condition as Variable Expression?:
默认勾选项,将条件解释为变量表达式(需要使用__jexl3 or __groovy 表达式)。
①、不勾选“interpret condition as variable expression”:
Expression中直接输入我们需要判断的表达式即可,判断表达式为真时,执行if控制器下的请求。例如“1!=2”,则一定会执行下面的取样器。
②、勾选“interpret condition as variable expression”:
此时,Expression中不能直接填写条件表达式,需要借助函数将条件表达式计算为true/false,可以借助的函数有_jexl3和_groovy。例如“{__jexl3(1==2,)}”或“{__groovy(1==2,)}”,则不会执行下面的取样器。
示例演示:
条件不成立,不执行if控制器的子项。
11、模块控制器(Module Controller)
可以通过模块控制器在当前测试计划中引用测试片段。
参数说明:
Module To Run:
下拉列表,列出了测试计划及工作台包含的控制器,在此点击选中需要引入的测试片段。
示例演示:
依次调用“进入游戏”,“角色升级”,“退出游戏”的测试片段,进行场景模拟。
12、随机控制器(Random Controller)
随机控制器节点下的元件随机选择一个运行,与交替控制器不一样的是节点下的元件运行顺序不定。
参数说明:
Ignore sub-controller blocks:
$emsp;忽略子控制器,即子控制器失效,由随机控制器接管。(例如,勾选了此项,子控制器中有循环控制器,此时它就不再会循环了。)
13、随机顺序控制器(Random Order Controller)
其节点下的元件随机执行,不过每个元件只执行一次。
示例演示:
14、循环控制器 (Loop Controller)
可控制其节点下的元件的执行次数。
15、录制控制器(Recording Controller)
官方推荐用于存放录制的脚本,无实际作用,可用简单控制器取代。
16、事务控制器(Transaction Controller)
事务响应时间是我们衡量业务性能的主要指标,事务控制器可以把其节点下的取样器执行消耗时间累加在一起,便于统计。
具体参考:事务控制器
评论区