1. 概述
在本教程中,我们将介绍两种从 Apache JMeter 中提取数据并写入外部文件的方法。
2. 创建基础的 JMeter 脚本
首先我们来创建一个基础的 JMeter 测试脚本。先添加一个 Thread Group(线程组),默认情况下它会包含一个线程:
接着,在该 Thread Group 下添加一个 HTTP Sampler(HTTP 请求采样器):
配置这个 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 请求配置应如下所示:
3. 使用 Listener 写入提取的数据
接下来,我们可以使用类型为 Save Responses to a file 的监听器(Listener)将所需数据写入文件:
✅ 优点: 使用这种监听器非常方便快捷。
❌ 缺点: 灵活性有限,不能按需自定义要写入的内容。
在这种场景下,它会在 JMeter 当前运行目录下生成一个 JSON 文件(当然可以通过 Filename Prefix 配置具体路径)。
4. 使用 PostProcessor 写入提取的数据
另一种更灵活的方式是通过 BeanShell PostProcessor 来实现数据提取到文件中。
⚠️ 注意: BeanShell 是一个强大的脚本处理器,允许我们使用 Java 编写脚本,并能访问 JMeter 提供的一些内置变量。
下面我们在 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 处理器:
这个提取器会创建一个名为 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