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

Java JUnit5:指定多个@Nested类的执行顺序,java,junit,junit5,Java,Junit,Junit5,Junit5是否对在同一父级中定义的嵌套类的执行顺序提供任何保证?我举了一个简单的例子,注意到测试是按照声明的相反顺序执行的,但是这种行为既没有被记录(或者是吗?),也不符合默认情况下@Test注释方法的顺序 这也很烦人,因为很明显,如果不是类似于@TestMethodOrder的配置方式,我宁愿使用非反向顺序 import org.junit.jupiter.api.Nested; 导入org.junit.jupiter.api.Test; 类嵌套排序{ @嵌套 类嵌套测试1{ @试验 voi

Junit5是否对在同一父级中定义的嵌套类的执行顺序提供任何保证?我举了一个简单的例子,注意到测试是按照声明的相反顺序执行的,但是这种行为既没有被记录(或者是吗?),也不符合默认情况下
@Test
注释方法的顺序

这也很烦人,因为很明显,如果不是类似于
@TestMethodOrder
的配置方式,我宁愿使用非反向顺序

import org.junit.jupiter.api.Nested;
导入org.junit.jupiter.api.Test;
类嵌套排序{
@嵌套
类嵌套测试1{
@试验
void testSuccess1(){
系统输出打印项次(1);
}
}
@嵌套
类嵌套测试2{
@试验
void testSuccess2(){
系统输出打印ln(2);
}
}
@嵌套
类嵌套测试3{
@试验
void testSuccess3(){
系统输出打印Ln(3);
}
}
}
产出:

3
2
1

默认情况下,单元测试库不会尝试按照源文件中出现的顺序执行测试。
JUnit5和JUnit4都是这样工作的。为什么?因为如果顺序很重要,这意味着一些测试在它们之间耦合,这对于单元测试来说是不可取的(我的重点是):

2.9。测试执行顺序

默认情况下,测试方法将使用 确定性但故意不明显。这确保 测试套件的后续运行以相同的方式执行测试方法 顺序,从而允许重复构建

因此,JUnit5引入的
@Nested
特性应该遵循相同的默认方法

但是对于集成测试,测试方法的顺序可能很重要,因为在执行的测试方法之间不一定会清除状态。
因此,在JUnit5中,您同样可以通过注释测试类并通过使用
@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);
    }
}
输出:

一,

二,

三,


顺便说一句,指定
@TestMethodOrder(OrderAnnotation.class)
似乎不是必需的(至少在我测试的5.4.0版本中是如此)。

关心测试执行的顺序是测试之间依赖性的标志,这意味着后续测试(有意或无意)使用早期测试更改的状态。如果可能的话,你应该避免这种情况。@AndyTurner该死,我忘记了通常的免责声明:)引用的关于测试执行顺序的用户指南片段正是我问这个问题的原因-我知道测试方法有某种强制的重新排序,但我自己的观察并不能证明这同样适用于嵌套元素。那么,我是否假设我在执行顺序方面很幸运,或者代码中是否有某种东西导致了顺序是相反的声明顺序。所有这些答案都说明了这样做是否是一个好主意,以及如何指定方法的顺序,而不是嵌套类。这并不能回答问题。