JMeter如何通过JSR223/Beanshell查看修改线程组线程属性值
JMeter Thread Group 运行时动态配置调整方案
可以通过JSR223元件实现测试运行过程中动态读取、修改Thread Properties板块的两个目标配置项,Beanshell也可实现相同逻辑,但脚本执行效率远低于Groovy,高并发压测场景下不推荐使用。
注意:所有配置修改仅对操作执行完成后新启动的线程循环、新调度的线程生效,已经处于运行状态的线程不会被中断,会按照启动时读取的旧配置跑完当前执行逻辑。
前置操作:获取Thread Group实例
所有配置读写都需要先拿到当前线程所属的Thread Group对象,脚本开头先执行以下代码获取实例:
import org.apache.jmeter.threads.ThreadGroup // ctx是JMeter内置的JMeterContext变量,可直接调用 def targetThreadGroup = ctx.getThreadGroup()
如果需要修改其他线程组的配置,遍历测试计划的线程组列表匹配到目标实例即可。
1. Loop Count(含Infinite复选框)配置操作
该配置项的Infinite勾选状态和循环次数值共用同一个存储字段:字段值为-1时代表勾选Infinite(无限循环),字段值为正整数时代表取消Infinite勾选,循环次数为对应数值。
读取当前配置
def loopValue = targetThreadGroup.getNumLoops() // 打印日志方便调试 log.info("当前循环配置值:{},是否开启无限循环:{}", loopValue, loopValue == -1)
修改配置
// 场景1:勾选Infinite,设置为无限循环 targetThreadGroup.setNumLoops(-1) // 场景2:取消Infinite勾选,设置固定循环15次 targetThreadGroup.setNumLoops(15)
2. Specify Thread lifetime复选框配置操作
该配置项对应线程调度器开关,勾选后JMeter会读取配套的持续运行时长、启动延迟参数控制线程生命周期,取消勾选则忽略这两个参数。
读取当前配置
def isEnableLifetimeLimit = targetThreadGroup.getScheduler() log.info("是否开启自定义线程生命周期:{}", isEnableLifetimeLimit) // 开启状态下可读取配套参数 if (isEnableLifetimeLimit) { def runDuration = targetThreadGroup.getDuration() // 持续运行时长,单位:秒 def startupDelay = targetThreadGroup.getDelay() // 启动延迟,单位:秒 log.info("当前配置持续运行时长:{}秒,启动延迟:{}秒", runDuration, startupDelay) }
修改配置
// 场景1:勾选Specify Thread lifetime,设置持续运行600秒,启动延迟0秒 targetThreadGroup.setScheduler(true) targetThreadGroup.setDuration(600) targetThreadGroup.setDelay(0) // 场景2:取消勾选Specify Thread lifetime targetThreadGroup.setScheduler(false)
常见问题说明
- 配置修改后不需要额外执行保存操作,JMeter线程调度逻辑会在下次调度任务时自动读取最新配置值。
- 如果修改后配置未生效,优先检查脚本挂载位置:如果脚本挂在当前线程组循环已经执行完毕、线程即将销毁的节点,新配置不会触发执行。
- 不建议在高并发线程内重复执行配置修改逻辑,最好用单独的setUp线程组或者仅触发一次的逻辑控制器承载修改脚本,避免不必要的性能开销。
内容的提问来源于stack exchange,提问作者Gribbet4Eva
相关产品推荐
相关产品推荐

