12-性能测试之JMeter逻辑控制器

导读

前言

前面几篇博客简单讲解JMeter的关联,参数化,断言,计时器等知识,但明显不够细致,接下来我们详细来看看,本节学习一下所有的逻辑控制器。尽量找到操作的示例,这样才能验证观点,加深记忆。如果找不到示例,那么就干脆简单待过,不下结论,避免误导大家。

逻辑控制器用来对元件执行逻辑进行控制。
12-性能测试之JMeter逻辑控制器

If Controller

12-性能测试之JMeter逻辑控制器
看名字就知道,相当于if条件语句,如果判断结果是true,就继续执行,否则,不执行。
上面截图中,“${JMeterThread.last_sample_ok}”可以用来判断上一个取样器执行的结果是否是ok,如果ok就返回true,就继续执行下面的请求。
我们发送两个请求都是正确的,看下结果:
12-性能测试之JMeter逻辑控制器
第一个请求,发送成功,所以继续发送第二个请求。

假如第一个请求是错误的,看下结果:
12-性能测试之JMeter逻辑控制器
第一个请求发送错误,if判断不通过,所以不发送第二个请求。

(1)Name:名称
(2)Comments:备注
(3)Expression(must evaluate to true or false):表达式,必须结果为true或false
(4)Interpret Condition as Variable Expression?:默认勾选,使用变量表达式来设置条件。如果去勾选的话,使用JavaScript来设置条件
(5)Evaluate for all children?:默认不勾选,只在入口处判断一次,子节点不判断。

While Controller

来看看While条件
12-性能测试之JMeter逻辑控制器
(1)Name和Comments就不重复介绍了
(2)Condition(function or variable):条件,可以是函数或变量
(3)假如我们填false(或者结果为false的函数、变量),则执行完请求1,就结束了,不再执行请求2
(4)假如我们天true(或者结果为true的函数、变量),则执行完请求1,会一直执行请求2
(5)另外还提供了三个常量:

  • Blank:当循环中有取样器失败后停止
  • LAST:当循换前有取样器失败,不进入循环
  • Otherwise:当判断条件为false时,停止循环

ForEach Controller

12-性能测试之JMeter逻辑控制器
(1)input variable prefix:参数前缀,比如我这里前缀是hero
(2)start index for loop(exclusive):开始下标,不包括起始数字,从1开始,因为不包含0
(3)End index for loop(inclusive):结束下标,包括结束数字,到3结束,包括3,这时候会产生,hero_1,hero_2,hero_3,这3个值
(4)Output variable name:调用这个循环产生的变量的名,这里写的name,后面就可以用,${name}来取上面产生的那3个值了
(5)Add “_” before number:要不要在数字前面添加下划线。默认勾选,如果去掉勾选,上面的3个值就是hero1,hero2,hero3

Loop Controller

12-性能测试之JMeter逻辑控制器
默认循环一次
有没记得线程组也有个loop循环设置,如下图:
12-性能测试之JMeter逻辑控制器
这两个有什么区别吗?
现在我们准备3个请求,设置线程组1个线程,2次loop,下面有一个请求1,一个Loop Controller(设置2次loop),下面有两个请求,请求2和请求3
来运行一下,看看结果
运行次序如下
请求1,请求2,请求3,请求2,请求3
请求1,请求2,请求3,请求2,请求3
也就是先执行Loop Controller中的循环,再执行线程组的循环

Switch Controller

12-性能测试之JMeter逻辑控制器
(1)Switch Value,可以填数字,填0就跳转下下面的第1个请求;填1就跳到第2个请求,以此类推。
(2)当然也可以填string,会匹配取样器的名字,匹配到的话,就去执行。如果匹配不到,就去执行default的取样器,如果没有default取样器,就不执行。
12-性能测试之JMeter逻辑控制器

Throughput Controller

12-性能测试之JMeter逻辑控制器
(1)percent Executions:按执行次数的百分比来计算执行次数,此时throughput取值是0~100
(2)total executions:按throughput的值来指定执行次数,可以是任意整数
(3)per user:是和total executions,搭配使用的,如果勾选,则按虚拟用户数来计算执行次数

比如,线程数=4,循环=10,循环下面有3个请求
如果选择percent=50,那么将执行4*10*3*50%=60个请求
如果选择total=2,那么执行3*2=6个请求
如果选择total=2,且勾选per user,那么执行3*2*4=24个请求

Module Controller

模块控制器,必须搭配其它控制器一起使用,后面用到的时候,结合实例一起说吧

Transaction Controller

这个就非常有用了。我们前面有提到过事务的概念,有时候我们不关心单个请求的响应时间,而是关心一组相关请求的整体响应时间,怎么来统计呢?就需要借助事务这个概念,把这组请求,放到一个事务控制器下面。
(1)不勾选Generate parent sampler
12-性能测试之JMeter逻辑控制器

(2)勾选Generate parent sampler
12-性能测试之JMeter逻辑控制器

(3)include duration of timer and pre-post processors in generated sample:在生成的样本中包括定时器和前置处理器的持续时间
勾选此项的话,就会把定时器和前置处理器的时间也统计到事务中

Critical Section Controller

12-性能测试之JMeter逻辑控制器
上图的话,如果有5个线程,多个线程可以一起执行请求1,但是同时只有一个线程能执行请求2,执行完请求2,才可以执行请求3

Interleave Controller

交替控制器,其节点下的取样器会交替执行。
12-性能测试之JMeter逻辑控制器
上面1个线程,循环3次,执行结果很清晰
交替控制器下面的请求交替执行。

Once Only Controller

12-性能测试之JMeter逻辑控制器
上面我们设置了1个线程,执行3次循环,结果是,once only 控制器下面的请求只执行1次。

Random Controller

12-性能测试之JMeter逻辑控制器
1个线程,循环3次,可以看到随机控制器下面的取样器,是随机执行的。你可以多运行几次,每次运行的结果应该不同。因为Random Controller下面的取样器,是随机取一个执行的

Random Order Controller

12-性能测试之JMeter逻辑控制器
这里,我们1个线程,循环2次,
第一次循环,执行第一个请求,请求4,然后到了Random Order控制器,会随机,但不重复的执行下面的3个请求,这次的顺序是2、1、3
第二次循环,执行第一个请求,请求4,然后到了Random Order控制器,会随机,但不重复的执行下面的3个请求,这次的顺序是3、2、1

Recording Controller

录制控制器,当我们用JMeter做代理进行录制的时候会用到,将请求录制到该控制器下面,没有特别的意义

Runtime Controller

时间控制器,就是说发送设定时长的该控制器下面的请求
12-性能测试之JMeter逻辑控制器
比如1个线程,循环2次,设定请求2发送1秒钟,由于请求发送1次需要不到1秒钟,所以1秒应该能发送多次请求,看看结果
12-性能测试之JMeter逻辑控制器
那如果设置为0呢?0秒钟就没有时间发送了,看看结果
12-性能测试之JMeter逻辑控制器

Simple Controller

12-性能测试之JMeter逻辑控制器
貌似没什么用,不改变取样器的执行顺序,也不会循环。

include Controller

12-性能测试之JMeter逻辑控制器
用来导入外部的测试片段(非完整的测试计划)。执行时,会先导入测试计划。但是被导入的测试计划有特殊要求,不能有线程组,只能包含简单控制器。这个不明白应用场景。不多解释。

小结

本章有点枯燥,却是我们后面构造复杂测试场景的基础,还是希望大家耐心试验,谢谢。