1、while控制器
- Condition为空:当最后一个节点运行失败时退出循环。若失败节点不是最后一个(例如中间的节点),则会一直循环执行下去。
- Condition为LAST:当最后一个节点运行失败时退出循环。若该控制器的上一个节点失败了,则TestPlan执行时不再进入该控制器。
- Condition表达式:当表达式为false时退出循环。表达式可以是最终计算为“ false”的任何变量或函数。 这样可以根据需要使用__jexl3,__ groovy函数,属性或变量。例如:
- ${VAR} - where VAR is set to false by some other test element
- ${__jexl3(${C}==10)}
- ${__jexl3("${VAR2}"=="abcd")}
- ${_P(property)} - where property is set to "false" somewhere else
Condition为空举例:
情况1:
情况2:
Condition为LAST举例:
Condition表达式举例:
2、事务控制器(Transaction Controller):
事务控制器生成额外的事务采样器来测量其嵌套测试元素所花费的总时间。注意:
如果勾选"Include duration of timer and pre-post processors in generated sample" ,该时间包括控制器范围内的所有处理时间,例如计时器、前置和后置处理器等,而不仅仅是采样器的。
两种模式:
- additional sample is added after the nested samples:不勾选"Generate parent sample",作为额外采样器添加到其嵌套采样器后面,简称“额外模式”;
- additional sample is added as a parent of the nested samples:勾选"Generate parent sample",作为其下子采样器的父采样器,简称“父模式”;
“额外模式”举例:
事务控制器作为额外采样器统计的时间为其嵌套采样器的所有时间总和。默认情况下不包括计时器、前置/后置处理器的时间(除非勾选"Include duration of timer and pre-post processors in generated sample")。因时钟频率的问题,它可能会比单个采样器时间总和稍长。在控制器记录开始时间之后但在第一个采样开始之前,时钟可能滴答滴答开始了。
“父模式”举例:
在该模式下,事务控制器下的子采样器只能在the Tree View Listener里才可以看到。子采样器的数据也不会在CSV日志文件中显示,但是可以保存到xml文件中。
3、ForEach控制器:
可以看到控制器按照设置的循环字段要求0-4打印了相关变量值。
4、If控制器(If Controller)
最好的选项(默认选项)是选中“Interpret Condition as Variable Expression?”,然后在条件字段中有2个选项:
选项1:使用包含true或false的变量,如果要测试上一个采样器是否成功,可以使用${JMeterThread.last_sample_ok}来判断
选项2:使用函数(建议使用$ {__ jexl3()})来评估必须返回true或false的表达式
选项1示例:
选项2示例:
若不满足条件,则控制器将不执行,例如当线程数为1时:
若满足条件,则控制器将正常执行:
5、交替控制器(Interleave Controller)
每次迭代时,顺序选取其下的一个子节点循环执行。
ignore sub-controller blocks(忽略子模块控制):选择该项时,每个子控制器每次只允许发出一个请求。
Interleave across threads:跨线程交替
示例1:不勾选“忽略子模块控制”
例子1:只有交替控制器作为主控制器,无子控制器
例子2:交替控制器作为主控制器,并有交替控制器和循环控制器作为其子控制器
示例2:勾选“忽略子模块控制”
每个子控制器每次循环只允许发出一个请求。
例子1:
可以看到,子交替控制器每次循环只发出一个请求。
例子2:增加一个“循环控制器”作为子控制器
例子2:
可以看出,虽然循环控制器下有两个子节点,但是因为勾选了“忽略子控制块”导致其每次循环只能执行一个子节点的请求,"访问hao123"永远无法执行。
6、循环控制器(Loop Controller)
按照设定的循环次数循环执行其子节点。
7、仅一次控制器(Once Only Controller):
该控制器告诉JMeter每个线程仅对其内部的控制器进行一次处理,并在进一步迭代期间通过测试计划传递其下的所有请求。例如2个线程循环3次的线程组下使用该控制器,则该控制器下的节点将仅仅在第一次循环时执行,剩下的循环不再执行。
对于需要登录的测试,请考虑将登录请求放置在此控制器中,因为每个线程只需要登录一次即可建立会话。
若将仅一次控制器作为“循环控制器”的子节点,则仅一次控制器仅仅在循环控制器的第一次迭代时被执行,例如将“仅一次控制器”放置在指定要循环3次的“循环控制器”下,则“仅一次控制器”将仅在通过“循环控制器”的第一次迭代中执行(即每3次执行一次)。例如:
8、随机控制器(Random Controller)
随机执行其下的子节点。