在 Junit 测试中将 RestAssured 日志记录到 Log4J

soh*_*ail 3 logging log4j rest-assured

我们正在使用 REST Assured 来测试一些 REST 服务。我们需要将请求和响应日志记录重定向到 Log4j 日志。我们有以下代码来尝试测试日志重定向:

public class RestTest {
    private static RequestSpecification spec;
    private static Logger logger = LogManager.getLogger(RestTest.class);
    @Rule
    public TestWatcher watcher = new Log4JWatcher();

    @BeforeClass
    public static void initSpec(){
    PrintStream logStream = IoBuilder.forLogger(logger).buildPrintStream();
    RestAssuredConfig restAssuredConfig = new RestAssuredConfig();
    LogConfig logConfig = restAssuredConfig.getLogConfig(); 
    logConfig
        .defaultStream(logStream)
        .enablePrettyPrinting(true);

    spec = new RequestSpecBuilder()
        .setContentType(ContentType.JSON)
            .setBaseUri("http://jsonplaceholder.typicode.com/")
            .addFilter(new ResponseLoggingFilter())
            .addFilter(new RequestLoggingFilter())
            .setConfig(restAssuredConfig)
            .build();
    
}

@Test
public void useSpec(){
    given()
        .spec(spec)
        .param("limit", 20)
        .when()
        .get("posts")
        .then()
        .statusCode(200);
    }
}
Run Code Online (Sandbox Code Playgroud)

我们将以下日志输出到 log4j 文件中:

09:47:17.264 [main] INFO  test.util.Log4JWatcher - useSpec(test.ExtentReportSandbox.RestTest)
09:49:45.485 [main] INFO  test.util.Log4JWatcher - useSpec(test.ExtentReportSandbox.RestTest)
Run Code Online (Sandbox Code Playgroud)

在 system.out 上,我们看到请求和响应的 REST Assured 输出。该输出不会重定向到 Log4j 文件。我们如何将控制台输出重定向到 Log4j 文件?

soh*_*ail 6

通过更改以下内容解决了该问题:

        new RequestLoggingFilter();
    new ResponseLoggingFilter();
    spec = new RequestSpecBuilder()
            .setContentType(ContentType.JSON)
            .setBaseUri("http://jsonplaceholder.typicode.com/")
            .addFilter(ResponseLoggingFilter.logResponseTo(logStream))
            .addFilter(RequestLoggingFilter.logRequestTo(logStream))
            .setConfig(restAssuredConfig)
            .build();
Run Code Online (Sandbox Code Playgroud)

现在它按照我们的预期将输出发送到 Log4j 文件。关键是添加“logResponseTo”和“logRequestTo”过滤器。