JMeter线程组间共享正则表达式数组变量是否可行?如何实现?
当然可行!我之前在做接口测试的时候也碰到过一模一样的需求,给你分享两个实操性强的解决方案:
方法1:逐个存入全局属性(props)
因为props是JMeter的全局属性容器,只能存字符串类型,所以我们可以把正则提取到的数组元素逐个存入,同时记录数组长度,这样Thread Group 2就能按索引调用了。
具体步骤:
- 在Thread Group #1里,正则提取器之后添加一个JSR223 PostProcessor
- 把下面的Groovy代码粘贴进去(记得把
myVar替换成你的正则提取器变量名):
// 获取正则提取到的数组总长度 def matchCount = vars.get("myVar_matchNr") as int // 把长度存入全局属性 props.put("myVar_matchNr", matchCount.toString()) // 遍历每个数组元素,逐个存入全局属性 for (int i = 1; i <= matchCount; i++) { def elementValue = vars.get("myVar_" + i) props.put("myVar_" + i, elementValue) }
- 在Thread Group #2里,你可以这样使用:
- 先用
${__P(myVar_matchNr, 0)}获取数组总长度 - 配合循环控制器或计数器,用
__V函数按索引取值,比如${__V(myVar_${counter})}(${counter}是你的计数器变量名)
- 先用
方法2:序列化数组为字符串存入全局属性
如果数组元素比较多,逐个存太麻烦,你可以把整个数组序列化成JSON字符串,存到props里,到Thread Group #2再解析回来还原成数组。
步骤如下:
- 在Thread Group #1的正则提取器后添加JSR223 PostProcessor,代码如下:
def matchCount = vars.get("myVar_matchNr") as int def arrayList = [] // 把所有元素存入List for (int i = 1; i <= matchCount; i++) { arrayList.add(vars.get("myVar_" + i)) } // 把List转成JSON字符串存入全局属性 props.put("myVar_fullArray", new groovy.json.JsonBuilder(arrayList).toString())
- 在Thread Group #2的开头添加JSR223 PreProcessor,解析JSON字符串还原数组:
def jsonString = props.get("myVar_fullArray") def restoredArray = new groovy.json.JsonSlurper().parseText(jsonString) // 把还原后的数组元素重新存入当前线程组的vars,方便后续用__V调用 for (int i = 0; i < restoredArray.size(); i++) { vars.put("myVar_" + (i+1), restoredArray[i]) } // 同时存入数组长度 vars.put("myVar_matchNr", restoredArray.size().toString())
这样处理后,你在Thread Group #2里就能和Thread Group #1一样,直接用__V函数调用数组元素了。
小提醒
- 一定要保证Thread Group #1在Thread Group #2之前执行,测试计划里默认是按顺序执行的,如果你调整过顺序,记得检查一下。
- 如果是分布式测试,
props是每个节点本地的全局属性,这种情况可能需要用其他共享方式(比如数据库、缓存),但单机测试的话,上面两种方法完全够用。
内容的提问来源于stack exchange,提问作者uru917
相关产品推荐
相关产品推荐

