如何将REST Assured日志写入Cucumber的scenario.write()?
如何将REST Assured日志保存到变量并写入Cucumber报告
要实现把REST Assured的请求/响应日志捕获到变量,再通过Cucumber的scenario.write()写入报告,核心思路是用REST Assured的LoggingFilter替代默认的控制台日志输出,把日志内容捕获到内存流中,再通过线程安全的存储(比如ThreadLocal)传递到Cucumber的Hook里。下面是具体步骤和代码示例:
1. 准备依赖(按需添加)
我们需要用到WriterOutputStream来将字符串流转换为PrintStream,它来自Apache Commons IO库。如果你的项目还没引入,添加Maven依赖:
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.15.1</version> <!-- 建议使用最新稳定版本 --> </dependency>
2. 线程安全存储日志内容
Cucumber执行场景时通常是多线程的,每个场景的日志需要独立存储,所以用ThreadLocal来保存每个线程的日志流:
import java.io.StringWriter; import io.cucumber.java.After; import io.cucumber.java.Scenario; public class CucumberHooks { // 用于存储每个场景的REST Assured日志 private static final ThreadLocal<StringWriter> restAssuredLogHolder = new ThreadLocal<>(); // 提供方法让测试代码设置日志流 public static void setRestAssuredLogWriter(StringWriter writer) { restAssuredLogHolder.set(writer); } }
3. 在测试代码中捕获REST Assured日志
替换原来的log().all(),改用LoggingFilter把日志写入StringWriter,并存储到ThreadLocal中:
import java.io.PrintStream; import org.apache.commons.io.output.WriterOutputStream; import io.restassured.filter.log.LogDetail; import io.restassured.filter.log.LoggingFilter; import static io.restassured.RestAssured.given; public class YourStepDefinitions { @Given("I send a POST request to {string}") public void sendPostRequest(String endpoint) { // 初始化日志捕获流 StringWriter logWriter = new StringWriter(); PrintStream logStream = new PrintStream(new WriterOutputStream(logWriter), true); // 把日志流存入ThreadLocal CucumberHooks.setRestAssuredLogWriter(logWriter); // 发送请求时添加LoggingFilter given() .filter(new LoggingFilter(LogDetail.ALL, logStream)) // 捕获所有日志细节 .when() .post(endpoint) .then() .extract() .response(); } }
4. 在Cucumber Hook中写入日志到报告
注意:如果要每个场景单独写入日志,用@After而非@AfterAll——@AfterAll是所有场景执行完后才触发,适合汇总所有日志;@After会在每个场景结束后执行,更贴合单场景日志需求。
public class CucumberHooks { // ... 前面的ThreadLocal定义和set方法 ... @After public void afterScenario(Scenario scenario) { StringWriter logWriter = restAssuredLogHolder.get(); if (logWriter != null && !logWriter.toString().isEmpty()) { // 写入日志到Cucumber报告 scenario.write("=== REST Assured Request/Response Log ==="); scenario.write(logWriter.toString()); // 清理ThreadLocal,避免内存泄漏 restAssuredLogHolder.remove(); } } }
可选:全局配置日志捕获
如果不想在每个请求中都添加filter,可以全局配置REST Assured的RequestSpecification,让所有请求自动捕获日志:
import io.restassured.builder.RequestSpecBuilder; import io.restassured.specification.RequestSpecification; import static io.restassured.RestAssured.requestSpecification; public class RestAssuredConfig { public static void setupGlobalLogCapture() { StringWriter logWriter = new StringWriter(); PrintStream logStream = new PrintStream(new WriterOutputStream(logWriter), true); CucumberHooks.setRestAssuredLogWriter(logWriter); RequestSpecification globalSpec = new RequestSpecBuilder() .setBaseUri("https://your-base-api-url.com") .addFilter(new LoggingFilter(LogDetail.ALL, logStream)) .build(); requestSpecification = globalSpec; } }
然后在Cucumber的@BeforeAll中调用这个初始化方法即可。
内容的提问来源于stack exchange,提问作者HudBud108
相关产品推荐
相关产品推荐

