如何用JMeter将SOAP请求的成功与失败记录分别存入CSV
JMeter实现SOAP请求成功/失败数据分CSV存储方案
一、方案可行性
完全可行,通过JMeter的XPath提取器、断言、JSR223组件可以实现需求,既能保留输入CSV的所有字段并分文件存储,也能在脚本中处理失败记录的业务逻辑。
二、具体实现步骤
1. 定义成功/失败判定规则
- 用XPath2 Extractor从SOAP响应中提取业务状态码(比如响应里的
<resultCode>0</resultCode>),配置参数:- Reference Name:
result_code - XPath Query:
//resultCode/text()(根据实际SOAP响应结构调整)
- Reference Name:
- 添加JSR223 Assertion到SOAP请求下,用Groovy代码标记请求成功/失败:
注:也可以结合HTTP状态码判断,比如def resultCode = vars.get("result_code") // 假设业务成功码为"0",可根据实际规则修改 if (resultCode != "0") { prev.setSuccessful(false) // 标记请求为失败 }prev.getResponseCode() != "200"时直接标记失败。
2. 保留输入CSV的所有字段
通过CSV Data Set Config读取输入文件时,已将每个字段自动存入JMeter变量(比如输入文件有id,name,phone三列,变量名就是${id}、${name}、${phone}),后续直接引用这些变量即可。
3. 分文件写入成功/失败数据
添加JSR223 PostProcessor到SOAP请求下,用Groovy代码实现分文件写入:
// 定义输出文件路径,可根据实际路径修改 def successPath = "success_output.csv" def failPath = "fail_output.csv" def successFile = new File(successPath) def failFile = new File(failPath) // 定义输入字段列表,和输入CSV的列名一致 def fields = ["id", "name", "phone", "result_code"] def header = fields.join(",") // 组装要写入的行数据 def row = fields.collect { vars.get(it) }.join(",") // 写入成功文件 if (prev.isSuccessful()) { // 第一次写入时添加表头 if (!successFile.exists() || successFile.length() == 0) { successFile.append(header + System.lineSeparator(), "UTF-8") } successFile.append(row + System.lineSeparator(), "UTF-8") } else { // 写入失败文件,同时执行失败业务逻辑 if (!failFile.exists() || failFile.length() == 0) { failFile.append(header + System.lineSeparator(), "UTF-8") } failFile.append(row + System.lineSeparator(), "UTF-8") // 这里添加失败记录的业务逻辑处理,示例: // 1. 记录详细错误日志:log.error("请求失败,ID: " + vars.get("id") + ",错误码: " + vars.get("result_code")); // 2. 调用补偿接口:可预先添加补偿请求Sampler,此处触发执行 // 3. 写入数据库:通过预配置的JDBC Request组件完成数据插入 }
4. 关键注意事项
- 线程安全:多线程压测时,建议用
org.apache.commons.io.FileUtils的同步方法写入,避免文件内容混乱,替换append为:import org.apache.commons.io.FileUtils FileUtils.writeStringToFile(successFile, row + System.lineSeparator(), "UTF-8", true) - 分布式测试:输出文件会生成在每个JMeter节点的本地路径,若需集中存储,需配置共享文件系统或改用数据库存储。
- 编码问题:写入时指定UTF-8编码,避免中文乱码。
内容的提问来源于stack exchange,提问作者Thomson Mathew
相关产品推荐
相关产品推荐

