Java Cucumber项目中如何通过正则匹配标签筛选执行场景
Java Cucumber项目中如何通过正则匹配标签筛选执行场景
你说得对,Cucumber原生的tags参数确实不支持直接写正则表达式来匹配标签前缀,我之前也遇到过类似的需求,给你分享几个靠谱的解决办法:
方案一:编程式配置Cucumber运行器,自定义标签过滤逻辑
这是我最推荐的方案,完全不需要修改现有feature文件,直接通过代码实现正则匹配标签的逻辑:
- 先写一个自定义的
TagPredicate实现,里面用正则判断场景的标签是否符合@BUG-.*的规则:
import io.cucumber.core.gherkin.TagPredicate; import java.util.regex.Pattern; public class BugTagPredicate implements TagPredicate { // 这里的正则可以根据你的实际需求调整,比如要匹配所有@BUG开头的标签就用@BUG.* private static final Pattern BUG_TAG_PATTERN = Pattern.compile("@BUG-\\d+"); @Override public boolean test(Iterable<String> tags) { for (String tag : tags) { if (BUG_TAG_PATTERN.matcher(tag).matches()) { return true; } } return false; } }
- 然后用编程方式启动Cucumber,把这个自定义的过滤器传进去:
import io.cucumber.core.runtime.RuntimeOptions; import io.cucumber.core.runtime.RuntimeOptionsBuilder; import io.cucumber.core.cli.Main; public class CucumberCustomRunner { public static void main(String[] args) { RuntimeOptions runtimeOptions = new RuntimeOptionsBuilder() .addGlue("com.stepdefs") // 你的步骤定义包路径 .addFeature("src/test/resources/part1") // 你的feature文件路径 .setTagPredicate(new BugTagPredicate()) .build(); Main.run(runtimeOptions.buildArgs(), Thread.currentThread().getContextClassLoader()); } }
以后直接运行这个CucumberCustomRunner类,就会自动筛选所有带有@BUG-前缀标签的场景了。
方案二:给目标标签统一关联公共标签(变通方案)
如果不想折腾编程式运行,也可以用个简单的变通办法:
- 给所有带有
@BUG-*标签的场景,统一加上一个公共标签比如@BUG-ALL,比如:@TESTID-001 @MY @BUG-002 @BUG-ALL
Scenario: Just a fake case
... - 然后在
@CucumberOptions里直接用tags = "@BUG-ALL",就能执行所有关联的场景了。 - 要是现有场景太多,手动加标签太麻烦,可以用文本编辑器的正则替换功能,批量给所有带
@BUG-的场景加上@BUG-ALL标签。
关于你提到的“自定义标签转正则”的问题
你问能不能加个@BUG-FINDALL标签,让Cucumber自动转成正则匹配——其实可以通过方案一的自定义TagPredicate来实现类似效果:比如在Predicate里同时判断,如果场景带有@BUG-FINDALL标签,或者带有@BUG-*的标签,就符合筛选条件。不过一般来说,直接用方案一的正则匹配逻辑就足够灵活了,不需要额外加标签。
内容来源于stack exchange
相关产品推荐
相关产品推荐

