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

如何通过Maven命令控制Cucumber生成测试用例的执行?

如何通过Maven命令控制Cucumber生成测试用例的包含/排除

问题场景

我编写了如下JUnit测试类:

@Suite
@IncludeEngines("cucumber")
@SelectClasspathResource("/features")
@SelectClasspathResource("/generated")
class NightlyTest {

}

执行mvn test时会运行/features和/generated下所有Cucumber测试,但/generated下有数千个测试,耗时数小时。希望在流水线中通过Maven命令或环境变量控制是否包含这些生成的测试,比如实现类似mvn test -ExcludeGeneratedTests的效果。

尝试过添加@ExcludeTags("generated")排除标记为@generated的测试,但无法通过Maven命令控制开关;也试过用环境变量EXCLUDE_TAGS=generated结合@ExcludeTags("${EXCLUDE_TAGS}"),但未生效。


解决方案

方法1:通过Maven Profile+标签过滤(推荐)

先给所有/generated目录下的测试用例统一打上@generated标签,再通过Maven Profile控制是否排除这些标签:

  1. 在pom.xml中添加Profile配置:
<profiles>
    <profile>
        <id>ExcludeGeneratedTests</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <systemPropertyVariables>
                            <!-- 传递Cucumber过滤规则到系统变量 -->
                            <cucumber.filter.tags>not @generated</cucumber.filter.tags>
                        </systemPropertyVariables>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>
  1. 保持测试类不变(无需硬编码@ExcludeTags):
@Suite
@IncludeEngines("cucumber")
@SelectClasspathResource("/features")
@SelectClasspathResource("/generated")
class NightlyTest {

}
  1. 执行命令:
  • 默认执行所有测试(包含生成用例):
mvn test
  • 排除生成用例:
mvn test -PExcludeGeneratedTests

方法2:动态控制扫描目录

如果不想用标签,直接控制是否扫描/generated目录,可通过Maven属性动态修改测试类的资源选择:

  1. 修改测试类,用Maven属性控制是否加载/generated目录:
@Suite
@IncludeEngines("cucumber")
@SelectClasspathResource("/features")
<!-- 默认加载/generated,可通过Maven参数覆盖为空 -->
@SelectClasspathResource("${cucumber.generated.resource:/generated}")
class NightlyTest {

}
  1. 执行命令:
  • 默认执行所有测试:
mvn test
  • 排除生成用例,将参数设为空:
mvn test -Dcucumber.generated.resource=

方法3:拆分测试类+Profile选择

创建两个测试类,分别对应全量测试和核心测试,通过Profile指定要执行的测试类:

  1. 创建全量测试类:
@Suite
@IncludeEngines("cucumber")
@SelectClasspathResource("/features")
@SelectClasspathResource("/generated")
class NightlyFullTest {

}
  1. 创建核心测试类:
@Suite
@IncludeEngines("cucumber")
@SelectClasspathResource("/features")
class NightlyCoreTest {

}
  1. 在pom.xml中配置Profile:
<profiles>
    <profile>
        <id>Default</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <includes>
                            <include>**/NightlyFullTest.java</include>
                        </includes>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
    <profile>
        <id>ExcludeGeneratedTests</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <includes>
                            <include>**/NightlyCoreTest.java</include>
                        </includes>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>
  1. 执行命令:
  • 默认执行全量测试:
mvn test
  • 执行核心测试(排除生成用例):
mvn test -PExcludeGeneratedTests

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:02:52