You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

JMeter中实现含动态数量<user>标签块的SOAP请求参数化方法

嘿,作为JMeter新手碰到这种动态生成多用户节点的SOAP请求场景,确实有点棘手,不过咱们一步步拆解来搞定它!

动态构造SOAP多用户节点的解决方案

1. 先把数据源处理干净

你的CSV数据源里user列有多余空格(比如1, Aaa),先把这些空格去掉,保存成格式规范的users.csv

groupId,user
1,Aaa
1,Bbb
1,Ccc
2,Ddd
2,Eee
3,Fff

如果是数据库数据源,后续只需要把读取CSV的逻辑换成JDBC查询就行,核心思路一致。

2. 配置CSV读取元件

添加一个CSV Data Set Config,参数设置如下:

  • Filename:填users.csv的路径(相对路径或绝对路径都可以)
  • Variable Names:groupId,user
  • Recycle on EOF:False
  • Stop thread on EOF:False
  • Delimiter:,
  • Allow quoted data:False

不过这一步只是基础读取,咱们还需要把同一groupId的用户聚合到一起,所以下一步是关键。

3. 用Groovy脚本聚合同组用户

在SOAP请求的上级节点(比如Thread Group)下添加JSR223 PreProcessor,选择Groovy语言(Groovy比BeanShell高效太多,优先用它),粘贴下面的脚本:

// 初始化全局分组存储,只执行一次
if (!vars.getObject("groupedUsers")) {
    def groupedData = new HashMap<>()
    // 读取整个CSV文件,按groupId分组
    new File("users.csv").eachLine { line, lineNum ->
        if (lineNum > 1) { // 跳过表头行
            def parts = line.split(",")
            def groupId = parts[0].trim()
            def userName = parts[1].trim()
            // 给每个groupId创建用户列表
            if (!groupedData.containsKey(groupId)) {
                groupedData.put(groupId, new ArrayList<>())
            }
            groupedData.get(groupId).add(userName)
        }
    }
    vars.putObject("groupedUsers", groupedData)
    // 初始化分组迭代器,用来逐个处理每个groupId
    vars.putObject("groupIterator", groupedData.keySet().iterator())
}

// 取出下一个待处理的groupId和用户列表
def iterator = vars.getObject("groupIterator")
if (iterator.hasNext()) {
    def currentGroup = iterator.next()
    def userList = vars.getObject("groupedUsers").get(currentGroup)
    
    // 动态生成<user>节点的XML片段
    def userXmlBuilder = new StringBuilder()
    userList.each { surname ->
        userXmlBuilder.append("<user><surname>${surname}</surname></user>")
    }
    
    // 把生成的内容存入JMeter变量,供SOAP请求调用
    vars.put("currentGroupId", currentGroup)
    vars.put("usersXml", userXmlBuilder.toString())
} else {
    // 所有分组处理完毕,停止当前线程
    ctx.getThread().stop()
}

4. 编写动态SOAP请求体

SOAP Request元件的请求体里,用JMeter变量替换动态部分,这样每次迭代都会生成对应groupId的用户节点:

<Envelope> 
<Header> </Header> 
<Body> 
... 
<groupId>${currentGroupId}</groupId> 
<users> 
${usersXml}
</users> 
</Body> 
</Envelope>

5. 调整线程组循环设置

因为我们是按groupId分组处理,线程组的循环次数可以设为永远,脚本会在所有分组处理完后自动停止线程;或者你可以先统计CSV里有多少个不同的groupId,把循环次数设为对应数值,两种方式都可以。

小技巧:调试用Debug Sampler

添加一个Debug Sampler,运行后查看currentGroupIdusersXml变量的值,就能快速验证动态生成的内容是否正确啦!

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

火山引擎 最新活动