如何在JMeter JSON Extractor中提取多个JSON响应的Cart ID
解决JMeter提取多线程Cart ID并跨线程组共享的问题
一、修改JSON Extractor配置,提取所有Cart ID
当前你只拿到最后一个Cart ID,是因为默认配置仅提取单个匹配项。调整配置如下:
- 将**Match No.**的值改为
-1(表示提取所有匹配结果,而非仅第一个/最后一个) - 变量名保持(比如
cartId),此时JMeter会自动生成:cartId_1、cartId_2...:对应每个线程返回的Cart IDcartId_matchNr:存储匹配到的Cart ID总数
二、将提取的Cart ID存储为全局属性(跨线程组共享)
线程组内的变量默认无法被其他线程组访问,需要把Cart ID存入JMeter全局属性:
在第一个线程组的HTTP请求下方添加JSR223 PostProcessor(推荐用Groovy语言),写入以下代码:
// 获取匹配到的Cart ID总数 def total = vars.get("cartId_matchNr") as int // 逐个将Cart ID存入全局属性 for (int i = 1; i <= total; i++) { def currentId = vars.get("cartId_" + i) props.put("global_cartId_" + i, currentId) } // 同时可存入逗号分隔的字符串,方便批量调用 def allIds = "" for (int i = 1; i <= total; i++) { allIds += vars.get("cartId_" + i) + "," } if (allIds.endsWith(",")) { allIds = allIds.substring(0, allIds.length() - 1) } props.put("global_allCartIds", allIds)
三、在第二个线程组中调用Cart ID
- 单个调用:使用
${__P(global_cartId_1,)}、${__P(global_cartId_2,)}直接引用对应Cart ID - 批量遍历:添加JSR223 Sampler,写入代码遍历所有Cart ID:
def total = props.get("cartId_matchNr") as int for (int i = 1; i <= total; i++) { def cartId = props.get("global_cartId_" + i) // 这里可添加后续业务逻辑,比如用cartId发起请求 log.info("当前使用的Cart ID:" + cartId) }
关键注意事项
- 确保测试计划勾选Run Thread Groups Consecutively(按顺序运行线程组),否则第二个线程组可能在第一个线程组未执行完成时启动,导致无法获取属性。
- 优先使用JSR223元件而非BeanShell,Groovy性能远优于BeanShell,且语法更灵活。
内容的提问来源于stack exchange,提问作者Mohammad Wadi
相关产品推荐
相关产品推荐

