JMeter逻辑控制器之If Controller


条件控制器,可以通过某个条件来控制其节点下的元件是否执行。即根据给定表达式的值决定是否执行该节点下的子节点,表达式的值为true则执行,为false则不执行。

参数介绍

在这里插入图片描述

界面上红色字体如下所示:

For performance it is advised to check “Interpret Condition as Variable Expression”
and use __jexl3 or __groovy evaluating to true or false or a variable that contains true or false.
为了提高性能建议使用“Interpret Condition as Variable Expression”,并使用__jexl3函数或__groovy函数对该变量表达式求值为true/false(如${__groovy(1==1),}),或者可直接输入true/false的变量(如${变量名}),用来控制是否执行。
${JMeterThread.last_sample_ok) can be used to test if last sampler was successful
${JMeterThread.last_sample_ok}可用于检测最后一个取样器是否成功执行
属性描述必填
Name控制器名称,可以根据实际情况进行设置
Comments注释,描述在业务中的作用
Condition (evaluated with javascript)默认情况下,该条件被解释为返回"true"或"false"的JavaScript代码
Expression (must evaluate to true or false)表达式(值必须是true或false)
Interpret Condition as Variable Expression?如果选择了这个,那么条件必须是一个计算值为"true"的表达式
Evaluate for all children?勾选:表达式会在if controller节点下的每个取样器之前执行一次,根据表达式结果判断是否执行该取样器。 不勾选:只在if controller入口处执行一次,根据结果判断是否执行下面的脚本。

不勾选Interpret Condition as Variable Expression?

在这里插入图片描述
如果你 不勾选“Interpret Condition as Variable Expression?”,If Controller内部使用javascript来计算条件,这将带来非常大的性能损失,并降低测试的可伸缩性,所以不建议使用这种情况。
实例:有这样一个场景,登录后获取Home Page内容,登录成功会返回code:200的代码,并且获取Home Page需要登录的token。

  1. 创建线程组后创建一个Login请求,在Login请求节点下添加两个后置处理器Regular Expression Extractor,一个获取token一个获取code,如下所示:

在这里插入图片描述
在这里插入图片描述

  1. 在线程组下添加一个BeanShell Sample,用来设置code和token的全局变量,如下图所示:
    在这里插入图片描述
  2. 如果登录成功,那么我们就获取Home Page内容,所以我们在线程组添加一个逻辑控制器 If Controller来判断其子节点是否运行。在If Controller节点下添加一个获取Home Page的请求,并且请求下添加配置元件HTTP Header Manager,把token信息添加进去。

在这里插入图片描述

  1. 再在If Controller的Expression输入框下直接写入表达式判断是True还是False,判断登录后的code是否为200,如果为true就执行,如下图所示:
    在这里插入图片描述

勾选Interpret Condition as Variable Expression?

此时,If Controller的Expression输入框中不能直接填写判断条件的表达式,需要利用__jexl3函数或__groovy函数将条件表达式求值计算为true/false才有效。表达式可以自己写,也可以利用Jmeter函数助手Function Helper Dialog来生成。
还是按照上面的示例进行讲解,只是需要把第四点修改一下即可。
If Controller的Expression输入框下利用__groovy函数${__groovy(${__property(sucesscode,,)}==200,)}将条件表达式计算为true或者false,从而判断子节点是否执行,如下图所示:
在这里插入图片描述

勾选Evaluate for all children?

Evaluate for all children就是在执行每个请求前都会去执行If Controller设定的表达式,如果表达式为True继续执行,为False就不执行这个请求。
还是根据上面的示例,我们在If Controller节点下再增加一个请求,假如在发送这个请求前我们更改了code的值,那么我们这个请求还会发送吗?
在这里插入图片描述

此时的执行顺序是:先执行If Controller的表达式,如果为True就会执行HTTP Head Manage,再执行前置处理器,再执行Home Page请求;再执行HTTP Request之前需要再此去执行If Controller的表达式,如果为True就执行,为false就不执行。

不勾选Evaluate for all children?

不勾选,只会执行一次If Controller的表达式(即入口处执行一次),执行完表达式判断是否为True,如果为True就会执行其下子节点。根据上面的示例,Home Page和HTTP Request都会执行。

JMeterThread.last_sample_ok

在Expression输入框中输入${JMeterThread.last_sample_ok}表示判断上一个请求是否成功。
实例:在If Controller节点下添加两个请求,第一个请求失败,那么第二个请求不会执行,第一个请求成功,那么第二个请求也会执行。
在这里插入图片描述
执行结果如下图所示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值