浅谈逻辑控制器之仅一次控制器
“仅一次控制器”(Once Only Controller) 是一个非常实用的组件,它允许用户控制测试计划中的某些操作仅执行一次,无论其所在的线程组或父级控制器设置了多少次循环。本指南将详细介绍“仅一次控制器”的功能、使用场景及配置方法。
仅一次控制器简介
功能描述:
仅一次控制器确保其下挂的所有采样器(Samplers)和子控制器,在每个线程首次遇到该控制器时执行一次,之后即使线程循环多次,这些组件也不会被再次执行。这对于模拟如用户登录等一次性操作非常有用,确保了测试流程的准确性和效率。
注意点:
● 线程敏感性: 仅一次控制器是基于线程的,即每个线程都会独立执行一次控制器下的内容。如果设置了多个线程,每个线程都会执行一次控制器内的操作。
● 循环与迭代: 不管外部循环控制器如何设置,仅一次控制器下的内容在整个线程生命周期内只执行一次。
● 配置要求: 若要达到预期效果,确保线程组的线程数设置合理,特别是当需要模拟单用户行为时,通常设置为1。
使用场景
- 用户登录: 在需要进行多次操作但只需登录一次的场景中,可以将登录请求置于仅一次控制器下,确保每个虚拟用户只登录一次。
- 初始化设置: 如设置会话、获取token等一次性初始化操作,避免重复执行导致测试结果不准确或资源浪费。
- 数据预加载: 对于需要提前加载的数据,如数据库连接初始化,使用仅一次控制器可以有效控制加载次数。
配置步骤
- 打开JMeter: 启动JMeter并创建一个新的测试计划(Test Plan)。
- 添加线程组(Thread Group): 右键点击测试计划,选择“添加”>“Threads(Users)”>“线程组”,根据需求配置线程数和循环次数。
- 添加仅一次控制器(Once Only Controller): 在线程组内部右键,选择“添加”>“逻辑控制器”>“仅一次控制器”。
- 配置采样器(Sampler)及其它组件: 将需要仅执行一次的操作(如登录请求)拖拽至仅一次控制器下。
- 保存与运行: 配置完成后,保存测试计划并启动以验证设置是否符合预期。
实例说明
我们编写如下脚本:
线程组:循环次数设置为10,其他默认
BeanShell 取样器:编写如下代码
log.info("test");
运行脚本,我们可以看到JMeter如下日志
2024-06-27 11:32:55,458 INFO o.a.j.t.JMeterThread: Thread started: 线程组 1-1
2024-06-27 11:32:55,474 INFO o.a.j.u.BeanShellTestElement: test
2024-06-27 11:32:55,474 INFO o.a.j.t.JMeterThread: Thread is done: 线程组 1-1
可以看到不管是设置多少次,都只执行了一次
最佳实践
● 明确测试目标: 在使用仅一次控制器前,清晰界定哪些操作需为一次性,以避免不必要的测试复杂度。
● 调试与验证: 初次配置后,通过查看JMeter的日志或监听器输出,确保仅一次控制器按预期工作。
● 资源管理: 注意在高并发测试时,即使是仅一次的操作也可能因资源限制而成为瓶颈,适当调整测试策略。
结论:
仅一次控制器是JMeter中不可或缺的逻辑控制组件,它为模拟真实用户行为、优化测试流程提供了灵活性和精确性。正确运用此控制器,可使性能测试更加高效、准确,从而更好地评估系统性能极限与稳定性。