Logo
Section 1 / 3

测试方法顺序

学习如何控制 JUnit 5 中测试方法的执行顺序。

导入

测试方法顺序

学习如何控制 JUnit 5 中测试方法的执行顺序。

在 JUnit 5 中,我们可以控制测试类和测试方法的执行顺序。

测试方法的执行顺序

测试类中的测试方法应相互独立,因此可以以任意顺序执行。然而,某些测试方法可能需要特定的执行顺序。我们可以使用 org.junit.jupiter.api.TestMethodOrder 注解来控制测试方法的执行顺序。@TestMethodOrder 使用 org.junit.jupiter.api.MethodOrderer 的实现类对测试方法进行排序。MethodOrderer 提供了四种内置实现。

MethodOrderer 的内置实现

实现类描述
MethodName根据方法名称按字母数字顺序排序。
DisplayName根据显示名称按字母数字顺序排序。
OrderAnnotation根据 @Order 注解的值进行排序。
Random随机排序测试方法。

在实际使用中,我们应使用 @Order 注解来控制方法的执行顺序。以下代码中,三个测试方法都添加了 @Order 注解,因此它们将严格按照注解指定的顺序执行。

1package io.educative.junit5; 2import org.junit.jupiter.api.ClassOrderer.OrderAnnotation; 3import org.junit.jupiter.api.Nested; 4import org.junit.jupiter.api.Order; 5import org.junit.jupiter.api.Test; 6import org.junit.jupiter.api.TestClassOrder; 7 8@TestClassOrder(OrderAnnotation.class) 9public class TestExecutionClassOrderTests { 10 @Nested 11 @Order(1) 12 class DatabaseTests { 13 @Test 14 void setup() { 15 } 16 } 17 @Nested 18 @Order(2) 19 class ApiTests { 20 @Test 21 void request() { 22 } 23 } 24}

自定义实现

为了设置默认的方法执行顺序,可以使用配置参数 junit.jupiter.testmethod.order.default,其值为 MethodOrderer 实现类的全限定类名。例如,org.junit.jupiter.api.MethodOrderer$OrderAnnotation 就是 OrderAnnotation 的类名。我们也可以创建自定义的 MethodOrderer 实现。下面的代码展示了一个根据方法名称长度进行排序的自定义 MethodOrderer 实现。

1package io.educative.junit5; 2import java.util.Comparator; 3import org.junit.jupiter.api.MethodOrderer; 4import org.junit.jupiter.api.MethodOrdererContext; 5 6public class NameLengthMethodOrderer implements MethodOrderer { 7 8 @Override 9 public void orderMethods(MethodOrdererContext context) { 10 context.getMethodDescriptors().sort(Comparator.comparingInt( 11 (descriptor) -> descriptor.getMethod().getName().length())); 12 } 13}

以下是一个使用该自定义 MethodOrderer 的示例代码:

1package io.educative.junit5; 2import java.util.Comparator; 3import org.junit.jupiter.api.MethodOrderer; 4import org.junit.jupiter.api.MethodOrdererContext; 5 6public class NameLengthMethodOrderer implements MethodOrderer { 7 8 @Override 9 public void orderMethods(MethodOrdererContext context) { 10 context.getMethodDescriptors().sort(Comparator.comparingInt( 11 (descriptor) -> descriptor.getMethod().getName().length())); 12 } 13}

JUnit 平台

测试类顺序