JMeter测试中如何实现指定Threadgroup延迟指定时间启动
解决方案
该需求可通过JMeter原生功能实现,无需额外安装插件,具体配置步骤如下:
第一步:调整测试计划基础配置
- 取消测试计划根节点下的「Run Thread groups consecutively」勾选:该配置会强制所有线程组串行执行(前一个线程组完全运行结束后才会启动下一个),不符合第3个线程组仍在运行时启动第4个的要求。
第二步:实现前3个线程组的串行执行
取消全局串行配置后,需单独配置前3个线程组的启动依赖:
- 在第1个线程组的末尾添加
JSR223 采样器,语言选择Groovy,写入以下代码:
// 标记第1个线程组已执行完成,props为JMeter全局属性,跨线程组生效 props.put("tg1_finished", "true")
- 在第2个线程组的最开头添加
循环控制器,循环条件设置为:${__jexl3("${__P(tg1_finished, false)}" != "true",)} - 在上述循环控制器内部添加
测试活动(Test Action)采样器,设置暂停时长为1秒,作用为轮询等待第1个线程组执行完成。 - 按照相同逻辑配置第2、第3个线程组的串行依赖:在第2个线程组末尾添加JSR223采样器标记完成,第3个线程组开头加相同的轮询等待逻辑。
第三步:配置第4个线程组30分钟延迟启动逻辑
- 在第3个线程组的最开头添加
JSR223 采样器,写入以下代码记录第3个线程组的启动时间:
props.put("tg3_start_timestamp", System.currentTimeMillis().toString())
- 在第4个线程组的最开头添加
循环控制器,循环条件设置为:${__jexl3(System.currentTimeMillis() - ${__P(tg3_start_timestamp, 0)} < 1800000,)}
注:1800000为30分钟对应的毫秒数,可按需调整 - 在上述循环控制器内部添加
测试活动(Test Action)采样器,设置暂停时长为10秒(可按需调整轮询间隔,避免占用过多资源)。
配置完成后,前3个线程组会按顺序串行启动,第3个线程组启动时会记录全局时间戳,第4个线程组会轮询判断距离第3个启动的时间是否达到30分钟,达到后自动执行后续业务逻辑,此时第3个线程组仍可处于运行状态。
简化方案(仅适用于前3个线程组运行时长固定的场景)
如果可以明确预估前2个线程组的总运行时长为T秒,可直接跳过第二步的串行配置,按以下方式设置:
- 保持「Run Thread groups consecutively」勾选
- 确认第3个线程组的运行时长大于30分钟,保证30分钟后仍未结束
- 给第4个线程组设置「Startup delay」参数为
T + 1800秒,该参数意为测试计划启动后延迟对应时长再启动当前线程组。
内容的提问来源于stack exchange,提问作者JessieB
相关产品推荐
相关产品推荐

