JMeter技术问题:多操作Thread Group内迭代执行顺序控制
JMeter线程组执行顺序调整方案
场景与问题
线程组TCByEmployee设置为3次迭代,需求是:
- “Loop Controller-TCbyEmployee-员工登录”和“If Controller-TCbyEmployee-DH登录”,必须等“If Controller-TCbyEmployee-PA登录”完成第1次迭代后,再启动下一轮迭代。
当前异常表现:前两个控制器会先跑完3次完整迭代,“If Controller-TCbyEmployee-PA登录”才开始执行。
解决方案
方案1:调整控制器层级(推荐)
把“If Controller-TCbyEmployee-PA登录”、“Loop Controller-TCbyEmployee-员工登录”、“If Controller-TCbyEmployee-DH登录”这三个控制器,全部放到一个外层Loop Controller中,将这个外层Loop的迭代次数设置为3。
这样JMeter会按以下顺序执行:
- 外层Loop第1次迭代:先执行PA登录,再执行员工登录、DH登录
- 外层Loop第2次迭代:重复上述顺序
- 外层Loop第3次迭代:重复上述顺序
完全符合“每轮迭代先完成PA登录,再执行另外两个控制器”的需求。
方案2:用变量控制执行时机
如果不想调整层级,可以通过JMeter内置变量和属性来控制执行顺序:
- 给“If Controller-TCbyEmployee-PA登录”设置条件,让它优先完成第1次迭代:
条件表达式:${__jexl3(${__jm__TCByEmployee__idx} == 0,)}
(${__jm__TCByEmployee__idx}是线程组的迭代索引,从0开始计数) - 在PA登录的最后添加一个User Defined Variables或BeanShell Sampler,设置全局属性标记:
比如用BeanShell执行:props.put("PA_FIRST_DONE", "true"); - 给“Loop Controller-TCbyEmployee-员工登录”和“If Controller-TCbyEmployee-DH登录”添加前置判断条件:
条件表达式:${__jexl3(${__property(PA_FIRST_DONE)},)}
这样只有PA登录完成第1次迭代后,这两个控制器才会开始执行;后续迭代可以通过调整变量逻辑,保证每轮都依赖上一轮PA的执行。
问题原因说明
JMeter默认的执行逻辑是:同一层级的元素,会按从上到下的顺序,先把当前元素的所有迭代执行完毕,再处理下一个同级元素。你当前的结构中,PA登录和另外两个控制器是同级,所以线程组会先跑前两个控制器的3次迭代,最后才执行PA登录的迭代。
内容的提问来源于stack exchange,提问作者Chinni
相关产品推荐
相关产品推荐

