Jmeter系列之控制器(二)

798 阅读2分钟

基于Jmeter5.2.1

目录

Jmeter系列之测试计划、线程组、采样器(一)
Jmeter系列之配置元件(一)
Jmeter系列之监听器(一)
Jmeter系列之控制器(一)
Jmeter系列之控制器(二)
Jmeter系列之作用域、执行顺序
Jmeter系列之BeanShell使用

  这一节会继续介绍剩下的几个控制器。

Switch Controller

  开关控制器和随机控制器很类似,也是每次线程循环只会运行一个子元件,不同的是开关控制器是根据Name字段来确定一个子元件来执行。常用在需要根据上一个接口的返回值来确定下一个接口的情况下。

image.png

  通过给Swicth Value赋值,来指定运行哪个采样器,有两种赋值方式:
image.png

  注意:
  如果Switch Value为空或数值超过了范围,默认执行第1个子节点,即编号为0的子节点。

Foreach Controller

  如果一个变量需要赋多个值来使用时可以使用Foreach控制器。
  比如:现在org_no需要赋值1000, 1001, 1002。
  这里也有其他的方式实现:比如利用CSV Data Set Config,参数文件用三行来写入:1000,1001,1002,再加上Loop Controller,设置循环次数为3。
  但现在Foreach Controller让实现更加简洁和简单。

image.png


1 :名称和注释
2 :输入变量名称的前缀,比如我这里应该输入org_no
3 :循环开始的索引,开区间
4 :循环结束的索引,闭区间,即:如果设置的是(0,3],那么索引值是1,2,3
5 :输出变量名称,其他地方根据这个变量名称来使用这个值
6 :在索引前加上_,最后会是org_no_1

例子:
1、先在用户定义变量User Defined Variables里设置对应的变量名和值:
image.png

2、设置Foreach Controller:
image.png

3、采样器中使用
image.png
  这里的${org_no}就是2中Foreach Controller中配置Output variable name。

4、控制器下的子元件
image.png

5、结果
image.png


Runtime Controller

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

image.png

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

If Controller

  顾名思义,和编程语言的if语句一样,条件为true的话就运行控制器下的子元件。

image.png


1:表达式,返回true,会执行控制器下的子元件,表达式有两种形式
image.png

举例

${__groovy(vars.get("myVar") != "Invalid")}
${__groovy(vars.get("myInt").toInteger() <= 4)}
${__groovy(vars.get("myVar") != null)}
${__jexl3(${count} < 10)}
${__jexl3("${count}"=="10")}
${myVar}
${JMeterThread.last_sample_ok}

注意:${变量名}这种方式取出来的变量跟存进入是一模一样的,比如你存1001,取出来还是1001,而不是"1001",vars.get("myVar")取出来的就都是字符串。所以这里会引出一个问题,如果是数字,那么直接用:

${__jexl3(${code}==200)}

如果是字符串(实际取出来是abcd,没有双引号),需要认为加个双引号去判断,用

${jexl3("${code}")=="abcd"}。


  举一反三,在配置元件中说过的CSV Data Set Config,以及其他地方提过的设置用户变量的地方,字符串都是没有双引号的,需要自己加上。
  例如:

image.png

image.png


2 :默认勾选,表示将条件解释为变量表达式,如果取消选中,则Controller会在内部用javascript评估条件,可能会导致很大的性能损失,所以这里****保持默认就可以了

3 :默认情况下,条件在初始入口仅判断一次,如果想要控制所有子元件都检查条件是否满足,需要勾选Evaluate for all children?

While Controller

  顾名思义,与开发语言的while功能一致,循环执行控制器下的子元件,直到条件为false时,停止运行。

image.png

Condition可能的条件值:
image.png


  Condition可以是最终为false的任何变量和函数,所以上述的If Controller中的__jexl3()、__groovy()同样可使用。
举例

${myVar}
${__jexl3(${myVar}==10)}
${__groovy(vars.get("myVar").toInteger==10)}
${__jexl3("${myVar}"=="abcd")}
${_P(property)}