第六篇:《JMeter逻辑控制器:循环、条件和交替执行》

在实际业务测试中,并非只是简单的顺序执行。有时需要重复执行某些操作(循环),有时需要根据条件决定执行哪个分支(条件),有时需要模拟多个用户的交替行为(交替)。JMeter 提供了丰富的逻辑控制器来实现这些流程控制。本文将介绍最常用的循环控制器、If 控制器、ForEach 控制器和交替控制器,并通过实战案例让你掌握它们的使用。

一、逻辑控制器概述

逻辑控制器可以改变其子元件的执行顺序和执行次数。类似于编程语言中的 for、if、switch 等控制语句。

常用逻辑控制器:

二、循环控制器(Loop Controller)

2.1 使用场景

需要重复执行一组请求 N 次,例如批量创建 10 条数据。

2.2 配置

右键某线程组(或上一级控制器) → Add → Logic Controller → Loop Controller

在"Loop Count"中填写循环次数。

注意:循环控制器与线程组的循环不同:

线程组循环次数:每个线程执行整个测试计划 N 次

循环控制器:仅循环控制器内部的请求 N 次

2.3 实战:批量创建用户

假设有一个创建用户的 POST 接口,需要创建 5 个不同用户。

可以将创建请求放在循环控制器内,循环次数设为 5,并在请求参数中使用计数器变量 ${__counter(,)} 来区分用户名。

json

{

"username": "userKaTeX parse error: Expected group after '_' at position 2: {_̲_counter(true,)...{__counter(true,)}@test.com"

}

三、If 控制器(If Controller)

3.1 使用场景

根据某个变量或条件决定是否执行其内部的请求。例如:登录成功后执行后续操作,否则跳过。

3.2 配置

右键 → Add → Logic Controller → If Controller

条件表达式有两种常用模式:

简单地检查变量是否等于某个值:${code} == 0

使用 JMeter 的 __jexl3 或 __groovy 函数:KaTeX parse error: Expected group after '_' at position 2: {_̲_jexl3("{code}" == "0",)}

建议使用 __jexl3 或 __groovy,因为更稳定且支持复杂逻辑。

3.3 语法示例

条件 含义
KaTeX parse error: Expected group after '_' at position 2: {̲_jexl3("{code}" == "0",)} 变量 code 等于字符串 "0"
KaTeX parse error: Expected group after '
' at position 2: {̲_jexl3({count} > 0,)} 变量 count 大于 0
KaTeX parse error: Expected group after '
' at position 2: {̲_jexl3("{token}" != "null",)} token 不为 null
KaTeX parse error: Expected group after '
' at position 2: {_̲_jexl3({__Random(1,100,)} > 50,)} 随机数大于 50

注意:If 控制器内部的请求只有在条件为 true 时才会执行。条件表达式要写正确,否则永远为 false。

3.4 实战:条件性执行清理操作

场景:测试前如果数据库中存在测试数据,则先执行清理接口。可以通过一个前置请求查询是否存在数据,提取数量到变量 count,然后在 If 控制器中判断 count > 0 时执行删除接口。

四、ForEach 控制器(ForEach Controller

4.1 使用场景

当你有一组类似的变量时(例如从 JSON 提取器提取了多个值),可以使用 ForEach 控制器遍历它们。

4.2 配置项

4.3 典型用法

假设通过 JSON 提取器提取了所有订单 ID,配置如下:

变量名:orderIds,JSON Path:$.data.orders[*].id,Match No. 设置为 -1(所有匹配)

该提取器会生成 orderIds_1、orderIds_2...... 和 orderIds_matchNr(总个数)

然后在 ForEach 控制器:

Input variable prefix:orderIds

Output variable name:orderId

循环内部,使用 ${orderId} 访问每个 ID,进行删除或其他操作。

4.4 注意事项

需要先有生成 xxx_n 变量的提取器或用户自定义变量。

如果变量索引不连续,ForEach 会停止在第一个缺失处。

五、交替控制器(Interleave Controller)

5.1 使用场景

模拟多个用户交替执行不同操作,例如每个虚拟用户每次循环执行一个不同的请求(如浏览商品、加入购物车、结算轮流执行)。

5.2 配置

右键 → Add → Logic Controller → Interleave Controller

可选"忽略子控制器块"等选项。默认情况下,每次循环会按顺序选择下一个子请求执行(线程内独立)。

5.3 示例

交替控制器下包含三个 HTTP 请求:搜索商品、查看详情、加入购物车。

当线程组循环 3 次时,第一次执行搜索,第二次执行查看详情,第三次执行加入购物车,第四次又从搜索开始。

与随机控制器的区别:交替控制器是顺序轮换,随机控制器是完全随机。

六、其他实用控制器简介

七、实战:综合使用多种逻辑控制器

场景:模拟一个电商用户的典型流程:登录 → 随机浏览(搜索或查看详情)→ 一旦找到商品就加入购物车(循环直到成功)→ 结算。

7.1 测试计划概要

仅一次控制器:登录,提取 token

随机控制器:随机选择"搜索商品"或"查看详情(从列表选一个)"

循环控制器:尝试加入购物车,若失败则继续随机浏览(使用 If 控制器判断是否成功)

单次操作:结算

这个组合展示了逻辑控制器的嵌套。

7.2 注意事项

逻辑控制器可以任意嵌套,但嵌套过深会降低可读性。

每个控制器的作用域要清晰,特别是变量作用域。

八、常见错误与解决

九、总结

本文核心:

循环控制器:重复执行

If 控制器:条件分支

ForEach 控制器:遍历数组变量

交替控制器:轮流执行子请求

多种控制器组合可实现复杂业务流

相关推荐
humcomm1 小时前
Java 新特性2026年5月速览
java·开发语言
luck_bor1 小时前
集合进阶(Collections Set List)
java
敲敲千反田1 小时前
Spring AI
java·人工智能·spring
拽着尾巴的鱼儿1 小时前
spring 动态代理
java·后端·spring
gf13211112 小时前
python_【更新已发送的消息卡片】
java·前端·python
WL_Aurora2 小时前
Java字符输入全攻略
java·开发语言
Hello.Reader2 小时前
算法基础(十三)——随机算法为什么有时主动引入随机性
java·数据库·算法
likerhood2 小时前
ConcurrentHashMap底层数据结构和面试常见问题
java·数据结构·面试·hashmap
云烟成雨TD2 小时前
Spring AI Alibaba 1.x 系列【52】Interrupts 中断机制:案例演示
java·人工智能·spring