如何在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
相关产品推荐
相关产品推荐

