一般的做法是,自动化测验应该能够独立运转,没有特定的次序,以及测验的结果不应该依赖于曾经的测验结果。但在有些情况下,测验履行的特定次序是合理的,特别是在集成或端到端的测验中。

默许情况下,在JUnit 5中,测验办法的履行在构建之间是可重复的,因此是确定性的,但该算法是故意不显眼的(正如库的作者所说)。走运的是,履行次序能够依据咱们的需求运用内置的办法排序器或创建自定义的办法排序器来调整。

org.junit.jupiter.api.TestMethodOrder

为了改动测验履行次序,咱们需求用org.junit.jupiter.api.TestMethodOrder 注释测验类,并将办法排序器的类型作为一个参数传递。从JUnit 5.4开端,有三个内置的办法次序器。OrderAnnotation,AlphanumericRandom 。咱们也能够经过完成org.junit.jupiter.api.MethodOrderer 接口轻松创建咱们自己的自定义办法订购器。

运用@Order 注释进行排序

package pl.codeleak.samples.junit5.basics;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class TestExecutionOrderWithOrderAnnotation {
    @Order(1)
    @Test
    void aTest() {}
    @Order(2)
    @Test
    void bTest() {}
    @Order(3)
    @Test
    void cTest() {}
}

字母数字排序

@TestMethodOrder(MethodOrderer.Alphanumeric.class)
class AlphanumericTestExecutionOrder {
    @Test
    void aTest() {}
    @Test
    void bTest() {}
    @Test
    void cTest() {}
}

随机排序

如果想确保办法的履行次序在构建过程中不是确定的,那么随机排序就很有用:

@TestMethodOrder(MethodOrderer.Random.class)
class AlphanumericTestExecutionOrder {
    @Test
    void aTest() {}
    @Test
    void bTest() {}
    @Test
    void cTest() {}
}

随机办法排序器运用System.nanoTime() 作为种子,但它能够经过junit.jupiter.execution.order.random.seed 装备特点来改动。这个特点的值应该返回任何能够运用Long.valueOf(String) 转换的String

装备种子的一种办法是在junit-platform.properties 装备文件中提供装备特点:

junit.jupiter.execution.order.random.seed=42

自定义排序

创建一个自定义办法排序器能够经过完成org.junit.jupiter.api.MethodOrderer 接口并将其作为参数提供给@TestMethodOrder

下面的例子是一个办法排序器,它依据办法的名称长度进行排序:

class MethodLengthOrderer implements MethodOrderer {
    private Comparator<MethodDescriptor> comparator =
            Comparator.comparingInt(methodDescriptor -> methodDescriptor.getMethod().getName().length());
    @Override
    public void orderMethods(MethodOrdererContext context) {
        context.getMethodDescriptors().sort(comparator);
    }
}

以及用处:

@TestMethodOrder(MethodLengthOrderer.class)
class CustomTestExecutionOrder {
    @Test
    void aTest() {}
    @Test
    void abTest() {}
    @Test
    void abcTest() {}
}

总结

在JUnit 5中,有一种调整测验履行次序的办法在某些情况下很有用,我很快乐看到这个功用。我相信在大多数情况下,内置的办法排序器已经足够了。如果不是,有一个简略的办法来完成一个自定义的。

GitHub上能够找到本文中运用的例子(还有很多):https://github.com/kolorobot/junit5-samples/tree/master/junit5-basics

另见

  • JUnit 5测验中的临时目录
  • 用JUnit 5进行更干净的参数化测验
  • JUnit 5遇到AssertJ