JMeter中如何将每次HTTP请求后JsonExtractor的返回值存入数组供后续线程组使用
实现方案
该需求完全可以实现,以下是JMeter场景下的可落地操作步骤:
1. 初始化跨线程组的全局存储数组
- 在线程组1的最顶部添加
JSR223 前置处理器,写入初始化代码:
// 初始化全局数组,用props存储实现跨线程组读写 props.put("requestProtocolIdList", [])
此处必须使用JMeter的全局属性
props存储,线程级变量vars仅在当前线程生效,无法跨线程组传递数据。
2. 每次请求完成后写入提取值
- 在你已配置的
JSON Extractor后新增JSR223 后置处理器,写入如下代码:
// 替换currentProtocolId为你在JSON Extractor中自定义的变量名 def currentId = vars.get("currentProtocolId") // 非空校验避免无效值存入 if (currentId != null) { def idList = props.get("requestProtocolIdList") idList.add(currentId) props.put("requestProtocolIdList", idList) }
该逻辑会在每次接口请求、提取到
requestProtocolId后自动执行,逐个存入全局数组。
3. 下一个线程组调用存储的ID值
- 首先确保测试计划中线程组1的排列顺序在需要调用ID的线程组2之前,保证执行顺序正确。
- 如果需要逐个调用所有ID,可将线程组2的循环次数/线程数设置为和ID总数(此处为50)一致,在需要用到ID的请求前添加
JSR223 前置处理器:
def idList = props.get("requestProtocolIdList") // 按索引取值,循环场景下用__counter函数获取当前循环下标 def targetId = idList.get(${__counter(TRUE,)}-1) vars.put("targetRequestProtocolId", targetId)
- 后续请求参数中直接引用
${targetRequestProtocolId}即可使用对应ID。
额外注意事项
- 如果线程组1是并发执行请求,需要给数组写入操作加锁避免并发写入异常,串行请求无需额外处理。
- 所有JSR223组件建议选择groovy作为脚本语言,执行效率更高。
内容的提问来源于stack exchange,提问作者QA_V
相关产品推荐
相关产品推荐

