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

如何用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响应结构调整)
  • 添加JSR223 Assertion到SOAP请求下,用Groovy代码标记请求成功/失败:
    def resultCode = vars.get("result_code")
    // 假设业务成功码为"0",可根据实际规则修改
    if (resultCode != "0") {
        prev.setSuccessful(false) // 标记请求为失败
    }
    
    注:也可以结合HTTP状态码判断,比如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:50:19