JUnit5:如何控制含@IncludeTags的@Suite中测试的执行顺序
控制JUnit 5带Tag的测试套件执行顺序
要指定测试类的执行顺序,尤其是让某个Tag的测试最后执行,有两种实用方案:
方案1:给测试类标记执行顺序
这种方式适合单个类精准控制顺序:
- 给测试类添加
@Order注解,指定顺序数值(数值越小越先执行):
@Tag("Tag1") @Order(1) public class RunThisFirst { } @Tag("Tag2") @Order(2) public class RunThisLast { }
- 在测试套件类上添加
@ClassOrder(ClassOrderer.OrderAnnotation.class),启用基于@Order的类排序:
@Suite @SelectPackages("com.tests") @IncludeTags({ "Tag1", "Tag2", }) @ClassOrder(ClassOrderer.OrderAnnotation.class) public class TestSuite { }
方案2:自定义Tag驱动的排序器
如果需要批量将某个Tag的所有测试类放到最后执行,不用逐个标记@Order,可以自定义类排序器:
- 实现
ClassOrderer接口,按Tag分组排序:
import org.junit.jupiter.api.ClassDescriptor; import org.junit.jupiter.api.ClassOrderer; import org.junit.jupiter.api.ClassOrdererContext; import java.util.ArrayList; import java.util.List; public class TagBasedClassOrderer implements ClassOrderer { @Override public void orderClasses(ClassOrdererContext context) { List<ClassDescriptor> classDescriptors = context.getClassDescriptors(); List<ClassDescriptor> tag2Classes = new ArrayList<>(); List<ClassDescriptor> otherClasses = new ArrayList<>(); // 按Tag拆分测试类 for (ClassDescriptor descriptor : classDescriptors) { if (descriptor.getTags().contains("Tag2")) { tag2Classes.add(descriptor); } else { otherClasses.add(descriptor); } } // 合并顺序:非Tag2类在前,Tag2类在后 otherClasses.addAll(tag2Classes); context.getClassDescriptors().clear(); context.getClassDescriptors().addAll(otherClasses); } }
- 在测试套件中指定使用这个自定义排序器:
@Suite @SelectPackages("com.tests") @IncludeTags({ "Tag1", "Tag2", }) @ClassOrder(TagBasedClassOrderer.class) public class TestSuite { }
注意事项
@ClassOrder注解需要JUnit 5.8及以上版本支持,请确保依赖版本符合要求。- 默认情况下JUnit 5会随机执行测试类,必须显式指定排序策略才能控制顺序。
内容的提问来源于stack exchange,提问作者bpd00
相关产品推荐
相关产品推荐

