在 REST-assured 框架中,我们有可用的 log().all()
方法,用于记录请求和响应。然而,Playwright 并没有提供这样的方法。不过,Playwright 在 APIResponse
接口中提供了一个 text()
方法,可以很好地用来提取响应文本。
在本文中,我们将学习如何提取响应并创建一个自定义日志记录器,使用 Playwright Java 记录 API 测试的响应。
在开始之前,让我们先讨论一下记录响应详情所需的依赖项、配置和设置。
开始
由于我们使用 Maven
和 Playwright Java
,因此我们将使用 Log4J2 Maven
依赖项来记录响应详情。其中,Jackson Databind
的依赖项将用于解析 JSON 响应。
xml
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j-api-version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j-core-version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-databind-version}</version>
</dependency>
作为一种最佳实践,这些依赖项的版本将添加到属性块中,这使得你可以轻松地检查和更新项目中依赖项的较新版本。
xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<log4j-core-version>2.24.1</log4j-core-version>
<log4j-api-version>2.24.1</log4j-api-version>
<jackson-databind-version>2.18.0</jackson-databind-version>
</properties>
下一步是在 src/main/resources
文件夹中创建一个 log4j2.xml
文件。该文件存储日志的配置信息,例如日志级别、日志应打印到控制台还是文件、日志布局的模式等。
xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Console name="LogToConsole" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="io.github.mfaisalkhatri" level="info" additivity="false">
<AppenderRef ref="LogToConsole"/>
</Logger>
<Root level="error">
<AppenderRef ref="LogToConsole"/>
</Root>
</Loggers>
<Loggers>
<Logger name="io.github.mfaisalkhatri" level="trace" additivity="false">
<AppenderRef ref="LogToConsole"/>
</Logger>
<Root level="error">
<AppenderRef ref="LogToConsole"/>
</Root>
</Loggers>
</Configuration>
<Appenders>
部分包含有关日志打印及其模式格式的信息。<Loggers>
部分包含日志级别详细信息以及如何打印日志。该文件中可以有多个 <Loggers>
块,每个块对应不同的日志级别,如 "info","debug","trace" 等。
实现自定义日志记录器
创建一个新的 Java 类 Logger
,以实现记录响应详情的方法。
java
public class Logger {
private final APIResponse response;
private final org.apache.logging.log4j.Logger log;
public Logger (final APIResponse response) {
this.response = response;
this.log = LogManager.getLogger (getClass ());
}
//...
}
该类在类级别声明了 Playwright 的 APIResponse
接口和 Log4j 的 Logger
接口,以确保我们可以在同一类中的进一步方法中重复使用它们,并避免重复代码行。
Logger 类的构造函数用于创建实现类的对象。将 APIResponse
接口作为参数添加,因为我们需要将响应对象提供给此类,以便记录相应的详情。
logResponseDetails()
方法实现了记录所有响应详情的功能。
java
public void logResponseDetails () {
String responseBody = this.response.text ();
this.log.info ("Logging Response Details....\n responseHeaders: {}, \nstatusCode: {},",
this.response.headers (), this.response.status ());
this.log.info ("\n Response body: {}", prettyPrintJson (responseBody));
this.log.info ("End of Logs!");
}
responseBody
变量将存储执行 API 后接收到的响应。下一行代码将打印响应详情、头部和状态码。
由于返回的响应没有进行美化打印,也就是说 JSON 格式以多行字符串的形式显示,这使得日志看起来杂乱无章。因此,我们创建了一个 prettyPrintJson()
方法,该方法接受字符串格式的响应,并以美化格式返回。
java
private String prettyPrintJson (final String text) {
if (StringUtils.isNotBlank (text) && StringUtils.isNotEmpty (text)) {
try {
final ObjectMapper objectMapper = new ObjectMapper ();
final Object jsonObject = objectMapper.readValue (text, Object.class);
return objectMapper.writerWithDefaultPrettyPrinter ()
.writeValueAsString (jsonObject);
} catch (final JsonProcessingException e) {
this.log.error ("Failed to pretty print JSON: {}", e.getMessage (), e);
}
}
return "No response body found!";
}
该方法接受字符串作为方法参数,其中将提供 response object
。
使用 if()
条件进行检查,以验证提供的文本是否不为空白、非空且不为空。如果满足条件,则实例化 Jackson Databind
依赖项中的 ObjectMapper
类。
接下来,读取响应的文本值,并使用 ObjectMapper
类的 writerWithDefaultPrettyPrinter()
和 writeValueAsString()
方法将其转换并以 JSON 美化打印格式返回。
如果响应为空、为空或为空白,将打印消息 "No response body found!" 并退出该方法。
如何在 API 自动化测试中使用日志记录器
需要实例化 Logger
类并调用其相应方法,以便在执行测试时打印响应详情。
我们需要确保在测试中不会到处重复编写代码以记录响应详情。为了处理此问题,我们将使用 BaseTest
类并创建一个新方法 logResponse(APIResponse response)
_。
此方法将接受 APIResponse
作为参数,并在实例化 Logger 类后调用 logResponseDetails()
方法。
java
public class BaseTest {
//...
protected void logResponse (final APIResponse response) {
final Logger logger = new Logger (response);
logger.logResponseDetails ();
}
}
由于 BaseTest
类被所有测试类继承,因此可以直接在测试类中调用这些方法。
我们在前面的博客中用于测试 GET、POST、PUT、PATCH 和 DELETE 请求的快乐场景测试的 HappyPathTests
类已经继承了 BaseTest
类。让我们为 POST 和 GET API 请求测试打印响应日志。
testShouldCreateNewOrders()
验证是否成功创建了新订单。让我们在此测试中添加 logResponse()
方法,并在日志中打印响应。
java
public class HappyPathTests extends BaseTest{
@Test
public void testShouldCreateNewOrders() {
final int totalOrders = 4;
for (int i = 0; i < totalOrders; i++) {
this.orderList.add(getNewOrder());
}
final APIResponse response = this.request.post("/addOrder", RequestOptions.create()
.setData(this.orderList));
logResponse (response);
//...
// 断言语句...
}
}
在发送 POST 请求后将调用 logResponse()
方法。这将使我们能够在开始执行断言之前了解收到的响应是什么。
testShouldGetAllOrders()
验证 GET /getAllOrder
API 请求。让我们在此测试中添加 logResponse()
方法并检查是否打印了响应日志。
java
public class HappyPathTests extends BaseTest{
@Test
public void testShouldGetAllOrders() {
final APIResponse response = this.request.get("/getAllOrders");
好啦,关于如何使用 Playwright Java 框架创建自定义的请求和响应日志记录器就写到这里。