如何在JMeter JSR223预处理器中动态生成指定大小的XML对象
JMeter JSR223预处理器动态生成XML片段方案
实现工具
Groovy 自带的 XmlNodeBuilder,无需引入额外依赖,JSR223预处理器选择groovy语言即可直接使用,原生支持XML节点构造,自动处理转义字符,比字符串拼接稳定性更高。
实现步骤
先在测试计划中添加用户定义的变量,配置控制参数:
pa_total_count:要生成的<pa>节点总数量,比如填100就生成100个pa节点req_id_prefix:reqID的前缀,默认可以填IDdoc_nr_start:docNr的起始数值,默认填100000001
在JSR223预处理器中粘贴如下代码:
import groovy.xml.XmlNodeBuilder import groovy.xml.XmlNodePrinter import java.io.StringWriter // 读取JMeter自定义变量 def paCount = vars.get("pa_total_count") as int def reqIdPrefix = vars.get("req_id_prefix") def docNrStart = vars.get("doc_nr_start") as int // 构造XML节点生成器 def writer = new StringWriter() def xmlBuilder = new XmlNodePrinter(new PrintWriter(writer)) // 配置生成格式,保留缩进、不额外添加声明 xmlBuilder.setIndent(" ") xmlBuilder.setOmitDeclaration(true) def rootNodes = [] for (def i = 1; i <= paCount; i++) { // 格式化id为5位补0,比如1变成00001 def seq = String.format("%05d", i) def currentReqId = reqIdPrefix + seq def currentDocNr = (docNrStart + i - 1).toString() def gender = i % 2 == 1 ? "f" : "m" def givenName = "Test" + i // 构造单个pa节点 def paNode = new Node(null, "pa", [ outOfScope: "false", inTransit: "false", reqID: currentReqId ]) // 添加location子节点 new Node(paNode, "location", [ arrivalDate: "2021-09-20", code: "ASD", departureDatetime: "2021-09-20T11:00:00.000Z", scheduleNo: "AB123" ]) // 添加docs子节点 new Node(paNode, "docs", [ dob: "1960-09-02", expiryDate: "2031-09-13", gen: gender, givenName: givenName, anotherCode: "AB", anotherCode2: "ABC", surname: "John", docNr: currentDocNr, docType: "J" ]) rootNodes.add(paNode) } // 把生成的所有pa节点转成字符串 rootNodes.each { node -> xmlBuilder.print(node) } def xmlContent = writer.toString() // 存入JMeter变量 vars.put("xmlObject", xmlContent)
验证要点
- 生成的
xmlObject变量已经是格式化好的<pa>节点集合,直接插入到HTTP请求的XML模板中即可正常使用 - 可根据业务需求修改循环内的节点属性规则,比如日期、编码类字段也可以结合
__time、__RandomString等JMeter函数动态生成 - 若需要修改XML的缩进格式,调整
xmlBuilder.setIndent的参数即可
内容的提问来源于stack exchange,提问作者JustNatural
相关产品推荐
相关产品推荐

