如何在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
相关产品推荐
相关产品推荐

