You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JMeter的JSR223预处理器中覆盖用户自定义变量?

问题描述

已设置用户自定义变量,并在JSR223预处理器中编写了如下Groovy脚本:

def params = []
def attributes = [:]
Random random = new Random()

def int variantToStartFrom = Integer.parseInt(vars.get("START_FROM"))
def int increment = variantToStartFrom + Integer.parseInt(vars.get("INCREMENT"))

for (int i = 3; i <= 3; i++) {
  for (int j = variantToStartFrom; j <= increment; j++) {
    def attr = [:]
    attr.put('location_id', i)
    attr.put('variant_id', j)
    attr.put('quantity', random.nextInt(100000))
    params.add(attr)
  }
}

attributes.put('items', params)

def json = new groovy.json.JsonBuilder(attributes)
vars.put("START_FROM", increment.toString())

sampler.addNonEncodedArgument("", json.toPrettyString(), "")
sampler.setPostBodyRaw(true)

尝试运行线程组两次,期望通过脚本覆盖User Defined Variables中的START_FROM变量,使线程组下次运行时使用START_FROM + 1的值。请问vars.put("START_FROM", increment.toString())是否能实现预期效果?或者是否有其他方法可从脚本中覆盖用户自定义变量?

解答

vars.put("START_FROM", increment.toString())不能实现跨线程组运行的变量持久化,原因如下:

  • User Defined Variables组件的变量是在测试计划初始化阶段加载的,后续脚本中通过vars修改的只是当前线程上下文内的变量副本,不会改变User Defined Variables里的原始值。
  • 当线程组第二次运行时,会重新从User Defined Variables读取初始值,而非使用上一次线程运行中修改后的变量值。

如果需要实现跨线程/跨运行的变量值传递,可采用以下方法:

  • 使用全局属性(props)替代线程变量(vars):props是JVM层面的全局共享对象,修改后的值会在整个测试运行周期内保留,适合跨线程组、跨运行场景。修改脚本相关部分:
    // 读取属性(首次运行从User Defined Variables取初始值)
    def int variantToStartFrom = Integer.parseInt(props.get("START_FROM") ?: vars.get("START_FROM"))
    // 更新全局属性
    props.put("START_FROM", increment.toString())
    
  • 写入外部文件持久化:通过Groovy脚本将START_FROM最新值写入本地文件,下次运行时从文件读取:
    // 读取文件(首次运行若文件不存在则用User Defined Variables的值)
    def startFile = new File("start_from.txt")
    def int variantToStartFrom = startFile.exists() ? startFile.text.toInteger() : Integer.parseInt(vars.get("START_FROM"))
    // 写入文件保存最新值
    startFile.write(increment.toString())
    
  • 使用JMeter内置属性函数:通过props操作全局属性,脚本中可直接调用:
    // 设置全局属性
    props.setProperty("START_FROM", increment.toString())
    // 读取全局属性(默认值取User Defined Variables的初始值)
    def int variantToStartFrom = Integer.parseInt(props.getProperty("START_FROM", vars.get("START_FROM")))
    

注意:如果是同一线程组内的循环运行,vars.put可以实现循环间的变量值传递;但如果是线程组的独立运行(比如测试计划中两个线程组依次执行,或同一线程组重启运行),则必须使用全局属性或外部存储的方式。

内容的提问来源于stack exchange,提问作者Egor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 14:43:17