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

如何在Serenity BDD(Cucumber)中按标签优先级执行测试用例

解决方案:JUnit5 + Serenity BDD 按标签优先级执行测试用例

核心思路

通过自定义JUnit5的MethodOrderer实现类,扫描测试方法的@Tag注解值来分配执行优先级,让@logApplication标签的用例优先执行,完成后再执行@processApplication标签的用例。

步骤1:自定义标签排序器

创建一个实现MethodOrderer接口的类,根据标签类型为测试方法分配优先级:

import org.junit.jupiter.api.MethodDescriptor;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.MethodOrdererContext;
import org.junit.jupiter.api.Tag;

import java.util.Comparator;

public class TagPriorityOrderer implements MethodOrderer {

    @Override
    public void orderMethods(MethodOrdererContext context) {
        // 按优先级排序:logApplication > processApplication > 其他标签/无标签用例
        context.getMethodDescriptors().sort(Comparator.comparingInt(this::getTagPriority));
    }

    private int getTagPriority(MethodDescriptor methodDescriptor) {
        // 检查方法是否包含目标标签
        boolean isLogAppCase = methodDescriptor.getAnnotations().stream()
                .anyMatch(anno -> anno.annotationType() == Tag.class && ((Tag) anno).value().equals("logApplication"));
        boolean isProcessAppCase = methodDescriptor.getAnnotations().stream()
                .anyMatch(anno -> anno.annotationType() == Tag.class && ((Tag) anno).value().equals("processApplication"));

        // 数值越小,执行优先级越高
        if (isLogAppCase) {
            return 0;
        } else if (isProcessAppCase) {
            return 1;
        } else {
            return 2;
        }
    }
}

步骤2:应用排序规则

有两种方式可以让测试用例使用这个排序逻辑:

方式1:单个测试类生效

直接在目标测试类上添加@TestMethodOrder注解,指定自定义排序器:

import org.junit.jupiter.api.TestMethodOrder;

@TestMethodOrder(TagPriorityOrderer.class)
public class BankAccountCreationTests {

    @Tag("logApplication")
    @Test
    void submitValidApplication() {
        // 测试逻辑
    }

    @Tag("processApplication")
    @Test
    void processApprovedApplication() {
        // 测试逻辑
    }
}

方式2:全局所有测试类生效

在src/test/resources目录下创建junit-platform.properties文件,添加以下配置,让所有JUnit5测试默认使用该排序器:

junit.jupiter.testmethod.order.default=com.your.package.TagPriorityOrderer

注意事项

  • 标签名称需完全匹配(区分大小写),比如@Tag("logApplication")和排序器中的字符串要一致。
  • Serenity BDD与JUnit5完全兼容,该逻辑可正常作用于Serenity管理的所有测试用例(包括Cucumber场景)。
  • 若存在其他标签或无标签的用例,会被排在最后执行,可根据需求调整优先级数值。

内容的提问来源于stack exchange,提问作者Saimohit Midde

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 11:00:11