JMeter Thread Group能否运行时动态切换迭代/时长运行模式?
单Thread Group动态切换运行模式实现方案
完全可以实现,无需创建两个独立Thread Group,也不需要额外加逻辑控制器做分支判断,核心是利用JMeter Thread Group原生的配置优先级规则,配合你已有的Jenkins参数传值逻辑就能搞定,具体配置方法如下:
- 先明确JMeter Thread Group的原生运行判定逻辑:只要勾选了
Scheduler(调度器),且Duration(持续运行时长,单位秒)字段取值>0,线程组就会自动进入时长运行模式,循环执行采样直到达到指定时长,此时Loop Count(循环次数)的配置不会生效;如果Duration字段取值为0,调度器的时长控制逻辑不会触发,线程组会完全按照Loop Count的配置,跑够指定迭代次数后自动停止。 - 按以下规则配置Thread Group参数即可适配双模式:
- 固定勾选Thread Group配置页的
Scheduler选项,不要取消 Number of Threads(线程数)、Ramp-Up Period(线程启动时间)、Startup Delay(启动延迟)字段,按你原有逻辑绑定对应的Jenkins传参属性即可,其中Startup Delay默认值设为0,不影响两种模式运行Loop Count字段绑定迭代次数对应的JMeter属性,比如你通过-Jtest.iterations=xxx从Jenkins传值,就填${__P(test.iterations,1)}:迭代模式下给这个参数传用户指定的≥1的迭代数;时长模式下这个参数随便传≥1的数即可,会被时长配置覆盖,不影响运行结果Duration字段绑定运行时长对应的JMeter属性,比如通过-Jtest.duration=xxx传值,就填${__P(test.duration,0)}:迭代模式下Jenkins固定给这个参数传0;时长模式下给这个参数传用户指定的≥1的运行秒数
- 固定勾选Thread Group配置页的
- 可选参数校验(避免用户传参错误导致运行不符合预期):在线程组最开头加一个仅执行一次的JSR223 Sampler,写Groovy脚本做前置校验:
// 读取Jenkins传入的运行模式与参数 String runMode = props.get("test.run.mode", "iteration") int iterations = props.get("test.iterations", "0") as int int duration = props.get("test.duration", "0") as int // 迭代模式参数校验 if (runMode == "iteration") { if (iterations < 1) { log.error("参数错误:迭代模式下迭代次数不能小于1") SampleResult.setSuccessful(false) SampleResult.setResponseMessage("参数非法:迭代模式需指定≥1的迭代次数") ctx.getEngine().askThreadsToStop() } props.put("test.duration", "0") // 兜底强制设时长为0,避免传参冲突 } // 时长模式参数校验 if (runMode == "duration") { if (duration < 1) { log.error("参数错误:时长模式下运行时长不能小于1秒") SampleResult.setSuccessful(false) SampleResult.setResponseMessage("参数非法:时长模式需指定≥1秒的运行时长") ctx.getEngine().askThreadsToStop() } props.put("test.iterations", "1") // 兜底设迭代数为1,避免传0导致线程组不启动 }
注意不要给
Loop Count字段传0,JMeter中Loop Count为0时线程组不会执行任何采样逻辑。上述配置完全基于JMeter原生能力,没有用到任何第三方插件,升级版本也不会有兼容性问题。
- 本地调试可以不用依赖Jenkins,直接在JMeter启动命令后加
-J参数传值即可验证两种模式:- 测试迭代模式:
jmeter -Jtest.run.mode=iteration -Jtest.iterations=100 -Jtest.duration=0 -n -t test.jmx -l result.jtl - 测试时长模式:
jmeter -Jtest.run.mode=duration -Jtest.duration=300 -Jtest.iterations=1 -n -t test.jmx -l result.jtl
- 测试迭代模式:
内容的提问来源于stack exchange,提问作者Gribbet4Eva
相关产品推荐
相关产品推荐

