如何在JMeter中创建含动态多Item的SOAP XML请求体
JMeter生成动态SOAP消息:批量创建带递增SeqID的Item标签
要实现批量生成50-100个带递增SeqID的Item标签,同时支持动态属性值,CSV数据集配置无法满足同一请求内生成多条不同条目需求,推荐用JSR223 PreProcessor结合变量替换来实现,步骤如下:
1. 添加JSR223 PreProcessor生成动态Items内容
在HTTP请求的父节点下添加JSR223 PreProcessor,选择Groovy语言(性能最优),输入以下代码:
// 设置要生成的Item数量,随机生成50-100个 def itemCount = org.apache.commons.lang3.RandomUtils.nextInt(50, 101) def itemsContent = "<Items>" // 循环生成每个Item标签 for (int i = 1; i <= itemCount; i++) { // 拼接Item标签,SeqID自动递增,其他属性用JMeter变量替换 itemsContent += """ <Item SeqID="${i}" ItemCode="${vars.get("ItemCode")}" DepCode="${vars.get("DepCode")}" SaleType="${vars.get("SaleType")}" QtyType="${vars.get("QtyType")}" Qty="${vars.get("Qty")}" NetPrice="${vars.get("NetPrice")}" NetAmount="${vars.get("NetAmount")}"/> """ } itemsContent += "</Items>" // 将生成的内容存入变量,供HTTP请求体引用 vars.put("dynamicItems", itemsContent) // 同步更新Total标签的数值 vars.put("totalItems", String.valueOf(itemCount)) def totalAmount = new BigDecimal(vars.get("NetAmount")) * itemCount vars.put("totalAmount", totalAmount.setScale(2, BigDecimal.ROUND_HALF_UP).toString())
2. 修改HTTP请求体
将原SOAP请求体中的<Items>...</Items>部分替换为${dynamicItems},同时把Total标签的数值也换成变量:
<soap:Envelope xmlns:soap="http://XXXXXsoap-envelope" xmlns:tem="http://XXXXX/"> <soap:Header/> <soap:Body> <tem:ProcessMessage> <tem:message> <![CDATA[ <LoyaltyMessages xmlns:xsi="http://www.w3.org/XXXX/XMLSchema-instance" xmlns:xsd="hXXXX/XMLSchema" XID="4" YYY="4186" ZZZ="998" PPP="1" LLLL="2" DateTime="2022-09-13T13:30:12" LLL="1"> <TransactionRequests> <TransactionRequest Type="0"> <Request JJJ="0" SSS="1"> ${dynamicItems} <Total TotalAmount="${totalAmount}" TotalNumberOfItems="${totalItems}"/> </Request> </TransactionRequest> </TransactionRequests> </LoyaltyMessages> ]]> </tem:message> </tem:ProcessMessage> </soap:Body> </soap:Envelope>
3. (可选)为每个Item设置不同属性值
如果需要每个Item的ItemCode、DepCode等属性值不同,可按以下操作:
- 添加CSV数据集配置,设置"Recycle on EOF"为
False,"Stop thread on EOF"为False,"Sharing mode"为Current thread - 在CSV文件中提前准备好所有Item的属性值(行数≥要生成的最大Item数)
- 修改JSR223 PreProcessor中的代码,读取对应行的变量:
(CSV数据集配置会自动为每行生成// 替换循环内的属性引用为按行读取 ItemCode="${vars.get("ItemCode_" + i)}" DepCode="${vars.get("DepCode_" + i)}"变量名_行号格式的变量)
内容的提问来源于stack exchange,提问作者hughes
相关产品推荐
相关产品推荐

