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

posted @ 2022-11-01 17:57  xyztank  阅读(4697)  评论(0编辑  收藏  举报