1. 概述

在本教程中,我们将介绍两种从 Apache JMeter 中提取数据并写入外部文件的方法。

2. 创建基础的 JMeter 脚本

首先我们来创建一个基础的 JMeter 测试脚本。先添加一个 Thread Group(线程组),默认情况下它会包含一个线程:

JMeter create thread group

接着,在该 Thread Group 下添加一个 HTTP Sampler(HTTP 请求采样器):

JMeter create Http sampler

配置这个 HTTP Sampler 来调用运行在本地的一个 API 接口。我们可以使用一个简单的 REST controller 实现如下接口:

@RestController
public class RetrieveUuidController {

    @GetMapping("/api/uuid")
    public Response uuid() {
        return new Response(format("Test message... %s.", UUID.randomUUID()));
    }
}

同时,定义上面控制器返回的 Response 类:

public class Response {
    private Instant timestamp;
    private UUID uuid;
    private String message;

    // 省略 getter、setter 和构造函数
}

现在就可以用这个接口测试我们的 JMeter 脚本了。默认服务运行在 8080 端口;如果无法使用该端口,请相应地修改 HTTP Sampler 中的 Port Number 字段。

最终的 HTTP Sampler 请求配置应如下所示:

JMeter http sampler details

3. 使用 Listener 写入提取的数据

接下来,我们可以使用类型为 Save Responses to a file 的监听器(Listener)将所需数据写入文件:

JMeter write listener

优点: 使用这种监听器非常方便快捷。

缺点: 灵活性有限,不能按需自定义要写入的内容。

在这种场景下,它会在 JMeter 当前运行目录下生成一个 JSON 文件(当然可以通过 Filename Prefix 配置具体路径)。

4. 使用 PostProcessor 写入提取的数据

另一种更灵活的方式是通过 BeanShell PostProcessor 来实现数据提取到文件中。

⚠️ 注意: BeanShell 是一个强大的脚本处理器,允许我们使用 Java 编写脚本,并能访问 JMeter 提供的一些内置变量。

下面我们在 JMeter 中创建一个 BeanShell PostProcessor 并编写如下脚本来输出数据到文件:

JMeter BeanShell PostProcessor

FileWriter fWriter = new FileWriter("/<path>/result.txt", true);
BufferedWriter buff = new BufferedWriter(fWriter);

buff.write("data");

buff.close();
fWriter.close();

关键点: 第二个参数必须设为 true,这样每次执行都会追加内容到文件末尾,而不是覆盖原有内容。这在多线程环境下尤其重要!

更进一步:提取响应信息

为了提取更有意义的数据,我们可以使用 JMeter 提供的 ctx 变量(即 JMeterContext 对象),它代表当前线程上下文。

buff.write("Response Code : " + ctx.getPreviousResult().getResponseCode());
buff.write(System.getProperty("line.separator"));
buff.write("Response Headers : " + ctx.getPreviousResult().getResponseHeaders());
buff.write(System.getProperty("line.separator"));
buff.write("Response Body : " + new String(ctx.getPreviousResult().getResponseData()));

提取特定字段(如 JSON 中的 message)

如果我们想提取 JSON 响应中的某个字段,可以结合使用 vars 变量(JMeterVariables)。这是一个用于存储字符串变量的 Map。

为此,我们可以在文件写入处理器之前添加一个 JSON Extractor 处理器:

JMeter JSON Exctractor

这个提取器会创建一个名为 message 的变量,然后我们就可以在 BeanShell 脚本中引用它:

buff.write("More complex extraction : " + vars.get("message"));

💡 提示: 这种方式也可以配合其他后置处理器(如“正则表达式提取器”)一起使用,以满足更多定制化需求。

5. 总结

本文介绍了两种将 JMeter 中的数据导出至外部文件的方法:

  • 使用 Save Responses to a file 监听器(简单但不够灵活)
  • 使用 BeanShell PostProcessor(灵活强大,支持自定义逻辑)

相关示例代码(包括 JMeter 脚本和 Spring Boot REST 应用)已上传至 GitHub:https://github.com/eugenp/tutorials/tree/master/testing-modules/jmeter


原始标题:Write Extracted Data to a File Using JMeter