如何为JUnit 5中带@Tag注解的测试指定执行顺序?
指定JUnit带Tag测试的执行顺序
问题场景
我有多个测试类,每个类包含若干测试用例,示例代码如下:
public class testpage1(){ // 注意:类定义后无需括号,此处为笔误 @test // 注意:应为@Test,小写无法被JUnit识别 @Tag("Regression") void test1(){ system.out.println("Test1"); // 注意:应为System.out,Java类名首字母需大写 } void test2(){ system.out.println("Test2"); } } public class testpage2(){ @test @Tag("Regression") void test3(){ system.out.println("Test3"); } void test4(){ system.out.println("Test4"); } } public class testpage3(){ @test @Tag("Regression") void test5(){ system.out.println("Test5"); } void test6(){ system.out.println("Test6"); } }
我通过以下运行类执行带@Tag("Regression")注解的测试:
@RunWith(value = JunitPlatform.class) @IncludeTags(value = {"Regression"})
但运行时测试无固定执行顺序,需要指定自定义的执行顺序。
解决方案
JUnit 5(JunitPlatform对应JUnit 5运行器)默认随机执行测试类和测试方法,要固定顺序需分别配置类执行顺序和方法执行顺序:
1. 修正测试类语法错误
先修复原代码中的编译问题:
- 移除类定义后的多余括号(如
testpage1()改为testpage1) - 小写
@test替换为JUnit 5标准注解@Test(需导入org.junit.jupiter.api.Test) system.out改为System.out(Java类名首字母必须大写)
2. 控制测试类的执行顺序
在运行类上添加@TestClassOrder注解,指定类的排序规则:
import org.junit.platform.runner.JUnitPlatform; import org.junit.runner.RunWith; import org.junit.jupiter.api.TestClassOrder; import org.junit.jupiter.api.ClassOrderer; @RunWith(JUnitPlatform.class) @IncludeTags({"Regression"}) // 按类名字典序执行测试类,顺序为testpage1 → testpage2 → testpage3 @TestClassOrder(ClassOrderer.ClassName.class) public class RegressionTestRunner { }
如果需要完全自定义类的执行顺序,可实现ClassOrderer接口:
public class CustomClassOrderer implements ClassOrderer { @Override public void orderClasses(ClassOrdererContext context) { // 自定义排序逻辑,比如指定testpage2先执行,再testpage1,最后testpage3 context.getClassDescriptors().sort((c1, c2) -> { if (c1.getTestClass().getSimpleName().equals("testpage2")) return -1; if (c1.getTestClass().getSimpleName().equals("testpage1")) return 0; return 1; }); } }
然后在运行类中指定自定义排序器:
@TestClassOrder(CustomClassOrderer.class)
3. 控制测试方法的执行顺序
在每个测试类上添加@TestMethodOrder注解,配合对应的排序规则:
方式一:用@Order注解指定方法顺序
import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; import org.junit.jupiter.api.Tag; @TestMethodOrder(OrderAnnotation.class) public class testpage1 { @Test @Tag("Regression") @Order(1) // 指定该方法第一个执行 void test1(){ System.out.println("Test1"); } void test2(){ System.out.println("Test2"); } }
同理给testpage2的test3加@Order(2),testpage3的test5加@Order(3),即可按test1→test3→test5的顺序执行。
方式二:按方法名字典序排序
如果方法命名有规律(如test1、test2),可直接按方法名排序:
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; import org.junit.jupiter.api.MethodOrderer.MethodName; import org.junit.jupiter.api.Tag; @TestMethodOrder(MethodName.class) public class testpage1 { @Test @Tag("Regression") void test1(){ System.out.println("Test1"); } void test2(){ System.out.println("Test2"); } }
内容的提问来源于stack exchange,提问作者omerkenig
相关产品推荐
相关产品推荐

