You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Cucumber HTML报告中展示Rest Assured请求响应详情

在Cucumber HTML报告中展示请求与响应详情的解决方案

你当前的问题是RestAssured的日志只输出到控制台,而Cucumber HTML报告仅显示步骤内容。要解决这个问题,我们可以通过捕获日志并添加为Cucumber报告附件,或者手动将请求响应细节写入报告两种方式实现。

方法一:自动捕获请求响应日志并添加为报告附件

这种方法利用RestAssured的日志过滤器将输出定向到字节流,再通过Cucumber的Scenario钩子将日志添加为报告附件,适合所有场景复用。

步骤1:在TestContext中添加日志存储对象

首先在你的TestContext类中添加用于捕获日志的流对象:

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

public class TestContext {
    private ByteArrayOutputStream requestResponseLog = new ByteArrayOutputStream();
    private PrintStream logCaptureStream = new PrintStream(requestResponseLog);
    // 其他已有属性...

    // Getter和Setter
    public ByteArrayOutputStream getRequestResponseLog() {
        return requestResponseLog;
    }

    public void setRequestResponseLog(ByteArrayOutputStream requestResponseLog) {
        this.requestResponseLog = requestResponseLog;
    }
}

步骤2:修改请求规格,将日志定向到自定义流

更新setRequestsSpec方法,让RestAssured的日志过滤器输出到我们的字节流,而不是控制台:

@Given("Request specifications are set with base uri {string}")
public void setRequestsSpec(String baseUri){
    ByteArrayOutputStream logStream = new ByteArrayOutputStream();
    PrintStream printStream = new PrintStream(logStream);
    
    RequestSpecification spec = new RequestSpecBuilder()
        .setBaseUri(baseUri)
        // 将日志输出到自定义流,而非默认控制台
        .addFilter(new ResponseLoggingFilter(printStream))
        .addFilter(new RequestLoggingFilter(printStream))
        .build();
    testContext().setRequestSpec(spec);
    testContext().setRequestResponseLog(logStream); // 保存日志流到上下文
}

步骤3:添加Cucumber钩子,将日志作为附件添加到报告

创建一个After钩子,在每个场景执行完成后,把捕获到的日志添加为HTML报告的附件:

import cucumber.api.Scenario;
import cucumber.api.java.After;
import java.nio.charset.StandardCharsets;

public class Hooks {
    private final TestContext testContext;

    // 构造函数注入TestContext(根据你的依赖方式调整)
    public Hooks(TestContext testContext) {
        this.testContext = testContext;
    }

    @After
    public void attachRequestResponseLog(Scenario scenario) {
        ByteArrayOutputStream logStream = testContext.getRequestResponseLog();
        if (logStream != null && logStream.size() > 0) {
            // 将日志作为文本附件嵌入报告
            scenario.embed(
                logStream.toByteArray(),
                "text/plain",
                "Request & Response Details"
            );
            // 也可以直接将日志写入场景描述(可选)
            scenario.write(new String(logStream.toByteArray(), StandardCharsets.UTF_8));
        }
    }
}

方法二:手动写入请求响应细节到报告

如果你需要更灵活地控制展示的内容,可以在步骤定义中直接提取请求响应的关键信息,写入Cucumber报告的步骤描述中。

修改azureLoginExecuted步骤定义

在方法中注入Scenario对象,手动提取并写入请求响应信息:

import cucumber.api.Scenario;

@When("^Azure Login Request Executed$")
public void azureLoginExecuted(Scenario scenario) {
    response = given()
        .formParam(GRANT_TYPE_KEY, GRANT_TYPE_VALUE)
        .formParam(AUTO_TEAM_CLIENT_ID_KEY, AUTO_TEAM_CLIENT_ID_VALUE)
        .formParam(AUTO_TEAM_CLIENT_SECRET_KEY, AUTO_TEAM_CLIENT_SECRET_VALUE)
        .formParam(RESOURCE_KEY, RESOURCE_VALUE)
        .when()
        .post(AUTO_TEAM_TENANT_ID + RESOURCE);

    // 手动写入关键信息到报告
    scenario.write("=== Request Details ===");
    scenario.write("Method: POST");
    scenario.write("URI: " + AUTO_TEAM_TENANT_ID + RESOURCE);
    scenario.write("Form Params: grant_type=" + GRANT_TYPE_VALUE 
        + "&client_id=" + AUTO_TEAM_CLIENT_ID_VALUE 
        + "&resource=" + RESOURCE_VALUE);
    
    scenario.write("\n=== Response Details ===");
    scenario.write("Status Code: " + response.getStatusCode());
    scenario.write("Response Body: " + response.getBody().asString());

    testContext().setResponse(response);
    setAuthorizationToken();
}

两种方法对比

  • 方法一:自动捕获所有请求响应日志,无需在每个步骤重复编写代码,适合多场景复用,日志内容完整。
  • 方法二:自定义展示内容,可只输出关键信息,避免日志冗余,但需要在每个请求步骤中手动编写代码。

完成上述配置后,重新运行测试,生成的HTML报告中就会显示请求与响应的详细内容了。

内容的提问来源于stack exchange,提问作者dushkin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:33:15