JUnit5:指定多个@Nested类的执行顺序

时间:2019-09-02 21:10:40

标签: java junit junit5

关于同一父级中定义的@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

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版本中)。