浅谈逻辑控制器之随机控制器
随机控制器(Random Controller)是众多逻辑控制器中的一种,它为测试脚本引入了随机性,提高了模拟真实用户行为的灵活性。
随机控制器的功能
随机控制器的作用在于从其直接子元素(通常是采样器)中随机选择一个进行执行。这意味着每次迭代时,选定的采样器都是不确定的,这有助于模拟那些用户操作路径不固定或存在多种可能路径的场景。与顺序执行相比,随机控制器可以更真实地反映具有随机访问模式的应用场景。
使用场景
● 模拟用户行为多样性:当需要模拟用户的随机浏览习惯时,如电商网站中用户可能随机访问商品页面。
● 压力测试不同功能:确保系统在面对不同功能请求的随机组合时仍能稳定运行。
● 增加测试覆盖范围:通过随机选择执行路径,可以在相同数量的测试运行中覆盖更多场景。
配置与使用
- 添加随机控制器:
○ 在JMeter的测试计划中,右键点击需要添加随机控制器的父级元素(如线程组),选择“添加” -> “逻辑控制器” -> “随机控制器”。 - 配置随机控制器:
○ 名称:给随机控制器一个描述性的名称,便于识别其用途。
○ 注释:可选地添加注释,说明该控制器在测试计划中的具体作用或目的。 - 添加子元素:
○ 在随机控制器下,添加想要随机执行的采样器或子控制器。每个子元素代表一个可能的选择。 - 执行逻辑:
○ 运行测试时,JMeter会在每个迭代中从随机控制器的子元素中随机挑选一个执行。如果需要执行所有子元素,可以考虑结合使用循环控制器或仅执行一次的控制器来达到期望的测试结构。
实例说明
我们编写如下脚本
线程组:循环次数设置为5,其他保持默认
循环控制器:循环次数设置为3
BeanShell 取样器1:编写如下代码
log.info("test1");
BeanShell 取样器2:编写如下代码
log.info("test2");
BeanShell 取样器3:编写如下代码
log.info("test3");
情况1:忽略子控制器设置:勾选
运行脚本,查看JMeter日志,打印如下
2024-06-27 12:00:55,629 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-1
2024-06-27 12:00:55,629 INFO o.a.j.e.StandardJMeterEngine: All thread groups have been started
2024-06-27 12:00:55,629 INFO o.a.j.c.LoopController: iterationStart called on 循环控制器 with source org.apache.jmeter.control.RandomController@6932fb38 and iteration 0
2024-06-27 12:00:55,629 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-27 12:00:55,629 INFO o.a.j.u.BeanShellTestElement: test3
2024-06-27 12:00:55,645 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-27 12:00:55,645 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-27 12:00:55,645 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-27 12:00:55,645 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-1
随机到BeanShell 取样器1,虽然设置了3次循环,但是执行了一次,子控制器(这里是循环控制器)失效
情况2:忽略子控制器设置:不勾选
运行脚本,查看JMeter日志,打印如下:
2024-06-27 12:02:19,586 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-1
2024-06-27 12:02:19,586 INFO o.a.j.c.LoopController: iterationStart called on 循环控制器 with source org.apache.jmeter.control.RandomController@1a0fafa9 and iteration 0
2024-06-27 12:02:19,586 INFO o.a.j.u.BeanShellTestElement: test2
2024-06-27 12:02:19,586 INFO o.a.j.u.BeanShellTestElement: test3
2024-06-27 12:02:19,602 INFO o.a.j.u.BeanShellTestElement: test3
2024-06-27 12:02:19,602 INFO o.a.j.u.BeanShellTestElement: test3
2024-06-27 12:02:19,602 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-27 12:02:19,602 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-27 12:02:19,602 INFO o.a.j.u.BeanShellTestElement: test1
2024-06-27 12:02:19,602 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-1
随机到BeanShell 取样器1,设置了3次循环,但是执行了3次,子控制器(这里是循环控制器)有效
注意事项
● 忽略子控制器设置:某些版本的JMeter可能提供选项来决定是否将子控制器视为单个请求,这会影响随机选择的单位是单个采样器还是整个子控制器。
● 测试设计:虽然随机性增加了测试的现实性,但也可能导致测试结果的可重复性降低。因此,在需要高度一致性和可比性的测试场景中,应谨慎使用。
总结
随机控制器是增强JMeter测试计划多样性和真实度的有效工具。通过随机选择执行路径,测试者能够更好地模拟复杂和不可预测的用户交互模式,进而全面评估系统的性能和稳定性。正确应用随机控制器,结合其他逻辑控制器和配置,可以显著提升测试的全面性和有效性。