JMeter中搭配Run once only与If控制器时线程组请求顺序异常
问题根因定位
你当前遇到的执行顺序错乱,核心是两个配置特性叠加导致的:
- 你当前Test Plan未勾选Consecutive(并行执行模式),JMeter对并行模式下的所有并发线程、同层线程组的启动和执行没有全局优先级约束,线程调度是随机抢占执行流的,没有天然的先后顺序保证。
- 你之前实现的“取Token全局仅执行一次”的逻辑,没有配套的跨线程阻塞等待机制,哪怕加了只跑一次的判断,其他9个线程根本不会等取Token的请求执行完成,直接带着空/无效的Token去发Create请求,最终就出现你观察到的“9个Create先执行、再跑单次Token请求、最后1个Create收尾”的穿插结果。
可落地的实现方案(完全匹配你要的执行顺序)
要实现“先全局跑一次取Token,再启动10个并发全量跑Create请求”的效果,不需要在现有配置上硬加判断,按下面的结构调整即可:
- 前置准备阶段:单独新增一个
setUp Thread Group,把获取Access Token的请求放在这个线程组里。这个线程组的执行特性不受Test Plan的并行/串行配置影响,会在所有普通测试线程启动之前全部执行完成,天生就满足“前置任务先跑完”的顺序要求,不需要额外写逻辑限制它只跑一次——因为setUp线程组本身就是全局前置角色,天然只会跑一次。请求执行完成后,用__setProperty函数把拿到的Token值存为JMeter全局属性,保证所有普通线程都能读取到。 - 正式压测阶段:把配置了10个并发线程、loop count=1的Create请求逻辑放在普通
Thread Group中,删除之前挂在这个线程组里所有和取Token相关的逻辑,改成从刚才setUp线程组存的全局属性中读取Token值,放到请求头里即可。
常见误区提醒
很多人会用Once Only Controller实现取Token一次,这个组件的实际作用是单个线程维度内只执行一次内部的请求,不是跨所有线程的全局单次执行,而且完全没有顺序保障——并行启动的10个线程每个都会进一次这个控制器,根本保证不了谁先跑、谁后跑,这也是导致你之前执行顺序错乱的高频原因。
如果你不想拆分成独立的setUp线程组,非要把取Token逻辑放在普通线程组内实现要求,必须配套加等待逻辑:在取Token的请求分支处加While Controller,判断条件为“全局属性里的Token值为空”时就一直循环等待,直到第一个跑到取Token分支的线程完成Token请求、把值写入全局属性后,所有其他等待的线程才会继续往下走Create请求流程。
内容的提问来源于stack exchange,提问作者Shay Cohen
相关产品推荐
相关产品推荐

