JMeter逻辑控制器之如果(if)控制器
一、背景
在使用Jmeter做性能测试、接口自动化测试时,需要针对不同的条件,进行不同的操作,此时,可以使用JMeter中的如果(If)控制器来实现。
二、控制器介绍
1、控制器作用
JMeter中的如果(If)控制器,主要是用来控制它下面的测试元素是否执行。如果判断为真(True)那就执行,否(false)就不执行。
2、控制器添加
如果(If)控制器组件添加位置:选中“线程组”右键 —> 添加 —> 逻辑控制器 —> 如果(If)控制器
,如图所示:
3、参数说明
-
第一个参数:
- Expression (must evaluate to true or false) :表达式(结果值必须是true或false)。在右边文本框中输入的条件值必须是true 或 false。
-
第二个参数:
- Interpret Condition as Variable Expression?:默认勾选项,将条件解释为变量表达式(需要使用__jexl3 or __groovy 表达式)
-
第三个参数:
- Evaluate for all children?:条件作用与每个子节点,默认不勾选。仅在If Controller入口处判断一次
-
第四个参数:
- use status of last sample: 作用就是只有当上一个请求成功后,才会执行if控制器下的请求。
注意:
1、文本框上的黄色感叹号,就是建议采用默认的jexl3 or groovy 表达式,以提高性能。
2、if 控制器 只能作用于其下的子项
三、表达式说明
1、jexl3 or groovy 表达式
-
jexl3表达式格式
${__jexl3(条件表达式)}
-
groovy 表达式
${__groovy(条件表达式}
-
逻辑表达式说明
- ==
- 含义:是否等于
- 示例:如${__jexl3(${VAR}==1,)},判断${VAR}变量是否等于1。
- !=
- 含义:不等于
- 含义:如${__jexl3(${VAR}!=1,)},判断${VAR}变量是否不等于1。
- !
- 含义:非
- 示例:如${__jexl3(!(${VAR}!=2),)},对${VAR}的值不等于2,其判断为真,那么执行IF下的子项。
- &&
- 含义:并且
- 示例:如${__jexl3(${VAR}1 && "${name}" != "李四",)},也就是${VAR}1和表达式 "${name}" != "张四"均为真时,执行IF控制器下的子项。
- ||
- 含义:或
- 示例:如${__jexl3(${VAR}1 && "${name}" != "李四",)},也就是${VAR}1和表达式 "${name}" != "张四"其中一项为真时,执行IF控制器下的子项。
>=
- 含义:大于等于
- 示例:如${__jexl3(${count}>=15,)}。也就是${count}>=15,其判断为真,那么执行IF控制器下的子项。
- ==
注意:
如果判断表达式是字符串,此时,必须要用引号,变量都认为时字符串的形式,如:${__jexl3("${name}"=="成都",)},不能用${__jexl3(${name}=="成都",)}
2、函数助手调用
启动jmeter界面后,可以在JMeter的选项菜单中找到函数助手对话框(快捷键:Ctrl+Shift+F1),如下图所示:
3、JavaScript
表达式
采用JavaScript
其实就是在如果(IF)逻辑控制器中,取消勾选Interpret Condition as Variable Expression?
选项,如图所示:
-
数字表达式
${var}==1
-
字符串表达式
"${var}"=="字符串"
注意:如果
${var}
参数化变量取到的值本身就带双引号,则前边不需要加双引号。 -
布尔值表达式
${var}
注意:布尔值变量必须都是小写的
注意:${var}
表示参数化变量的引用。可以引用自定义变量,或者CSV文件读取到的数据,在或者是上一个请求中提取来的值。
四、采用默认函数形式(推荐)
采用默认函数形式,也就是采用默认的jexl3 or groovy 表达式,在此,用示例演示一下,if逻辑控制器的使用方法。
首先,添加用户定义变量,后续接口根据变量,判断执行哪一个请求
然后,在如果(if)控制器中,添加表达式,可以用函数助手生成表达式。例子中为了演示,用户定义变量中设定baidu时,就执行如果(if)控制器之下的请求。
然后,再添加一个如果(if)控制器中,添加表达式,看看是否按用户定义变量中设定值来确定请求接口。
最后,可以看到百度接口请求成功
五、采用JS语法形式(不推荐)
采用JS语法形式,使用JavaScript
语言解析条件表达式,表达式为基本的条件表达式写法。
其用法就是,首先在如果(IF)逻辑控制器中,去掉 “Interpret Condition as Variable Expression?” 前面复选框,然后直接输入条件表达式。具体演示如下:
首先,添加用户定义变量,后续接口根据变量,判断执行哪一个请求
然后,在如果(if)控制器中,添加表达式。例子中为了演示,用户定义变量中设定baidu时,就执行如果(if)控制器之下的请求。
然后,再添加一个如果(if)控制器中,添加表达式,看看是否按用户定义变量中设定值来确定请求接口。
最后,可以看到百度接口请求成功
六、选择use status of last sample示例
选择use status of last sample时,下一个请求拿${JMeterThread.last_sample_ok}
的值来判断是否执行,如果为true,则继续执行,如果为false则不执行,且如果(if)控制器之下的所有请求都不执行。
首先,添加用户定义变量,后续接口根据变量,判断执行哪一个请求
然后,在如果(if)控制器中,点击use status of last sample,然后生成${JMeterThread.last_sample_ok}表达式。
最后,可以看到,第一个请求失败后,如果(if)控制器之下的所有请求都不执行,但如果(if)控制器之外的请求,依然可以正常执行
七、参考
1、官方文档:https://jmeter.apache.org/usermanual/component_reference.html#If_Controller