如何在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
相关产品推荐
相关产品推荐

