浅谈逻辑控制器之交替控制器

浅谈逻辑控制器之交替控制器

本文档将详细介绍其中一种重要逻辑控制器——交替控制器 (Interleave Controller),并提供其使用方法和应用场景。

交替控制器概述

交替控制器 (Interleave Controller) 是 JMeter 中的一个高级逻辑控制器,它使你能够按照交替或交错的方式执行其下的子采样器。这意味着,在每个迭代中,控制器会轮流选择不同的子采样器来执行,而不是连续执行所有子采样器或随机选择。这对于需要模拟特定交互模式,比如在会话管理中交替发送不同类型请求的场景特别有用。

使用步骤

  1. 添加交替控制器
    ○ 首先,打开或创建一个新的 JMeter 测试计划。
    ○ 在测试计划中,右击需要添加交替控制器的位置(通常在某个线程组内),选择“添加” -> “逻辑控制器” -> “交替控制器”。

  2. 配置交替控制器
    ○ 默认情况下,交替控制器不需要额外配置即可开始工作。但是,你可以通过勾选特定选项来调整其行为:

    ■ 忽略子控制模块(Ignore Sub-controller Blocks): 当勾选时,控制器下的所有子控制器和取样器将按顺序执行,而非交替执行。
    ■ Interleave Across Threads: 如果你的测试计划包含多个线程,勾选此选项将使得交替执行不仅限于单个线程内,而是跨线程交替执行。这可以用于更复杂的并发测试场景。

  3. 添加子采样器
    ○ 在交替控制器下,右击并选择“添加” -> 你需要的采样器类型(如 HTTP 请求)。根据需要添加多个子采样器,这些采样器将按照交替的顺序执行。

  4. 运行测试
    ○ 配置好线程组和其他必要组件后,启动测试。交替控制器将按照设定的规则执行其下的子采样器。

实例说明

情况1:常规用法

我们编写如下脚本
在这里插入图片描述
线程组:运行次数设置为4,其他保持默认
交替控制器:保持默认
BeanShell 取样器1:编写如下代码:

log.info("test1");

BeanShell 取样器2:编写如下代码:

log.info("test2");

BeanShell 取样器3:编写如下代码:

log.info("test3");

运行脚本,我们可以通过Jeter日志看到如下结果

2024-06-27 09:31:31,561 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-1
2024-06-27 09:31:31,576 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-27 09:31:31,576 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-27 09:31:31,576 INFO o.a.j.u.BeanShellTestElement: test3
2024-06-27 09:31:31,576 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-27 09:31:31,576 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-1

情况2:忽略子控制模块(Ignore Sub-controller Blocks)配置

我们编写如下脚本
在这里插入图片描述
线程组:运行次数设置为4,其他保持默认
循环控制器:循环次数设置为3
BeanShell 取样器1:编写如下代码:

log.info("test1");

BeanShell 取样器2:编写如下代码:

log.info("test2");

1.不勾选Ignore Sub-controller Blocks,运行脚本,我们可以通过Jeter日志看到如下结果

2024-06-27 09:45:27,867 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-1
2024-06-27 09:45:27,867 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-27 09:45:27,867 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-27 09:45:27,867 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-27 09:45:27,867 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-27 09:45:27,867 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-27 09:45:27,867 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-27 09:45:27,883 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-27 09:45:27,883 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-27 09:45:27,883 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-1

2.勾选Ignore Sub-controller Blocks,运行脚本,我们可以通过Jeter日志看到如下结果

2024-06-27 09:46:37,954 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-1
2024-06-27 09:46:37,954 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-27 09:46:37,954 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-27 09:46:37,954 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-27 09:46:37,954 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-27 09:46:37,969 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-1

情况3:Interleave Across Threads配置

我们编写如下脚本
在这里插入图片描述
线程组中线程数设置为3,运行次数设置为4,其他保持默认,其他内容跟情况1中一致

  1. 不勾选Interleave Across Threads,运行脚本,我们可以通过Jeter日志看到如下结果

2024-06-27 11:13:11,905 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-1
2024-06-27 11:13:11,905 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-27 11:13:11,905 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-27 11:13:11,905 INFO o.a.j.u.BeanShellTestElement: test3
2024-06-27 11:13:11,921 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-27 11:13:11,921 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-1
2024-06-27 11:13:11,921 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-1
2024-06-27 11:13:11,966 INFO o.a.j.t.ThreadGroup: Started thread group number 1
2024-06-27 11:13:11,967 INFO o.a.j.e.StandardJMeterEngine: All thread groups have been started
2024-06-27 11:13:12,260 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-2
2024-06-27 11:13:12,261 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-27 11:13:12,263 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-27 11:13:12,264 INFO o.a.j.u.BeanShellTestElement: test3
2024-06-27 11:13:12,266 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-27 11:13:12,267 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-2
2024-06-27 11:13:12,267 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-2
2024-06-27 11:13:12,586 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-3
2024-06-27 11:13:12,586 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-27 11:13:12,602 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-27 11:13:12,602 INFO o.a.j.u.BeanShellTestElement: test3
2024-06-27 11:13:12,602 INFO o.a.j.u.BeanShellTestElement: test1

可以看到交替的内容在各自线程组中进行,打印内容从test1>test2>test3>test1
2. 勾选Interleave Across Threads,运行脚本,我们可以通过Jeter日志看到如下结果

2024-06-27 11:14:33,597 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-1
2024-06-27 11:14:33,597 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-27 11:14:33,597 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-27 11:14:33,612 INFO o.a.j.u.BeanShellTestElement: test3
2024-06-27 11:14:33,612 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-27 11:14:33,612 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-1
2024-06-27 11:14:33,612 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-1
2024-06-27 11:14:33,659 INFO o.a.j.t.ThreadGroup: Started thread group number 1
2024-06-27 11:14:33,660 INFO o.a.j.e.StandardJMeterEngine: All thread groups have been started
2024-06-27 11:14:33,956 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-2
2024-06-27 11:14:33,956 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-27 11:14:33,956 INFO o.a.j.u.BeanShellTestElement: test3
2024-06-27 11:14:33,956 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-27 11:14:33,956 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-27 11:14:33,956 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-2
2024-06-27 11:14:33,956 INFO o.a.j.t.JMeterThread: Thread finished: 线程组 1-2
2024-06-27 11:14:34,284 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-3
2024-06-27 11:14:34,284 INFO o.a.j.u.BeanShellTestElement: test3
2024-06-27 11:14:34,284 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-27 11:14:34,284 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-27 11:14:34,284 INFO o.a.j.u.BeanShellTestElement: test3
2024-06-27 11:14:34,284 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-3

可以看到交替的内容在线程组间中进行,打印内容当线程组1-1中循环到test1以后,线程组1-2是从test2开始,而线程组3在由于线程组2是test2结束所以开始以test3开始

应用场景

● 会话管理模拟:例如,在模拟用户登录后交替访问不同页面或功能,以更真实地反映用户的浏览行为。
● API 负载均衡测试:在需要对多个 API 端点进行负载测试时,交替执行请求可以模拟不同服务的并发使用情况。
● 并发用户模拟:当测试应用需要处理来自不同用户的不同类型请求时,交替控制器可以帮助模拟这种交错的请求模式。

注意事项

● 交替控制器的交替行为基于迭代次数,因此确保线程组设置有足够多的迭代以观察到交替效果。
● 在多线程测试中使用“Interleave Across Threads”选项时,注意这可能影响测试结果的可预测性,需谨慎使用。

总结

交替控制器为 JMeter 用户提供了灵活的测试逻辑设计能力,特别是在需要模拟复杂用户行为或系统交互的场景下。通过合理配置,它可以有效地帮助测试人员构建更加贴近现实的应用负载测试方案。

  • 36
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔波儿灞爱霸波尔奔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值