You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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中的代码,读取对应行的变量:
    // 替换循环内的属性引用为按行读取
    ItemCode="${vars.get("ItemCode_" + i)}" 
    DepCode="${vars.get("DepCode_" + i)}"
    
    (CSV数据集配置会自动为每行生成变量名_行号格式的变量)

内容的提问来源于stack exchange,提问作者hughes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:20:34