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

相关推荐
恸流失6 小时前
DJango项目
后端·python·django
Mr Aokey9 小时前
Spring MVC参数绑定终极手册:单&多参/对象/集合/JSON/文件上传精讲
java·后端·spring
地藏Kelvin9 小时前
Spring Ai 从Demo到搭建套壳项目(二)实现deepseek+MCP client让高德生成昆明游玩4天攻略
人工智能·spring boot·后端
菠萝0110 小时前
共识算法Raft系列(1)——什么是Raft?
c++·后端·算法·区块链·共识算法
长勺10 小时前
Spring中@Primary注解的作用与使用
java·后端·spring
小奏技术11 小时前
基于 Spring AI 和 MCP:用自然语言查询 RocketMQ 消息
后端·aigc·mcp
编程轨迹11 小时前
面试官:如何在 Java 中读取和解析 JSON 文件
后端
lanfufu11 小时前
记一次诡异的线上异常赋值排查:代码没错,结果不对
java·jvm·后端
编程轨迹11 小时前
如何在 Java 中实现 PDF 与 TIFF 格式互转
后端
编程轨迹11 小时前
面试官:你知道如何在 Java 中创建对话框吗
后端