我发现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完成的,这是故意的。