JMeter如何按规则将CSV数据分类传入请求体的不同数组?
实现CSV数据分组为指定JSON格式的传参方法
推荐方案:使用JSR223 PreProcessor
JSR223组件支持Groovy脚本,性能优于BeanShell,适合处理这类数据分组与JSON构造需求。
步骤1:添加前置处理器
在目标HTTP请求节点上右键 → 添加 → 前置处理器 → JSR223 PreProcessor
步骤2:编写Groovy分组脚本
在PreProcessor的「Script」框中输入以下代码(替换CSV路径为你的实际文件路径):
// 初始化分组存储结构 def idGroups = [empid: [], emailid: []] // 读取CSV文件 def csvFile = new File("你的CSV文件路径.csv") csvFile.eachLine { line, lineNum -> // 跳过表头行 if (lineNum == 1) return // 拆分每行数据(若CSV含转义逗号,可改用下方注释的CSV解析库) def parts = line.split(",") def id = parts[0].trim() def idType = parts[1].trim() // 按类型分组收集 if (idGroups.containsKey(idType)) { idGroups[idType].add(id) } } // 生成JSON字符串 import groovy.json.JsonBuilder def jsonBuilder = new JsonBuilder(idGroups) def requestBody = jsonBuilder.toPrettyString() // 将JSON存入JMeter变量 vars.put("requestBody", requestBody)
步骤3:在HTTP请求中引用变量
在HTTP请求的「Body Data」区域直接填写 ${requestBody},JMeter会自动替换为生成的目标JSON内容。
特殊场景:处理含转义逗号的CSV
如果CSV中存在带逗号的内容(如特殊格式的ID),替换脚本中的读取逻辑为:
@Grab('org.apache.commons:commons-csv:1.9.0') import org.apache.commons.csv.CSVFormat def idGroups = [empid: [], emailid: []] def csvFile = new File("你的CSV文件路径.csv") def parser = CSVFormat.DEFAULT.withHeader().parse(csvFile.newReader()) parser.each { record -> def id = record.get("id") def idType = record.get("idType") if (idGroups.containsKey(idType)) { idGroups[idType].add(id) } } // 后续JSON生成逻辑同前
可选:逐批次分组数据
若需分多次请求处理数据,可配合循环控制器实现:
- 添加循环控制器,设置循环次数为CSV总行数
- 控制器内添加CSV Data Set Config,变量名设为
id,idType - 新增JSR223 PreProcessor,用以下代码累计分组:
// 初始化分组结构(仅首次循环执行) if (!vars.containsKey("idGroups")) { vars.putObject("idGroups", [empid: [], emailid: []]) } def idGroups = vars.getObject("idGroups") // 收集当前行数据 def id = vars.get("id") def idType = vars.get("idType") if (idGroups.containsKey(idType)) { idGroups[idType].add(id) } vars.putObject("idGroups", idGroups) // 最后一次循环生成JSON def totalLoops = ctx.getThreadGroup().getSamplerController().getLoopCount() def currentLoop = ctx.getVariables().getIteration() if (currentLoop == totalLoops) { import groovy.json.JsonBuilder def jsonBuilder = new JsonBuilder(idGroups) vars.put("requestBody", jsonBuilder.toPrettyString()) }
将HTTP请求放在循环控制器外,或设置为仅最后一次循环执行即可。
内容的提问来源于stack exchange,提问作者Gomathy Balakrishnan
相关产品推荐
相关产品推荐

