根据测试输出打印Maven测试结果



我发现Maven对我的测试方法的输出重新排序是没有帮助的。有办法阻止它这样做吗?例如:

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
...
[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

实际:

mvn test
...
[INFO] Running DemoTest
This test fails
This test passes
[ERROR] Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.037 s <<< FAILURE! - in DemoTest
[ERROR] failDemo  Time elapsed: 0.029 s  <<< FAILURE!
java.lang.AssertionError
at DemoTest.failDemo(DemoTest.java:9)

正如您在上面看到的,Maven删除了所有断言错误的输出,将它们全部收集起来,然后在最后的总和之后输出它们。相反,我希望Maven不要这样做,而是将断言错误的输出与每个测试的输出一起保留。

在这个例子中,你混合了JUnit 4和JUnit Jupiter(又名JUnit 5)。

导入org.junit.Assert是JUnit 4的一部分,而其他导入是JUnit Jupiter(也就是JUnit 5)的一部分。

一般来说,单元测试不应该依赖于任何执行顺序,因为它们应该独立于顺序。

JUnit Jupiter(或者更准确地说是JUnit - Jupiter -engine)改变了顺序;在文档中有更多的细节。

如果确实有必要有一个特定的顺序,你可以使用Order注释。例如这样(从文档中复制):

@TestMethodOrder(OrderAnnotation.class)
class OrderedTestsDemo {
@Test
@Order(1)
void nullValues() {
// perform assertions against null values
}
@Test
@Order(2)
void emptyValues() {
// perform assertions against empty values
}
@Test
@Order(3)
void validValues() {
// perform assertions against valid values
}
}

我强烈建议不要在单元测试中使用顺序注释。有时候,在集成测试中使用顺序注释是很有用的。

所以最后Maven -surefire-plugin或Maven不会改变测试的执行顺序,它是由junit-jupiter-engine完成的,这是故意的。

相关内容

  • 没有找到相关文章

最新更新