『动善时』JMeter基础 — 39、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
结果。
如果勾选此选项:
1)输入的条件表达式,不会使用JavaScript
进行解析,而是将条件视为JMeter的变量。
2)如果需要进行条件判断,则需要使用__jexl3
或者__groovy
函数,来生成函数表达式。通过函数表达式,得到需要的true/false
结果。Evaluate for all children?
:条件作用于每个子项进行评估。
如果勾选该项,则该控制器在每一个子节点执行时前,执行一次。
默认情况下,该控制器可以对在其下面的所有可运行的组件,进行控制执行,但只在入口执行一次。
说明:
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.
${JMeterThread.last_sample_ok} can be used to test if last sampler was successful
意思为:
- 为了提升性能,建议将“将条件解释为变量表达式”勾选。
- 并使用
__jexl3
或者__groovy
函数,来评估表达式条件的真假。- 并且
${JMeterThread.last_sample_ok}
变量,可用于测试最后一个采样器是否成功。默认“将条件解释为变量表达式”是勾选状态,取消勾选,则上面的提示会变红。
3、如果控制器的使用
(1)测试计划内包含的元件
添加元件操作步骤:
- 创建测试计划。
- 创建线程组:
选中“测试计划”右键 —> 添加 —> 线程(用户) —> 线程组
。 - 在线程组中,添加逻辑控制器“如果(If)控制器”组件:
选中“线程组”右键 —> 添加 —> 逻辑控制器 —> 如果(If)控制器
。 - 在逻辑控制器中,添加取样器“HTTP请求”组件:
选中“逻辑控制器”右键 —> 添加 —> 取样器 —> HTTP请求
。 - 在线程组中,添加监听器“察看结果树”组件:
选中“线程组”右键 —> 添加 —> 监听器 —> 察看结果树
。
最终测试计划中的元件如下:
点击运行按钮,会提示你先保存该脚本,脚本保存完成后会直接自动运行该脚本。
(2)如果控制器界面内容
我们演示使用JavaScript
解析表达式的用法,步骤如下:
- 取消勾选
Interpret Condition as Variable Expression?
选项,否则将不能使用JavaScript
解析表达式。 - 在条件输入框中,输入最基本的条件表达式即可。
我编写了一个恒true的表达式,如下图所示:
(3)HTTP请求界面内容
一个标准的 Get请求,访问百度首页,不做过多说明。
如下图所示:
(4)运行结果
因为如果(If)控制器中的表达式为true
,所以可以执行它下面的所有取样器请求。
如下图所示:
若如果(If)控制器中的表达式解析结果为false
,则该控制器下面的请求则不执行。
4、如果控制器中表达式的写法
如果(If)控制器中的表达式有两种方式:
- 一种使用
JavaScript
语言解析条件表达式,表达式为基本的条件表达式写法。 - 另一种是使用
__jexl3
或者__groovy
函数,通过函数表达式,得出我们需要的true
或false
结果。
(1)使用JavaScript
语言解析表达式
即:取消勾选Interpret Condition as Variable Expression?
选项。
最基本的几种写法:
- 数字判断表达式:
${var}==1
。 - 字符串判读表达式:
"${var}"=="字符串"
。
提示:如果${var}
参数化变量取到的值本身就带双引号,则前边不需要加双引号。 - 如果
${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,)}
。
编辑好的界面内容如下:
提示:
- 把生成的
__jexl3
函数表达式,粘贴到如果(If)控制器界面中。- 看到
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}
表达式的意思是:检查上一个请求是否成功。
而整个控制流程的效果是,控制其下的所有取样器:
- 如果前一个请求为成功,则
${JMeterThread.last_sample_ok}
为true,否则为false。 - 下一个请求拿
${JMeterThread.last_sample_ok}
的值来判断是否执行,如果为true,则继续执行,如果为false则不执行,且后边的所有请求都不执行。
如下图所示:
5、拓展
有一个小示例:我准备了20多条测试数据,但是我只想执行指定的几个测试数据。
有什么解决办法吗?
测试数据如下所示:
(1)需求:执行指定的用例5
这时我们可以id
为作为条件判断,来执行用例5。
表达式为:${__jexl3(${id} == 5,)}
(2)需求:执行奇偶数用例
- 执行奇数用例,表达式为:
${__jexl3(${id}%2 == 1,)}
- 执行偶数用例,表达式为:
${__jexl3(${id}%2 == 0,)}
(3)执行多条随机指定用例
- 5条以内用
||
来解决。 - 5条以上,使用在构造数据中打标签的方式来实现。
run
字段,1表示执行,0表示不执行。
表达式为:${__jexl3(${run} == 1,)}
(4)提示
以后工作中的控制器千万不要写成下面这样哦!
『动善时』JMeter基础 — 39、JMeter中如果(If)控制器详解的更多相关文章
- 『动善时』JMeter基础 — 34、JMeter接口关联【XPath提取器】
目录 1.XPath提取器介绍 2.XPath提取器界面详解 3.XPath提取器的使用 (1)测试计划内包含的元件 (2)网易首页请求界面内容 (3)XPath提取器界面内容 (4)百度首页请求界面 ...
- 『动善时』JMeter基础 — 50、使用JMeter测试WebSocket接口
目录 1.什么是WebSocket接口 2.为什么需要WebSocket 3.测试WebService接口前的准备 4.WebSocket Sampler组件界面详解 5.使用JMeter测试WebS ...
- 『动善时』JMeter基础 — 6、使用JMeter发送一个最基础的请求
目录 步骤1:创建一个测试计划 步骤2:创建线程组 步骤3:创建取样器 步骤4:创建监听器 步骤5:完善信息 步骤6:保存测试计划 步骤7:查看结果 总结:JMeter测试计划要素 当我们第一次打开J ...
- 『动善时』JMeter基础 — 20、JMeter配置元件【HTTP Cookie管理器】详细介绍
目录 1.HTTP Cookie管理器介绍 2.HTTP Cookie管理器界面详解 3.JMeter中对Cookie的管理 (1)Cookie的存储 (2)Cookie的管理策略 4.补充:Cook ...
- 『动善时』JMeter基础 — 40、JMeter中ForEach控制器详解
目录 1.什么是逻辑控制器 2.ForEach控制器介绍 3.ForEach控制器的使用 (1)测试计划内包含的元件 (2)获取学院列表请求内容 (3)JSON提取器内容 (4)ForEach控制器内 ...
- 『动善时』JMeter基础 — 44、JMeter对数据库的更新操作
目录 1.执行一条insert语句 2.insert语句实现参数化 3.一次执行多条insert语句 4.使用Beanshell生成加密数据示例 (1)测试计划内包含的元件 (2)JDBC连接配置组件 ...
- 『动善时』JMeter基础 — 7、jmeter.properties文件常用配置
目录 1.默认语言设置 2.配置默认编码格式 3.GUI图标放大比例设置 4.功能区工具栏图标大小设置 5.视图区目录树图标大小设置 6.内容区编辑字体设置 7.添加JMeter元素快捷键设置 8.捕 ...
- 『动善时』JMeter基础 — 12、JMeter取样器详解:sampler
目录 1.取样器介绍 2.JMeter自带的取样器 3."HTTP请求"为例介绍一下取样器 (1)HTTP Request: (2)Web服务器: (3)HTTP请求: (4)同请 ...
- 『动善时』JMeter基础 — 17、JMeter配置元件【HTTP请求默认值】
目录 1.HTTP请求默认值介绍 2.HTTP请求默认值界面 3.HTTP请求默认值的使用 (1)用于演示的项目说明 (2)测试计划内包含的元件 (3)说明HTTP请求默认值用法 4.总结 5.拓展知 ...
- 『动善时』JMeter基础 — 18、JMeter配置元件【计数器】
目录 1.计数器介绍 2.计数器界面详解 3.计数器的使用 (1)测试计划内包含的元件 (2)线程组界面内容 (3)计数器界面内容 (4)HTTP请求界面内容 (5)查看结果 1.计数器介绍 如果需要 ...
随机推荐
- Linux配置yum源(本地源和网络源)
目录 一:配置本地yum源 二:配置网络yum源 更新源可以获取最新的软件信息,以更新您的系统 Redhat7配置源 YUM(Yellow dog Updater Modified): yum是Re ...
- hdu4941 map交换行列
题意: 有一个大矩阵,某些格子上有数字,然后有三种操作, 1 交换行 2 交换列 3 询问当前坐标数值 思路: 直接用map去映射行列,用二维的map去存数字就行了,水题,想不通的 ...
- 栈(Stack) --- C# 自定义和微软官方的区别
最近在学习算法基础,本篇文章作为一个记录,也算是一次实践和总结.(顺便也深入C#运行时学习一下) 目录 1. 栈是什么 2. Stack 自定义实现 3. Stack C#官方实现 4. 区别 5. ...
- 老师不讲的C语言知识
老师不讲的C语言知识 导语: 对于工科生,C语言是一门必修课.标准C(ANSI C)这个看似简单的语言在硬件底层编程.嵌入式开发领域还是稳坐头把交椅.在20年5月份,C语言就凭借其在医疗设备上的广泛应 ...
- window 10 删除文件夹需要管理员权限
如果设了当前的账号有权限删除了, 还是显示删除里管理员则需要改: 按Win+R组合键,输入gpedit.msc点击确定: 在窗口边依次打开计算机配置--Windows设置--安全设置--本地策略--安 ...
- Go语言源码分析之unsafe
Go语言源码分析之unsafe 1.什么是unsafe unsafe 库让 golang 可以像C语言一样操作计算机内存,但这并不是golang推荐使用的,能不用尽量不用,就像它的名字所表达的一样,它 ...
- 玩转直播系列之RTMP协议和源码解析(2)
一.背景 实时消息传输协议(Real-Time Messaging Protocol)是目前直播的主要协议,是Adobe公司为Flash播放器和服务器之间提供音视频数据传输服务而设计的应用层私有协议. ...
- x265编码命令
CQP: #/bin/bash ./x265 --input FourPeople_1280x720_60.yuv --input-res 1280x720 --fps 60 --qp 40 --fr ...
- RabbitMQ高级特性
消息的可靠投递 在使用Rabbitmq的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景.Rabbitmq为我们提供了两种方式用来控制消息的投递可靠性模式 confirm确认模式 return ...
- Element ui结合springboot的简单实战
Eelment UI简单实战 前端开发 1 创建项目,导入element ui(略) 2 大致设计出想要的效果,如下 3 创建包 根据设计的大致模样在项目的components中创建对应的包,方便以后 ...