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的标签过滤逻辑,读取环境配置生成逻辑表达式:
- 修改serenity.conf,配置标签数组
把每个环境的标签改成数组格式,方便后续拼接逻辑:
develop { test.tags = ["@Something"] } develop.another { test.tags = ["@Something", "@Another"] }
- 编写自定义标签过滤器类
这个类会读取当前环境的标签数组,自动生成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); } }
- 配置Serenity使用自定义过滤器
在serenity.conf中指定自定义过滤器的全类名:
cucumber { filter { tags = "com.your.package.EnvTagFilter" } }
- 执行测试
按原有命令执行,就能自动按环境过滤标签:
# 仅运行@Something标签的用例 mvn clean verify -Denvironment=develop # 运行@Something或@Another标签的用例 mvn clean verify -Denvironment=develop.another
方案二:手动传递系统属性
如果不想写自定义类,可以通过初始化类把配置的标签表达式传递给Cucumber:
- 在serenity.conf中直接配置逻辑表达式
develop { cucumber.filter.tags = "@Something" } develop.another { cucumber.filter.tags = "@Something or @Another" }
- 编写测试初始化类
在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
相关产品推荐
相关产品推荐

