Jmeter基础之JMeter中如果(If)控制器详解 1、什么是逻辑控制器
JMeter官⽹对逻辑控制器的解释是:“Logic Controllers determine the order in which Samplers are processed.”。
意思是说,逻辑控制器可以控制采样器(Samplers)的执⾏顺序。
由此可知,控制器需要和采样器⼀起使⽤,否则控制器就没有什么意义了。放在控制器下⾯的所有采样器,都会当做⼀个整体,执⾏时也会⼀起被执⾏。
JMeter提供了多种逻辑控制器,它们各个功能都不相同,⼤概可以分为两种使⽤类型:
控制测试计划执⾏过程中,节点的逻辑执⾏顺序,如:ForEach Controller(ForEach控制器),Loop Controller(循环控制器)、If Controller(如果if控制器)等;
对测试计划中的脚本进⾏分组,⽅便JMeter统计执⾏结果,以及进⾏脚本的运⾏时控制等,如:Throughput Controller(吞吐量控制器)、Transaction Controller(事务控制器)等。
2、如果控制器介绍
在实际⼯作中,当使⽤JMeter做性能测试脚本或者接⼝测试脚本时,当遇到需要对不同的条件做不同的操作时,我们可以使⽤JMeter中如果(If)控制器来实现。 添加如果(If)控制器组件操作:选中“线程组”右键 —> 添加 —> 逻辑控制器 —> 如果(If)控制器。
界⾯如下图所⽰:
如果(If)控制器组件界⾯说明:
名称:如果(If)控制器组件的⾃定义名称,见名知意最好。
注释:即添加⼀些备注信息,对该如果(If)控制器组件的简短说明,以便后期回顾时查看。
Expression (must evaluate to true or false):填写条件表达式,评估结果必须为真或假。
换句话说,是执⾏流程验证的条件,⽤于决定是否应执⾏⼦元件。默认情况下,条件被解释为true或false的JavaScript代码。
Interpret Condition as Variable Expression?:将条件解释为变量表达式?
意思是说:
如果不勾选此选项,则输⼊的条件表达式,将会使⽤JavaScript进⾏解析,得到需要的true/false结果。
malaki paul
如果勾选此选项:
1)输⼊的条件表达式,不会使⽤JavaScript进⾏解析,⽽是将条件视为JMeter的变量。
2)如果需要进⾏条件判断,则需要使⽤__jexl3或者__groovy函数,来⽣成函数表达式。通过函数表达式,得到需要的true/false结果。 Evaluate for all children?:条件作⽤于每个⼦项进⾏评估。
如果勾选该项,则该控制器在每⼀个⼦节点执⾏时前,执⾏⼀次。
默认情况下,该控制器可以对在其下⾯的所有可运⾏的组件,进⾏控制执⾏,但只在⼊⼝执⾏⼀次。
说明:
3、如果控制器的使⽤
(1)测试计划内包含的元件
添加元件操作步骤:
1. 创建测试计划。
2. 创建线程组:选中“测试计划”右键 —> 添加 —> 线程(⽤户) —> 线程组。
3. 在线程组中,添加逻辑控制器“如果(If)控制器”组件:选中“线程组”右键 —> 添加 —> 逻辑控制器 —> 如果(If)控制器。
4. 在逻辑控制器中,添加取样器“HTTP请求”组件:选中“逻辑控制器”右键 —> 添加 —> 取样器 —> HTTP请求。
5. 在线程组中,添加“察看结果树”组件:选中“线程组”右键 —> 添加 —> —> 察看结果树。
最终测试计划中的元件如下:
点击运⾏按钮,会提⽰你先保存该脚本,脚本保存完成后会直接⾃动运⾏该脚本。
(2)如果控制器界⾯内容
我们演⽰使⽤JavaScript解析表达式的⽤法,步骤如下:
1. 取消勾选Interpret Condition as Variable Expression?选项,否则将不能使⽤JavaScript解析表达式。
2. 在条件输⼊框中,输⼊最基本的条件表达式即可。
我编写了⼀个恒true的表达式,如下图所⽰:
(3)HTTP请求界⾯内容
⼀个标准的 Get请求,访问百度⾸页,不做过多说明。
如下图所⽰:
4)运⾏结果
因为如果(If)控制器中的表达式为true,所以可以执⾏它下⾯的所有取样器请求。
如下图所⽰:
测试网页游戏
若如果(If)控制器中的表达式解析结果为false,则该控制器下⾯的请求则不执⾏。
4、如果控制器中表达式的写法
如果(If)控制器中的表达式有两种⽅式:
1. ⼀种使⽤JavaScript语⾔解析条件表达式,表达式为基本的条件表达式写法。
2. 另⼀种是使⽤__jexl3或者__groovy函数,通过函数表达式,得出我们需要的true或false结果。
真空玻璃管(1)使⽤JavaScript语⾔解析表达式
即:取消勾选Interpret Condition as Variable Expression?选项。葡萄藤下的玫瑰
最基本的⼏种写法:
1. 数字判断表达式:${var}==1。
2. 字符串判读表达式:"${var}"=="字符串"。
提⽰:如果${var}参数化变量取到的值本⾝就带双引号,则前边不需要加双引号。
3. 如果${var}参数化变量的值就是⼀个布尔值,则表达式为:${var}。
但是要注意,布尔值变量必须都是⼩写的。
说明:${var}表⽰参数化变量的引⽤。我们可以引⽤⾃定义变量,或者CSV⽂件读取到的数据,在或者是上⼀个请求中提取来的值。
(2)使⽤函数来编写条件表达式刻字笔
即:勾选Interpret Condition as Variable Expression?选项。
我们需要⽤到函数助⼿中的__jexl3或者__groovy函数,直接输出true/false结果。
下⾯以__jexl3函数为⽰例,进⾏演⽰。
__jexl3函数界⾯如下:
参数说明:
JEXL expression to evaluate:填写要计算的表达式。
Name of variable in which to store the result (optional):给函数结果定义⼀个可被引⽤的变量名(可选)。__jexl3函数条件格式:${__jexl3(条件表达式)}
==是否等于,如${__jexl3(${VAR}==1,)},判断${VAR}变量是否等于1。
!=不等于,如${__jexl3(${VAR}!=1,)},判断${VAR}变量是否不等于1。
!⾮,如${__jexl3(!(${VAR}!=1),)},对${VAR}!=1的结果取反。
&&且和||或,如${__jexl3(${VAR}==1 && "${name}" != "张三",)}。
>⼤于或者>=⼤于等于,如${__jexl3(${count}>=10,)}。
编辑好的界⾯内容如下:
提⽰:
1. 把⽣成的__jexl3函数表达式,粘贴到如果(If)控制器界⾯中。
2. 看到The result of the function is中有值,说明表达式正确,但是上⾯返回false这个值,不⼀定正确,还要看脚本运⾏中实际的结
果。
这样就完成了使⽤__jexl3函数编写表达式的⽤法。(__groovy函数同理)
说明:
尽可能使⽤"解释条件作为变量表达式"选项,然后使⽤__jexl3或者__groovy函数⽣成条件表达式。
因为运⾏模拟⼤量⽤户的性能脚本时,这样消耗的资源最⼩。
WHY?
If Controller使⽤JavaScript解释条件,是每个解释都占⽤资源,但本来就是⼀个测试性能的软件,不应因解析条件⽽消耗更多的资源。
即:如果你使⽤“解释条件作为变量表达式”,⽽不是使⽤Javascript解释表达式,这样能节省更多的性能资源。
(3)Evaluate for all children?选项说明
如果你勾选了Interpret Condition as Variable Expression?选项,同时也勾选了Evaluate for all children?选项。
则填写在如果(If)控制器中的表达式,需要为${JMeterThread.last_sample_ok}。
${JMeterThread.last_sample_ok}表达式的意思是:检查上⼀个请求是否成功。
⽽整个控制流程的效果是,控制其下的所有取样器:
1. 如果前⼀个请求为成功,则${JMeterThread.last_sample_ok}为true,否则为false。
2. 下⼀个请求拿${JMeterThread.last_sample_ok}的值来判断是否执⾏,如果为true,则继续执⾏,如果为false则不执⾏,且后边的所
有请求都不执⾏。
潜流带
如下图所⽰: