JMeter中提取指定条件的ID数组并传递至下一线程组的方法
解决JMeter提取指定条件ID并传递到下一个线程组的方法
我之前也碰到过一模一样的需求,给你一步步拆解解决思路:
1. 用JSON Extractor精准提取符合条件的ID
首先在你的HttpRequest请求下方添加一个JSON Extractor(右键请求 → Add → Post Processors → JSON Extractor),然后按如下配置:
- Reference Name:自定义一个变量名,比如
acceptedIds - JSON Path Expression:输入这个表达式:
$..[?(@.Contract.Status.displayName == 'Accepted')].linearId.id
简单解释下:$..:递归遍历整个JSON结构,不用纠结层级嵌套的问题[?(@.Contract.Status.displayName == 'Accepted')]:过滤出所有Contract.Status.displayName等于Accepted的对象.linearId.id:提取这些对象里的linearId.id值
- Match No.:填
-1(表示提取所有匹配结果,而非仅第一个) - Default Value:可以留空,或者填
NO_MATCH方便后续排查问题
2. 将零散的ID拼成标准JSON数组
JMeter提取多值时,会生成acceptedIds_1、acceptedIds_2这类变量,还有acceptedIds_matchNr记录匹配总数。我们需要把这些零散值拼成标准JSON数组:
在JSON Extractor下方再添加一个JSR223 PostProcessor,脚本语言选择Groovy(Groovy性能远优于其他脚本语言),输入以下代码:
// 初始化空列表存储ID def acceptedIdList = [] // 获取匹配到的ID总数 def totalMatches = vars.get('acceptedIds_matchNr') as int // 遍历所有匹配项,添加到列表 for (int i = 1; i <= totalMatches; i++) { def currentId = vars.get("acceptedIds_${i}") acceptedIdList.add(currentId) } // 将列表转成JSON字符串,存入变量 def jsonArray = new groovy.json.JsonBuilder(acceptedIdList).toString() vars.put('acceptedIdsArray', jsonArray)
执行后,acceptedIdsArray变量的值就会是["1234","7890"]这样的标准JSON数组格式。
3. 跨线程组传递变量
JMeter的线程组默认是隔离的,本地变量无法直接共享,所以需要借助JMeter的全局Properties来实现传递:
在当前线程组的JSR223 PostProcessor末尾加一行代码:
// 把数组变量存入全局Properties props.put('globalAcceptedIds', jsonArray)
在下一个线程组读取全局变量
在下一个线程组开头添加一个JSR223 Sampler,同样选择Groovy,输入以下代码:
// 从全局Properties读取数组 def globalIds = props.get('globalAcceptedIds') // 把全局变量存入当前线程组的本地变量,方便后续使用 vars.put('acceptedIdsFromOtherGroup', globalIds)
4. 验证结果
你可以在两个线程组里分别添加Debug Sampler,然后通过View Results Tree查看:
- 当前线程组的
acceptedIdsArray是否正确生成包含1234和7890的数组 - 下一个线程组的
acceptedIdsFromOtherGroup是否和上面的值一致
这样就能完美实现你的需求啦!
内容的提问来源于stack exchange,提问作者Viswa
相关产品推荐
相关产品推荐

