【问题标题】:JUnit5: Specify order of execution of multiple @Nested classesJUnit5:指定多个@Nested 类的执行顺序
【发布时间】:2019-09-02 21:10:40
【问题描述】:

Junit5 是否对同一父级中定义的@Nested 类的执行顺序提供任何保证?通过我做的一个简单的例子,我注意到测试是以声明的相反顺序执行的,但是这种行为既没有记录(或者是它?)也不与@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

【问题讨论】:

  • 关心测试执行的顺序是测试之间依赖关系的标志,这意味着后续测试(有意或无意)使用由早期测试更改的状态。如果可能的话,你应该避免这种情况。
  • @AndyTurner 该死的,我忘记了通常的免责声明 :)

标签: java junit junit5


【解决方案1】:

默认情况下,单元测试库不会尝试按照源文件中出现的顺序执行测试。
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版本中)。

【讨论】:

  • 用户指南中关于测试执行顺序的引用片段正是我问这个问题的原因 - 我知道测试方法有某种强制重新排序,但我自己的观察并不能证明同样适用到嵌套元素。所以我是否假设我很幸运地执行了我的执行顺序,或者代码中是否有某些东西实际上导致了顺序是什么 - 颠倒的声明顺序。
  • 所有这些答案说明这样做是否是一个好主意,以及如何指定方法的顺序,而不是嵌套类。这没有回答问题。
【解决方案2】:

Junit 5.8 中添加了@Nested 类排序功能。在这一点上,平台提供了用户可能需要的所有保证。

import org.junit.jupiter.api.ClassOrderer;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestClassOrder;

@TestClassOrder(ClassOrderer.OrderAnnotation.class)
class OrderedNestedTestClassesDemo {

    @Nested
    @Order(1)
    class PrimaryTests {

        @Test
        void test1() {
        }
    }

    @Nested
    @Order(2)
    class SecondaryTests {

        @Test
        void test2() {
        }
    }
}

【讨论】:

  • 我得到 import org.junit.jupiter.api.ClassOrderer;无法解决。
  • @AndrewS 您显然没有在您的项目中包含正确的 jar:'org.junit.jupiter:junit-jupiter-api:5.8.1
  • Jock,这不是很明显,但确实是这样。看来这个功能是最近才推出的,所以如果你没有 5.8.1,或者你的 IDE 没有为你提供这个,你必须弄清楚如何让它导入正确的版本。尤其是在不使用最新的 Java 版本时。
猜你喜欢
  • 1970-01-01
  • 2021-10-14
  • 2017-04-01
  • 2011-08-08
  • 2020-06-22
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
相关资源
最近更新 更多