JMeter教程系列(二)-控制器介绍

逻辑控制器

逻辑控制器主要是用来控制采样器执行顺序的。

1简单控制器

简单控制器其实没有什么作用,仅仅是用来组织采样器和其他逻辑控制器,有和没有简单控制器,不会改变采样器执行顺序。

2 循环控制器

循环控制器会根据你设置的循环次数以及在线程组设置的循环次数来进行,比如你在循环控制器设置了2次,在线程组设置了3次,那么这个控制器下的采样器在整个测试计划中会被执行6次。如果其中一个设置成永远,除非手动停止,否则一直运行

 如果设置线程组的循环次数为1,循环控制器的循环次数为5,则执行顺序为Home Page, News Page, News Page, News Page, News Page, and News Page.

3 仅一次控制器

仅一次控制器就是每个线程在他的父循环中(线程组或者控制器)仅仅执行一次而已(第一次迭代被执行),在后面的迭代过程中都会通过。

也就是说,如果把仅一次控制器放在线程组下,那么每个线程的所有迭代仅执行一次,如果放在循环控制器中(比如循环5次),那么每5次会执行1次,且在第一次被执行。

一般用在登录场景

 设置线程组循环3次,那么执行顺序为 Home Page, Bug Page, Bug Page, Bug Page

4 交替控制器

交替控制器也就是每次循环交替执行,如果把其他逻辑控制器放在交替控制器下,也会被交替执行各逻辑控制器。

忽略子控制器块-如果勾选,交替控制器会把每个控制器当成一个请求,而且在每次每个控制器只执行一个请求。

线程间交替-如果勾选,在每次迭代的时候,每个线程交替执行这个控制器下的子控制器。比如配置了4个线程组和3个子控制器,那么在第一次迭代的时候,线程1执行子控制器1,线程2执行子控制器2,线程3执行子控制器3,线程4执行子控制器1,下次迭代会继续执行下一个子控制器。

 以上假设设置了2个线程,5次循环,那么每个线程会执行10次请求,他的执行顺序是news page, log page, FAQ page, log page, gump page, log page, news page, log page, FAQ page, log page

 以上是一个更复杂的例子,交替控制器的外部还有交替控制器,外部控制器在两个内部控制器之间交替,然后内部控制器在两个采样器之间交替,每个线程发送的请求顺序是 Home Page, Interleaved, Bug Page, Interleaved, CVS Page, Interleaved, and FAQ Page, Interleaved

如果内部的两个交替控制器修改为简单控制器,那么执行顺序变为:Home Page, CVS Page, Interleaved, Bug Page, FAQ Page, Interleaved.

但是,如果在外部交替控制器勾选了忽略子控制器块,顺序就会变为:Home Page, Interleaved, Bug Page, Interleaved, CVS Page, Interleaved, and FAQ Page, Interleaved. 

5 随机控制器

随机控制器类似交替控制器,只不过不是按照子控制器的顺序执行,而是随机选取一个 

忽略子控制器块-如果勾选,交替控制器会把每个控制器当成一个请求,而且在每次每个控制器只执行一个请求。

6 随机顺序控制器

不同于随机控制器,该控制器下的所有元素都会被请求,只不过顺序是随机的。

7 吞吐量控制器

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

  • 百分比执行  在整个测试计划中执行百分比
  • 总计执行  在执行了指定的次数之后不再执行 

如果是在循环控制器下,这个模式会被重置。

有两个变量设置,

吞吐量- 0-100数值,如果选择百分比执行模式,则代表整个计划迭代过程中执行百分比;如果选择总计执行,则代表执行次数

每个用户-如果勾选,也就是每个用户都会计算这个值。否则就是全有用户通用。比如,总计模式设置20,那么如果勾选,就是每个用户执行20次;如果不勾选,就是所有用户加起来执行20次


这个控制器非常复杂,普通情况下很少使用。

8 运行时控制器

运行时控制器是控制执行的时长。以秒为单位,如果设置0,代表不执行。

9 如果控制器

如果控制器就是控制在满足什么条件情况下决定是否需要执行。

默认控制器仅在入口处计算一次条件,当然如果勾选Evaluate for all children,那么每次执行一个子元素,就会计算一次条件,我们不推荐这么用。

推荐勾选Interpret Condition as Variable Expression? 勾选之后,可以有两种方式

  • 你可以直接使用结果值是true或者false的变量,比如你有个变量是is_success,那么可以使用${is_success}作为条件
  • 使用函数(${__jexl3()}来进行表达式计算,计算结果必须是true或者false, 比如${__jexl3(${VAR} == 23)}

如果要验证一个变量是否未定义或者为空,可以使用"${myVar}" == "${myVar}"

反之,要验证一个变量是否定义且不为空,可以使用"${myVar}" != "${myVar}"

几个表达式案例

  • ${__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)

10 while控制器-另一个循环控制器

这个循环控制器不同于之前,他是在某个条件下才进行循环或者退出循环,而前面的loop循环控制器是根据指定的次数进行

while循环控制器会一直循环,直到条件状态变为false才停止

jmeter提供一个变量来记录当前循环的次数(从0开始),这个变量格式是__jm__<Name of your element>__idx,也就是如果你的while控制器命名为wc,那么这个变量值就是${__jm__WC__idx}

条件是必须最终能够计算结果为false的,可以是变量,函数等

  • ${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

11 switch控制器

switch控制器每次迭代只会执行一个,具体是根据设置的switch值

switch值其实就是他的子元素的位置或者名称,从0开始计数,默认是0

如果switch值超过了范围,或者为空,就是执行第0个元素;如果非数字或者非空,那么就去找对应的名称,大小写敏感,如果找不到,就会找名称为‘default’的元素,如果没有default元素,那么啥也不执行

12 ForEach控制器-另一个循环控制器

foreach循环控制器是根据设置的一系列变量值,变量值在每次循环后会被修改。这些变量名以下划线(可选)和数字组成,且必须有值、

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

如果有需要,还可以定义返回变量。

 第一个HTTP1请求通过正则表达式提取器会返回一个结果集,这个结果集作为foreach控制器的循环输入,循环发送HTTP2

13 模块控制器

模块控制器是用来在运行时替换测试片段的。一个测试片段指的是一个控制器和其控制器下的所有元素组成。片段可以在线程组的任何地方。片段本身不会被执行,除非在模块控制器中指定。或者你可以把片段保存为一个伪线程组。

可能会有多个片段,那么使用模块控制器可以通过选择对应的控制器,从而轻松的切换这些片段进行执行。这也使得运行多个可更替的测试计划更加方便。片段必须是唯一的命名,这样可以容易找到,片段的命名实际上就是一个路径,比如测试计划-线程组-片段1

14 include控制器

include控制器就是用来引用外部jmx文件的。

15 事务控制器

事务控制器会产生额外的一个采样器用来计算该控制器下的所有采样器执行的时间。如果勾选Include duration of timer and pre-post processors in generated sample,同时会把定时器和前后置处理器的时间计算上。

16 录制控制器

录制控制器就是告诉代理服务器把录制的请求放在这个控制器里,在运行过程中,没有任何影响,就和简单控制器一样。你可以通过HTTP(S) Test Script Recorder这个默认录制的请求都到这个控制器下。

原文地址:https://www.cnblogs.com/happyuu-2019/p/13594513.html