关于同一父级中定义的@Nested
类的执行顺序,Junit5是否提供任何保证?在我做的一个简单的例子中,我注意到测试是按照声明的相反顺序执行的,但是这种行为既没有记录(或者是?),也与默认情况下对@Test
注释方法的排序方式不一致。
这也很烦人,因为显然,我宁愿使用非反向顺序,即使不是一种类似于@TestMethodOrder
的配置方式。
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
class NestedOrderTest {
@Nested
class NestedTest1 {
@Test
void testSuccess1() {
System.out.println(1);
}
}
@Nested
class NestedTest2 {
@Test
void testSuccess2() {
System.out.println(2);
}
}
@Nested
class NestedTest3 {
@Test
void testSuccess3() {
System.out.println(3);
}
}
}
输出:
3
2
1
答案 0 :(得分:2)
默认情况下,单元测试库不会尝试按照源文件中出现的顺序执行测试。
JUnit 5就像JUnit 4那样工作。为什么呢因为如果顺序很重要,则意味着它们之间耦合了一些测试,而这对于单元测试来说是不希望的(强调是我的):
2.9。测试执行命令
默认情况下,将使用以下算法对测试方法进行排序: 确定性的,但故意不明显的。这样可以确保 测试套件的后续运行在相同的位置执行测试方法 顺序,从而允许可重复的构建。
因此,可以预期JUnit 5引入的@Nested
功能将遵循相同的默认方法。
但是对于集成测试,测试方法的顺序可能很重要,因为不一定要在执行的测试方法之间清除状态。
因此,在JUnit 5中,通过用@TestMethodOrder(OrderAnnotation.class)
注释测试类并通过用@Order(numericOrderValue)
指定顺序重要的方法,可以设置执行顺序。
但是@Order
旨在装饰要测试的方法,而不是您想要的测试类本身:
@API(status = EXPERIMENTAL, since = "5.4")
@Target({ ElementType.FIELD, ElementType.METHOD })
public @interface Order {...}
您还可以注意到,这是一项实验功能。
因此,您可以在此订购的唯一东西是同一@Nested
范围内的测试方法,例如:
@Nested
class NestedTest1 {
@Order(3)
@Test
void success3() {
System.out.println(3);
}
@Order(2)
@Test
void success2() {
System.out.println(2);
}
@Order(1)
@Test
void success1() {
System.out.println(1);
}
}
输出:
1
2
3
顺便说一句,指定@TestMethodOrder(OrderAnnotation.class)
似乎不需要(至少在我测试的5.4.0版本中)。