jmeter教程(六)-逻辑控制器

发布于 2020-08-09  757 次阅读


逻辑控制器可以控制采样器(samplers)的执行顺序。由此可知,控制器需要和采样器一起使用,否则控制器就没有什么意义了。放在控制器下面的所有的采样器都会当做一个整体,执行时也会一起被执行。

JMeter逻辑控制器可以对元件的执行逻辑进行控制,除仅一次控制器外,其他可以嵌套别的种类的逻辑控制器。以下是所有控制器图

介绍以下常见4个控制器

1.if控制器

类似于编程语言中if语句,根据给定表达式的值决定是否执行该节点下的子节点,表达式的值为true则执行,为false则不执行;默认使用javascript语法进行判断

jmeter4.0 在Expression输入框中,建议将判断条件解释为变量表达式,并使用__jexl3函数或__groovy函数对该变量表达式求值为true/false

或者可输入值为true/false的变量

${JMeterThread.last_sample_ok}可用于检测最后一个取样器是否成功执行

从上可知,对于JMeter4.0中的If Controller,在Expression输入框中直接输入判断的表达式,如1 == 1${threadNum} > 2,而不做求值计算(true/false)就执行JMeter是没有效的,达不到预期的效果

利用JMeter自带的函数助手(Function Helper)中的__jexl3函数或__groovy函数,对判断条件的表达式进行求值计算,生成对应的求值运算函数,然后将此运算函数复制到If Controller的Expression输入框中即可

__groovy函数

__jexl3函数

直接在Expression输入框中输入true或false也是可以起到控制节点是否执行的判断依据

2. Transaction Controller 事务控制器

事务响应时间是性能测试重要的指标,事务控制器可以统计其节点下的取样器执行消耗时间

generate parent sample:选择是否生成一个父取样器;

include duration of timer and pre-post processors in generated samle:是否包含定时器,选择将在取样器前与后加上延时(建议不要勾选)。

3. Loop Controller 循环控制器

循环控制器可以控制在其节点下的元件的执行次数,可以是具体数字,也可以是变量

4. While Controller 条件控制器

While条件控制器,其节点下的元件将一直运行直到While 条件为false。

Condition:接受变量表达式与变量。条件为 Flase 的时候,才会跳出 While 循环,否则一直执行 While 控制器下的元件。

3、While控制器提供三个常量

(1)Blank:当循环中最后一个取样器失败后停止 ( 当 While 控制器下最后一个样例执行失败后 跳出循环 )

(2)LAST:当循换前有取样器失败,不进入循环

(3)Otherwise:当判断条件为false时,停止循环

5. Once Only Controller

仅一次控制器下的元件对每个线程只会执行一次。对于需要登录的请求,也可以将请求放在这个控制器下,保证一个线程只登录一次

6. Sample Controller

这是Jmeter里最简单的一个控制器,可以提供一个分组控制,不具备任何的逻辑控制功能 (可以设置不同请求不同的请求头)

7. Random Controller

随机控制器是,每次随机执行其下的某个子节点,在页面的随机访问这种场景会用到随机控制器

 Ignore sub-controller blocks(忽略此控制模块):

  • 不勾选:随机控制器如果本次随机到子控制器,那么子控制器下的全部请求都会执行
  • 勾选:随机控制器将子控制器视为单个请求,如果本次随机到子控制器,那么只会执行子控制器下的一个请求(我试验后,发现每次只会执行子控制器下的第一个请求)

8. Runtime Controller

运行时控制器可以控制子元件运行的时长

Runtime(seconds):运行时间,以秒为单位,0表示不运行

9. Random Order Controller

随机执行其下的所有子节点,和Random Controller不同的是,这个控制器会随机执行所有需要随机的内容,只是顺序不定,和线程组的线程数和循环次数配置无关,就算只有一个线程,只循环一次,也是会全部执行Random Order Controller下的全部请求

10. Switch Controller

开关控制器,通过其下样例顺序数值或名称 控制执行某一个样例

Switch Value:指定请求的索引或者名称,索引从0开始,如果没有赋值,或者索引超过请求个数的话就执行第0个请求。可以是数字,也可以是字符,为字符时匹配取样器名称,如果匹配不上就会默认并找取样器名称为default的取样器,如果没有则不运行。

数值:表示将执行其下第 数值+1个取样器,例如:填1,将执行第2个取样器;填0或者不填,将执行第1个取样器;数值超出其下取样器数目时,执行第1个取样器。

字符:表示执行匹配到的请求

11. Throughput Controller

用来控制其下元件的执行次数,并无控制吞吐量的功能

Total Executions:执行百分比(1-100);

percent Executions:执行数量;

Throughput:根据上边选择的方式填写,百分比为0~100;

Per User:线程数,当选Total Executions时,是线程数;当选percent Executions时,是线程数*循环次数。

不勾选Per User

1、线程组中设置 线程数量 2,循环次数 10,吞吐量控制器 设置 Total Executions,吞吐量设置为 2,其下添加一个取样器,如下图所示:

2、配置好以后,运行JMeter,然后查看结果树(执行了2次),如下图所示:

3、现在将 吞吐量控制器 设置为百分比的控制方式,吞吐量设置为:50%,如下图所示:

4、配置好以后,点击“保存”运行JMeter,然后查看结果树(执行了10次,计算方式:10=吞吐量50% * 循环次数10 * 线程数 2),如下图所示:

勾选Per User

线程组中设置 线程数量 2,循环次数 10,吞吐量控制器 设置 Total Executions,吞吐量设置为 2,其下添加一个取样器,勾选Per User

配置好以后,点击“保存”,运行JMeter,然后查看结果树(总共执行了4次,其中吞吐量设置为2,执行2次,线程设置为2,执行2次,总共4次)

现在将 吞吐量控制器 设置为百分比的控制方式,吞吐量设置为:50

查看结果树(执行了10次,计算方式:10=吞吐量50% * 循环次数10 * 线程数 2)

综上所述:

勾选Per User:

1.线程数*循环次数>=线程数*吞吐量时,Total Executions模式的执行次数=线程数*吞吐量。

2.线程数*循环次数<线程数*吞吐量时,Total Executions模式的执行次数=当线程数*循环次数。

不勾选Per User:

1.线程数*循环次数<=吞吐量时,Total Executions模式的执行次数=线程数*循环次数。

2.线程数*循环次数>吞吐量时,Total Executions模式的执行次数=吞吐量。

Percent Executions:设置运行比例(1~100之间),单位为%

不管Per User是否勾选,按Percent Executions模式的执行次数都不受Per User影响,Percent Executions模式的执行次数=线程数*循环次数*吞吐量%。(循环次数=线程组循环次数*循环控制器循环次数)

Per User:勾选该项的话则按虚拟用户数(线程数)来计算执行次数,不勾选则按所有虚拟用户数来计算执行次数

12. ForEach Controller

13. Module Controller


一名测试工作者,专注接口测试、自动化测试、性能测试、Python技术。