1. 概览
在本文中,我们将使用两种方式在 JMeter 中提取数据并写入外部文件中。
2. 配置 JMeter 脚本
首先来创建一个 JMeter 脚本。创建一个只包含一个线程的 Thread Group(保持创建 Thread Group 的默认配置)
在这个 Thread Group 内添加一个 HTTP Sampler
设置这个 HTTP Sampler 来调用本地运行的API。我们可以使用一个简单的REST Controller 来定义 API 开始:
@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; // getters, setters, and constructor omitted } 复制代码
现在让我们使用它来测试 JMeter 脚本。默认情况下,这将在端口 8080 上运行。如果我们无法使用 8080,那么我们需要更新 HTTP Sampler 中的 Port 字段。
HTTP Sampler 请求应如下所示:
3. 使用 Listener 保存提取的内容
现在我们使用 Save Responses to a file 监听器提取我们想要的内容到一个文件中:
使用这个监听器很方便,但是提取到文件的内容方面没有太大的灵活性。对于我们的例子,这将生成一个JSON 文件,该文件保存到 JMeter 当前运行的位置(尽管路径可以在 Filename Prefix 字段中配置)。
4. 使用 POSTProcessor 保存提取的内容
另一种将数据提取到文件的方法是创建 BeanShell PostProcessor。BeanShell 是一个非常灵活的脚本处理器,它允许我们使用 Java 代码编写脚本,并使用 JMeter 提供的一些内置变量。
BeanShell 可以用于各种不同的用例。在这种情况下,创建一个 BeanShell PostProcessor,并添加一个脚本来帮助我们将一些数据提取到文件中:
将如下代码添加到 BeanShell PostProcessor 中:
FileWriter fWriter = new FileWriter("/<path>/result.txt", true); BufferedWriter buff = new BufferedWriter(fWriter); buff.write("data"); buff.close(); fWriter.close(); 复制代码
现在我们可以通过这个简单的脚本,将字符串数据输出到 result.txt 文件中。这里需要注意的一点是 FileWriter 构造函数的第二个参数。这必须设置为true,以便 BeanShell 将内容追加到文件而不是覆盖它。在JMeter中使用多线程时,这一点非常重要。
接下来,我们想提取一些对我们的用例更有意义的东西。让我们利用 JMeter 提供的 ctx 变量。这将允许我们访问运行 HTTP请求 的单个线程中的上下文。
让我们从 ctx 中获取响应代码、响应头和响应体,并将它们提取到我们的文件中:
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())); 复制代码
如果我们想收集特定的字段数据并将其写入文件,我们可以使用 vars 变量。它是一个 map 类型,可以在PostProcessors 中用来存储和检索字符串数据。
对于这个更复杂的示例,让我们在文件提取器之前创建另一个 PostProcessor。这将通过 HTTP 请求的 JSON 响应内容进行搜索:
这个提取器将创建一个名为 message 的变量。剩下要做的就是在我们的文件提取器中引用这个变量,将其输出到我们的文件中:
buff.write("More complex extraction : " + vars.get("message")); 复制代码
注意:我们可以将此方法与其他后处理器(如“正则表达式提取器”)结合使用,以更定制化的方式收集信息。
5. 总结
在本文中,我们介绍了如何使用 BeanShell PostProcessor 和 Listener 将数据从 JMeter提取到外部文件。我们使用的 JMeter 脚本和 Spring REST 应用程序可以在 GitHub 上找到。