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,运行后查看currentGroupId和usersXml变量的值,就能快速验证动态生成的内容是否正确啦!
内容的提问来源于stack exchange,提问作者Edark




