You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:21:29