JMeter JSR223预处理器根据CSV动态生成符合指定规则的XML对象
解决方法
核心思路
- 直接在代码内加载全量CSV数据,避免依赖JMeter CSV组件单次仅读取一行的限制
- 匹配传入的
docId定位起始行下标 - 利用取模运算实现读取到CSV末尾自动从头循环的逻辑
- 循环生成节点时动态读取对应行的CSV数据
调整后的完整代码
// 配置参数区,根据实际情况修改 def csvFilePath = "你的CSV文件实际路径.csv" def targetDocId = vars.get("iDocId").toString() // 传入的定位用docId变量 def numberOfNodes = 3 // 可改为 vars.get("numberOfNodes") as int 实现参数化 def pReqIDPrefix = "ID0000" // 加载并解析CSV文件,缓存到全局属性避免每次请求重复读盘 // 如果CSV会频繁修改,可删除以下缓存判断逻辑,每次直接读取文件即可 if (!props.get("csvDataCache")) { def csvRows = [] new File(csvFilePath).readLines().drop(1).each { line -> // drop(1)跳过表头 def cols = line.split(",")*.trim() csvRows << [ iDocType: cols[0], iDocId: cols[1], iName: cols[2], iDate: cols[3] ] } props.put("csvDataCache", csvRows) } def csvData = props.get("csvDataCache") def totalRows = csvData.size() // 定位起始行索引 def startIndex = csvData.findIndexOf { it.iDocId == targetDocId } if (startIndex == -1) { throw new Exception("未找到docId为${targetDocId}的CSV行") } // 生成XML def writer = new StringWriter() def xml = new groovy.xml.MarkupBuilder(writer) xml.objects { for (int i = 0; i < numberOfNodes; i++) { // 取模运算实现读到文件末尾自动循环 def currentIndex = (startIndex + i) % totalRows def currentRow = csvData[currentIndex] // 对齐预期输出的节点属性 object(a:'false', b:'false', c: pReqIDPrefix + (i+1).toString()) { al(ad:'2021-09-20', alc:'bla', dt:'2021-09-20T11:00:00.000Z', sn:'AB8912') // 动态填充当前行CSV数据 doc( docType: currentRow.iDocType, docId: currentRow.iDocId, name: currentRow.iName, date: currentRow.iDate ) } } } // 保存结果到JMeter变量 def nodeAsText = writer.toString() log.info("生成的XML:\n${nodeAsText}") vars.put('passengers3XmlObj', nodeAsText)
注意事项
- 请替换代码中
csvFilePath为你实际的CSV文件路径,支持相对JMeter bin目录的路径或者绝对路径 - 若CSV文件会频繁修改,删除props缓存相关代码即可,每次执行会重新读取最新CSV数据
- 已对齐你预期的XML属性配置:object节点的
pReqID改为c,al节点的bla属性改为dt
内容的提问来源于stack exchange,提问作者JustNatural
相关产品推荐
相关产品推荐

