如何阻止Maven重排测试输出,使测试结果与输出顺序一致?
如何阻止Maven重排测试方法的输出?
Maven Surefire插件默认会缓冲测试的标准错误流(stderr),将所有测试的错误信息集中到测试汇总结果之后统一输出,导致错误日志和对应测试的打印内容分离,给排查问题带来不便。
比如你的测试代码:
import org.junit.jupiter.api.Test; import static org.junit.Assert.fail; class DemoTest { @Test void failDemo() { System.err.println("This test fails"); fail(); } @Test void passDemo() { System.err.println("This test passes"); } }
默认执行mvn test会把错误信息推到最后,而我们希望错误和对应测试的输出同步展示。
方法1:在pom.xml中配置Surefire插件
修改项目的pom.xml,添加Surefire插件的配置,关闭输出缓冲和错误汇总分离:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.5</version> <!-- 使用最新稳定版本 --> <configuration> <!-- 关闭测试输出重定向到文件,直接输出到控制台 --> <redirectTestOutputToFile>false</redirectTestOutputToFile> <!-- 实时转发测试的系统输出/错误流到控制台 --> <useSystemOut>true</useSystemOut> <useSystemErr>true</useSystemErr> <!-- 关闭汇总式错误输出,让错误随测试失败实时显示 --> <printSummary>false</printSummary> <!-- 禁用测试进程fork,避免子进程输出缓冲延迟 --> <forkCount>0</forkCount> </configuration> </plugin> </plugins> </build>
方法2:命令行临时配置
如果不想修改pom.xml,可以在执行测试时添加参数:
mvn test -Dmaven.surefire.redirectTestOutputToFile=false -Dmaven.surefire.printSummary=false -Dmaven.surefire.forkCount=0
配置完成后,执行mvn test就能得到你期望的输出:
mvn test ... [INFO] Running DemoTest This test fails java.lang.AssertionError at DemoTest.failDemo(DemoTest.java:9) [ERROR] failDemo Time elapsed: 0.029 s <<< FAILURE! This test passes [ERROR] Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.037 s <<< FAILURE! - in DemoTest
参数说明
redirectTestOutputToFile:默认true,会将测试输出写入临时文件,关闭后直接输出到控制台。useSystemOut/useSystemErr:确保插件将测试的stdout/stderr直接转发到Maven的控制台流。printSummary:默认true,会在所有测试结束后汇总展示错误,关闭后错误会在测试失败时立即输出。forkCount:默认可能大于0,fork子进程执行测试会导致输出缓冲,设为0可避免此问题。
内容的提问来源于stack exchange,提问作者k314159
相关产品推荐
相关产品推荐

