JMeter如何将JSON提取器获取的${variable}_all按每组50个拆分参数化
实现方案
步骤1:确认JSON提取器输出变量
JMeter的JSON提取器匹配到多个值后,默认会生成两个固定变量:
${变量名}_all:所有匹配值用英文逗号拼接的字符串${变量名}_matchNr:匹配到的总数量
步骤2:用JSR223 PostProcessor拆分分组
在JSON提取器同级的请求下方,添加JSR223 PostProcessor,选择Groovy语言(性能远高于BeanShell),写入以下代码:
// 按需修改配置项 def maxGroupSize = 50 def sourceVarPrefix = "variable" // 替换为你JSON提取器中设置的引用名称 // 读取提取结果 def allValues = vars.get(sourceVarPrefix + "_all")?.split(",") def totalCount = vars.get(sourceVarPrefix + "_matchNr") as int if (allValues == null || totalCount == 0) { log.warn("未匹配到任何有效值,跳过分组") return } // 按上限拆分分组 def valueGroups = [] def tempList = [] allValues.each { item -> tempList.add(item.trim()) if (tempList.size() == maxGroupSize) { valueGroups.add(new ArrayList(tempList)) tempList.clear() } } // 剩余不足50条的单独成组 if (tempList.size() > 0) { valueGroups.add(tempList) } // 分组结果存入JMeter变量供后续调用 vars.putObject("splitGroups", valueGroups) vars.put("groupTotal", valueGroups.size() as String)
不要勾选“将参数存入变量”选项,避免额外性能损耗。
步骤3:添加循环控制器遍历分组
在JSR223 PostProcessor后添加循环控制器,循环次数设置为${groupTotal},遍历所有拆分好的分组。
步骤4:组装当前分组的请求参数
在循环控制器内部添加JSR223 PreProcessor,将当前循环的分组转为你需要的参数格式:
def allGroups = vars.getObject("splitGroups") // 注意将代码中的「循环控制器」替换为你实际的控制器命名 def currentLoopIndex = vars.get("__jm__循环控制器__idx") as int def currentGroup = allGroups.get(currentLoopIndex) // 示例1:转为逗号分隔的字符串,适合普通表单参数 vars.put("currentGroupStr", currentGroup.join(",")) // 示例2:转为JSON数组格式,适合JSON类型请求体 vars.put("currentGroupJson", new groovy.json.JsonBuilder(currentGroup).toPrettyString())
步骤5:参数化目标API请求
在循环控制器内部添加需要调用的API,直接引用上一步生成的变量即可,比如请求参数填${currentGroupStr}或者${currentGroupJson},执行时会自动按分组逐批发起请求。
注意事项
- 如果需要按分组内的单个值循环请求,可以在循环控制器内嵌套ForEach控制器,输入变量前缀填你原有的变量名,起始索引填
${__groovy(ctx.getVariables().get("__jm__循环控制器__idx") as int * 50,)},结束索引填${__groovy((ctx.getVariables().get("__jm__循环控制器__idx") as int +1)*50 -1,)}即可。 - 代码中的变量名、控制器名称要和测试计划中的实际命名对应,避免变量读取失败。
内容的提问来源于stack exchange,提问作者Nilesh Gupta
相关产品推荐
相关产品推荐

