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
该命令生成模拟报告,并将响应体输出到控制台。以下是测试的响应体:
上图展示了模拟报告中的响应。
我们进一步将响应记录到文件而不是输出到控制台。首先,让我们编写一个处理文件创建的方法:
void writeFile(String fileName, String content) throws IOException {
try(BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, true))){
writer.write(content);
writer.newLine();
}
}
在上面的方法中,我们创建BufferedWriter
和FileWriter
实例,用于将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上找到。