JMeter 组件详解-Logic Controllers 逻辑控制器

Metadata

title: JMeter 组件详解-Logic Controllers 逻辑控制器
date: 2022-12-13 13:20
tags: 
  - 行动阶段/完成
  - 主题场景/工具
  - 笔记空间/KnowladgeSpace/ToolSpace
  - 细化主题/JMeter
  - 细化主题/组件
  - 细化主题/控制器
categories:
  - JMeter
keywords:
  - JMeter
  - 组件
  - 控制器
description: 逻辑控制器决定了采样器被处理的顺序。

Logic Controllers | 逻辑控制器

逻辑控制器决定了采样器被处理的顺序。

Simple Controller | 简单逻辑控制器

简单逻辑控制器让你组织你的采样器和其他逻辑控制器。与其他逻辑控制器不同,此控制器除了存储设备之外不提供任何功能。

简单控制器可以将在其之下的所有组件,作为一个整体。

界面

参数说明

Attribute Description Required
Name 树中显示的控制器的描述性名称。 No

Loop Controller | 循环控制器

如果你将生成或逻辑控制器添加到一个循环控制器,JMeter将通过它们循环一定的次数,除了你为线程组指定的循环值。例如,如果您添加一个循环次数为2的HTTP请求到一个循环控制器,并配置Thread Group循环次数为3,JMeter将总共发送2 * 3 = 6个HTTP请求。

JMeter将把循环索引作为一个名为__jm__<元素名>__idx的变量公开。例如,如果你的循环控制器名为LC,那么你可以通过${__jm__LC__idx}访问循环索引。索引从0开始

界面

参数说明

Attribute Description Required
Name 树中显示的控制器的描述性名称。 No
Loop Count 这个控制器的子元素在每次测试运行中迭代的次数。</br> 值-1相当于检查永远切换。 Yes, unless "Forever" is checked

Once Only Controller | 仅一次控制器

Once Only逻辑控制器告诉JMeter每个线程只处理它内部的控制器一次,并在测试计划的进一步迭代期间传递它下面的任何请求。

Once Only控制器现在将始终在任何循环父控制器的第一次迭代期间执行。因此,如果Once Only控制器被放置在一个指定循环5次的环路控制器下,那么Once Only控制器将只在通过环路控制器的第一次迭代时执行(即每5次)。

注意,这意味着Once Only控制器的行为仍将与之前预期的一样

界面

参数说明

Attribute Description Required
Name 树中显示的控制器的描述性名称。 No

Interleave Controller | 交替控制器

如果你将生成或逻辑控制器添加到交错控制器中,JMeter将在每个循环迭代中交替使用其他控制器。

交替控制器

参数说明

Attribute Description Required
name 树中显示的控制器的描述性名称。 No
ignore sub-controller blocks 如果选中此项,交错控制器将把子控制器当作单个请求元素来处理,并且每次只允许每个控制器一个请求。 No
交错跨线程 如果勾选,交错控制器将在每个循环迭代中交替使用其子控制器,但在所有线程中,例如,在4个线程和3个子控制器的配置中,在第一次迭代中,线程1将运行第一个子控制器,线程2第二子控制器,线程3第三子控制器,线程4第一个子控制器,在下一次迭代中,每个线程将运行下面的子控制器 No

注: 外部交错控制器在两个内部交错控制器之间交替。然后,每个内部交错控制器在每个HTTP请求之间交替。

举例

如果交错控制器下 是两个交错控制器

Home Page, Interleaved, Bug Page, Interleaved, CVS Page, Interleaved, and FAQ Page, Interleaved.

如果交错主控制器下的两个交错控制器是简单控制器, 那么顺序就是: Home Page, CVS Page, Interleaved, Bug Page, FAQ Page, Interleaved.

Random Controller | 随机控制器

随机逻辑控制器的行为类似于交错控制器,不同的是,它不是按顺序通过其子控制器和采样器,而是在每次经过时随机选择一个。

多个控制器之间的交互可以产生复杂的行为。随机控制器尤其如此。在你假设任何给定的相互作用会带来什么结果之前,先进行实验

界面

参数说明

Attribute Description Required
Name 树中显示的控制器的描述性名称。 No
ignore sub-controller blocks 如果选中此项,交错控制器将把子控制器当作单个请求元素来处理,并且每次只允许每个控制器一个请求。 No

Random Order Controller | 随机顺序控制器

Random Order Controller很像Simple Controller,因为它最多只执行每个子元素一次,但节点的执行顺序是随机的。

界面

参数说明

Attribute Description Required
Name 树中显示的控制器的描述性名称。 No

Throughput Controller | 吞吐量控制器

吞吐量控制器允许用户控制它的执行频率。有两种模式:

  • 百分比执行
    • 使控制器通过测试计划执行一定百分比的迭代。
  • 总数执行
    • 使控制器在执行了一定的次数后停止执行。

与Once Only控制器一样,当父回路控制器重启时,此设置将被重置。

界面

当与其他控制器组合时,吞吐量控制器可以产生非常复杂的行为——特别是与交错或随机控制器作为父控制器(也非常有用)。

参数

Attribute Description Required
Name 树中显示的控制器的描述性名称。 No
Execution Style 控制器将以百分比执行模式还是总执行模式运行。 Yes
Throughput 一个数字。对于百分比执行模式,一个0-100的数字,表示控制器执行时间的百分比。"50"表示控制器将在测试计划的一半迭代中执行。对于总执行模式,number表示控制器将执行的总次数。 Yes
Per User 如果选中此选项,则per user将导致控制器计算是否应该以每个用户(每个线程)为基础执行。如果未选中,则计算将对所有用户是全局的。例如,如果使用总执行模式,而不选中"per user",则给出的吞吐量数将是执行的总次数。如果检查了"每个用户",那么执行的总数量将是用户数量乘以给定的吞吐量。 No

Runtime Controller | 运行时间控制器

运行时控制器控制其子程序的运行时间。控制器将运行其子控制器,直到超过配置的运行时为止。

界面

参数说明

Attribute Description Required
Name 树中显示的控制器的描述性名称,用于命名事务。 Yes
Runtime (seconds) 所需的运行时间(以秒为单位)。0表示不运行。 Yes

If Controller | If 控制器

If控制器允许用户控制是否运行它(其子元素)下面的test元素。

界面

默认情况下,条件只在初始条目上计算一次,但是您可以选择对控制器中包含的每个可运行元素进行计算。

最好的选项(默认选项)是检查 Interpret Condition as Variable Expression?,然后在条件字段中有两个选项:

选项1:使用包含true或false的变量

如果你想测试最后一个样本是否成功,你可以使用 ${JMeterThread.last_sample_ok}

选项2:使用函数(建议使用`${__jexl3()}`)来计算必须返回true或false的表达式

例如,以前可以使用条件:${__jexl3(${VAR} == 23)},这将被评估为true/false,然后将结果传递给JavaScript,然后返回true/false。如果选择了变量表达式,那么表达式将被计算并与”true”进行比较,而不需要使用JavaScript。

如果取消选择Interpret Condition as Variable Expression?, If Controller将在内部使用javascript来评估条件,这可能会造成非常大的性能损失,并使您的测试不太可伸缩。

参数说明

Attribute Description Required
Name 树中显示的控制器的描述性名称。 No
Condition (default JavaScript) 默认情况下,该条件被解释为返回"true"或"false"的JavaScript代码,但这可以被重写(见下文) Yes
Interpret Condition as Variable Expression? 如果选中此选项,那么条件必须是一个计算结果为"true"的表达式(忽略大小写)。例如,${FOUND}${__jexl3(${VAR} &gt;100)}。与JavaScript的大小写不同,只检查条件是否匹配"true"(大小写被忽略)。 Yes
Evaluate for all children 是否应该对所有 Children 进行状况评估?如果没有选中,则只在进入时对条件进行计算。 Yes

举例

  • ${__groovy(vars.get("myVar") != "Invalid" )} (Groovy check myVar is not equal to Invalid)
  • ${__groovy(vars.get("myInt").toInteger() <=4 )} (Groovy check myInt is less then or equal to 4)
  • ${__groovy(vars.get("myMissing") != null )} (Groovy check if the myMissing variable is not set)
  • ${__jexl3(${COUNT} < 10)}
  • ${RESULT}
  • ${JMeterThread.last_sample_ok} (check if the last sample succeeded)

While Controller | While 控制器

While控制器运行它的子控制器,直到条件为”false”。

界面

JMeter将把循环索引作为一个名为__jm__<元素名>__idx的变量公开。例如,如果你的While控制器名为WC,那么你可以通过${__jm__WC__idx}访问循环索引。索引从0开始

可能的条件值:

  • blank - 当循环中的最后一个样本失败时退出循环
  • LAST - 当循环中的最后一个样本失败时退出循环。如果循环之前的最后一个样本失败了,就不要进入循环。
  • Otherwise - 当条件等于字符串”false”时退出(或不进入)循环

举例

举例

  • ${VAR} - VAR被其他测试元素设置为false
  • $ {__jexl3 ($ {C} = = 10)}
  • $ {__jexl3 (" $ {VAR2} " = = " abcd ")}
  • ${_P(property)} - property在其他地方设置为"false"

参数说明

Attribute Description Required
Name 树中显示的控制器的描述性名称,用于命名事务。 No
Condition blank, LAST, or variable/function No

Switch Controller | 选择控制器

Switch Controller的行为类似于Interleave Controller,它在每次迭代中运行一个从属元素,但不是按顺序运行它们,而是运行由Switch值定义的元素。

switch的值也可以是名称。

如果开关值超出范围,它将运行第0个元素,因此充当数值情况的默认值。如果值是空字符串,它还运行第0个元素。
如果该值是非数字(且非空),则Switch Controller查找同名元素(大小写重要)。如果名称都不匹配,则选择名为”default“的元素(大小写不重要)。如果没有默认值,则没有选择任何元素,控制器将不运行任何东西。

界面

参数说明

Attribute Description Required
Name 树中显示的控制器的描述性名称。 No
Switch Value 要调用的从属元素的编号(或名称)。元素从0开始编号。默认值为0 No

ForEach Controller | ForEach控制器

ForEach控制器循环遍历一组相关变量的值。当您向ForEach控制器添加采样器(或控制器)时,每个采样器(或控制器)将执行一次或多次,在每次循环期间,变量都有一个新值。输入应该由几个变量组成,每个变量都有一个下划线和一个数字。每个这样的变量都必须有一个值。例如,当输入变量名为inputVar时,应该定义以下变量:

  • inputVar_1 = wendy
  • inputVar_2 = charles
  • inputVar_3 = peter
  • inputVar_4 = john

当返回变量给定为”returnVar“时,ForEach控制器下的采样器和控制器的集合将连续执行4次,返回变量分别具有上述值,然后可以在采样器中使用。

界面

参数说明

Attribute Description Required
Name 树中显示的控制器的描述性名称。 No
Input variable prefix 用作输入的变量名的前缀。默认为一个空字符串作为前缀。 No
Start index for loop 循环遍历变量的起始索引(独占)(第一个元素在起始索引+ 1处) No
End index for loop 结束变量循环索引(包括) No
Output variable 变量的名称,该变量可以在循环中用于在采样器中替换。默认为空变量名,这很可能是不需要的。 No
Use Separator 如果不勾选,则省略"_"分隔符。 Yes

Module Controller | 模块控制器

模块控制器提供了一种在运行时将测试计划片段替换为当前测试计划的机制。

一个测试计划片段由一个控制器和它包含的所有测试元素(采样器等)组成。片段可以位于任何线程组中。如果片段位于一个线程组中,那么它的控制器可以被禁用,以防止除了模块控制器之外的片段运行。或者您可以将片段存储在一个虚拟线程组中,并禁用整个线程组。

可以有多个碎片,每个碎片下都有不同系列的采样器。通过在下拉框中选择适当的控制器,模块控制器就可以轻松地在这些多个测试用例之间切换。这为快速轻松地运行许多备用测试计划提供了便利。

模块控制器使用的任何片段都必须有一个唯一的名称,因为该名称用于在重新加载测试计划时找到目标控制器。由于这个原因,最好确保Controller名称从默认更改为Controller名称,否则在向测试计划添加新元素时可能会意外创建副本。

界面

Transaction Controller | 事务控制器

事务控制器生成一个额外的示例,用于度量执行嵌套测试元素所花费的总时间。

注意:当勾选”包含生成样本中定时器和前后处理器的持续时间”复选框时,该时间包括控制器范围内的所有处理,而不仅仅是样本。

有两种操作模式:

  • 在嵌套样例之后添加附加样例
  • 附加样例作为嵌套样例的父类添加

生成的采样时间包括所有嵌套采样的时间,不包括默认的(自2.11起)计时器和前后处理器的处理时间,除非选中了 Include duration of timer and pre-post processors in generated sample (包括生成样本中的计时器和前后处理器的持续时间)复选框。根据时钟分辨率的不同,它可能比单个采样器加计时器的总和稍长。时钟可能在控制器记录开始时间后滴答作响,但在第一个样本开始之前。最后也是一样。

只有在所有子样本都成功的情况下,生成的样本才被认为是成功的。

在父模式中,断言(等等)可以添加到事务控制器。但是默认情况下,它们将同时应用于单个示例和整个事务示例。为了限制断言的范围,可以使用一个简单控制器来包含示例,并将断言添加到简单控制器。父模式控制器目前不支持任何类型的嵌套事务控制器。

界面

Attribute Description Required
Name 树中显示的控制器的描述性名称,用于命名事务。 Yes
Generate Parent Sample 生成父样本 Yes
Include duration of timer and pre-post processors in generated sample 是否在生成的样本中包括定时器、预处理和后处理延迟。默认的是假的 Yes

Recording Controller | 记录控制器

记录控制器是一个占位符,指示代理服务器应该将样本记录到何处。在测试运行期间,它没有效果,类似于简单控制器。但是在使用HTTP(S)测试脚本记录器进行记录的过程中,所有记录的样本将默认保存在记录控制器下。

界面

参数说明

Attribute Description Required
Name 树中显示的控制器的描述性名称。 No

Critical Section Controller | 临界区控制器

临界区控制器确保它的子元素(采样/控制器等)将只被一个线程执行,因为在执行控制器的子元素之前会获取一个命名锁。

界面