1. 概述

Gatling 是一个用Scala编写的流行负载测试工具,它能帮助我们在本地和云端机器上进行高性能、压力和负载测试。此外,它广泛用于测试HTTP服务器。默认情况下,Gatling专注于捕获和分析响应时间、错误率等性能指标,而不显示完整的HTTP响应体。

在这个教程中,我们将学习如何在Gatling中显示完整的HTTP响应体。这对于在负载测试过程中理解和调试服务器响应非常有用。

2. 项目设置

在这个教程中,我们将使用Gatling 的Maven插件来运行Gatling脚本。为此,我们需要在pom.xml中添加插件:

<plugin>
    <groupId>io.gatling</groupId>
    <artifactId>gatling-maven-plugin</artifactId>
    <version>4.3.0</version>
    <configuration>
        <includes>
            <include>org.baeldung.gatling.http.FetchSinglePostSimulation</include>
            <include>org.baeldung.gatling.http.FetchSinglePostSimulationLog</include>
        </includes>
        <runMultipleSimulations>true</runMultipleSimulations>
    </configuration>
</plugin>

我们配置插件以运行多个模拟。此外,还需要Gatling应用Gatling Highcharts依赖项:

<dependency>
    <groupId>io.gatling</groupId>
    <artifactId>gatling-app</artifactId>
    <version>3.9.5</version>
</dependency>

我们的目标是在控制台和日志文件中显示从示例API端点https://jsonplaceholder.typicode.com/posts/1获取的HTTP响应体。

3. 使用Gatling显示完整的HTTP响应体

让我们编写一个简单的Gatling模拟类,向https://jsonplaceholder.typicode.com/posts/1发送一个HTTP请求

public class FetchSinglePostSimulation extends Simulation {
    
    public FetchSinglePostSimulation() {
        HttpProtocolBuilder httpProtocolBuilder = http.baseUrl("https://jsonplaceholder.typicode.com");
        
        ScenarioBuilder scn = scenario("Display Full HTTP Response Body")
          .exec(http("GET Request")
          .get("/posts/1")
          .check(status().is(200))
          .check(bodyString().saveAs("responseBody")))
          .exec(session -> {
              System.out.println("Response Body:");
              System.out.println(session.getString("responseBody"));
              return session;
          });
        setUp(scn.injectOpen(atOnceUsers(1))).protocols(httpProtocolBuilder);
    }
}

在上述代码中,我们定义了一个名为FetchSinglePostSimulation的新类,它继承自Gatling库的Simulation类。

接下来,我们创建一个HttpProtocolBuilder对象,并将HTTP请求的基础URL设置为https://jsonplaceholder.typicode.com/

然后,我们定义一个ScenarioBuilder对象,用于定义一系列模拟场景。首先,我们使用exec()方法启动一个HTTP请求。接着,我们指定请求是到/posts/1端点的GET请求。

此外,我们检查响应的HTTP状态码是否为200。最后,我们使用check()方法将响应体保存为会话变量responseBody

此外,我们开始一个自定义动作,它接受一个Session对象作为输入。然后,我们在控制台上打印responseBody的值。最后,我们返回会话对象。

模拟通过一次性注入一个用户到场景中,并使用之前创建的httpProtocolBuilder对象配置HTTP协议来设置

要运行模拟,请打开终端并切换到项目的根目录。然后,运行Gatling的test命令:

mvn gatling:test

该命令生成模拟报告,并将响应体输出到控制台。以下是测试的响应体:

Gatling HTTP GET响应体

上图展示了模拟报告中的响应。

我们进一步将响应记录到文件而不是输出到控制台。首先,让我们编写一个处理文件创建的方法:

void writeFile(String fileName, String content) throws IOException {
    try(BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, true))){
        writer.write(content);
        writer.newLine();
    }
}

在上面的方法中,我们创建BufferedWriterFileWriter实例,用于将HTTP响应体写入文本文件Java写入文件

最后,让我们修改自定义动作,将响应体写入文件而不是输出到控制台:

public class FetchSinglePostSimulationLog extends Simulation {
    
    public FetchSinglePostSimulationLog() {
        HttpProtocolBuilder httpProtocolBuilder = http.baseUrl("https://jsonplaceholder.typicode.com");
        
        ScenarioBuilder scn = scenario("Display Full HTTP Response Body")
          .exec(http("GET Request")
          .get("/posts/1")
          .check(status().is(200))
          .check(bodyString().saveAs("responseBody")))
          .exec(session -> {
              String responseBody = session.getString("responseBody");
              try {
                  writeFile("response_body.log", responseBody);
              } catch (IOException e) {
                  System.err.println("error writing file");
              }
              return session;
          });
        setUp(scn.injectOpen(atOnceUsers(1))).protocols(httpProtocolBuilder);
    }
}

我们修改自定义动作,调用writeFile()方法,并将文件名response_body.log和HTTP响应体作为参数传递。writeFile()方法负责将响应记录到文件的操作。

4. 总结

在这篇文章中,我们学习了如何在Gatling中在控制台上显示完整的HTTP响应体。此外,我们还了解了如何将响应记录到文件,而不是输出到控制台。

如往常一样,所有示例的完整源代码可以在GitHub上找到。