使用 Playwright Java 框架创建自定义的请求和响应日志记录器

在 REST-assured 框架中,我们有可用的 log().all() 方法,用于记录请求和响应。然而,Playwright 并没有提供这样的方法。不过,Playwright 在 APIResponse 接口中提供了一个 text() 方法,可以很好地用来提取响应文本。

在本文中,我们将学习如何提取响应并创建一个自定义日志记录器,使用 Playwright Java 记录 API 测试的响应。

在开始之前,让我们先讨论一下记录响应详情所需的依赖项、配置和设置。

开始

由于我们使用 MavenPlaywright 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 框架创建自定义的请求和响应日志记录器就写到这里。

相关推荐
毕设源码-邱学长几秒前
【开题答辩全过程】以 基于SpringBoot的理工学院学术档案管理系统为例,包含答辩的问题和答案
java·spring boot·后端
修己xj9 分钟前
SpringBoot解析.mdb文件实战指南
java·spring boot·后端
lpfasd12328 分钟前
Spring Boot 定时任务详解(从入门到实战)
spring boot·后端·python
moxiaoran575331 分钟前
Go语言的文件操作
开发语言·后端·golang
赴前尘1 小时前
记一次golang进程执行卡住的问题排查
开发语言·后端·golang
码农小卡拉1 小时前
Prometheus 监控 SpringBoot 应用完整教程
spring boot·后端·grafana·prometheus
计算机毕设VX:Fegn08951 小时前
计算机毕业设计|基于springboot + vue球鞋购物系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
苏渡苇1 小时前
用 Spring Boot 项目给工厂装“遥控器”:一行 API 控制现场设备!
java·人工智能·spring boot·后端·网络协议·边缘计算
短剑重铸之日2 小时前
《设计模式》第五篇:策略模式
java·后端·设计模式·策略模式
步步为营DotNet3 小时前
深入理解ASP.NET Core Middleware:管道执行机制与高效应用
后端·asp.net