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

Serenity BDD:按环境筛选测试标签的配置问题

Serenity多环境下实现Cucumber标签逻辑过滤

问题场景

需要按环境执行不同标签的测试:

  • develop环境:仅运行带@Something标签的用例
  • develop.another环境:运行带@Something 或 @Another标签的用例

遇到的限制:

  • Serenity的serenity.conf中tags配置不支持or这类逻辑表达式
  • Jenkins限制无法使用命令行参数-Dtags或-Dcucumber.filter.tags
  • 直接在配置里写cucumber.filter.tags会被Serenity忽略

解决方法

方案一:自定义标签过滤器(推荐)

通过扩展Serenity的标签过滤逻辑,读取环境配置生成逻辑表达式:

  1. 修改serenity.conf,配置标签数组
    把每个环境的标签改成数组格式,方便后续拼接逻辑:
develop {
  test.tags = ["@Something"]
}

develop.another {
  test.tags = ["@Something", "@Another"]
}
  1. 编写自定义标签过滤器类
    这个类会读取当前环境的标签数组,自动生成or逻辑的过滤规则:
import io.cucumber.core.filter.TagPredicate;
import net.serenitybdd.core.environment.EnvironmentSpecificConfiguration;
import net.thucydides.core.util.EnvironmentVariables;
import java.util.List;
import java.util.stream.Collectors;

public class EnvTagFilter {
    public static TagPredicate getTagPredicate(EnvironmentVariables envVars) {
        // 读取当前环境的标签列表
        List<String> tagList = EnvironmentSpecificConfiguration.from(envVars)
                .getList("test.tags");
        
        // 把数组拼接成"@A or @B"格式的表达式
        String tagExpr = tagList.stream().collect(Collectors.joining(" or "));
        
        return new TagPredicate(tagExpr);
    }
}
  1. 配置Serenity使用自定义过滤器
    在serenity.conf中指定自定义过滤器的全类名:
cucumber {
  filter {
    tags = "com.your.package.EnvTagFilter"
  }
}
  1. 执行测试
    按原有命令执行,就能自动按环境过滤标签:
# 仅运行@Something标签的用例
mvn clean verify -Denvironment=develop

# 运行@Something或@Another标签的用例
mvn clean verify -Denvironment=develop.another

方案二:手动传递系统属性

如果不想写自定义类,可以通过初始化类把配置的标签表达式传递给Cucumber:

  1. 在serenity.conf中直接配置逻辑表达式
develop {
  cucumber.filter.tags = "@Something"
}

develop.another {
  cucumber.filter.tags = "@Something or @Another"
}
  1. 编写测试初始化类
    在Cucumber启动前,把配置里的标签表达式设置成系统属性:
import net.serenitybdd.core.environment.EnvironmentSpecificConfiguration;
import net.thucydides.core.util.EnvironmentVariables;
import net.thucydides.core.util.SystemEnvironmentVariables;

public class TestBootstrap {
    static {
        EnvironmentVariables envVars = SystemEnvironmentVariables.createEnvironmentVariables();
        String tagFilter = EnvironmentSpecificConfiguration.from(envVars)
                .getProperty("cucumber.filter.tags");
        
        if (tagFilter != null) {
            System.setProperty("cucumber.filter.tags", tagFilter);
        }
    }
}

将这个类加到测试套件的启动类中,确保在Cucumber初始化前执行。


内容的提问来源于stack exchange,提问作者Riberto Junior

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 00:44:58