JUnit 5执行指定Cucumber Feature时重复运行问题求助
JUnit 5 + Cucumber 指定单个Feature执行时重复运行全部Feature的排查建议
问题场景
使用JUnit 5的@Suite方式运行Cucumber时,执行全部Feature文件正常,Runner类代码如下:
@Suite @IncludeEngines("cucumber") @ConfigurationParameter(key = Constants.FEATURES_PROPERTY_NAME, value = "src/main/features") @ConfigurationParameter(key = Constants.GLUE_PROPERTY_NAME, value = "com/nedap/healthcare/administration/cucumber/glue") @ConfigurationParameter(key = Constants.PLUGIN_PROPERTY_NAME, value = "pretty, html:target/cucumber.html") @ConfigurationParameter(key = Constants.JUNIT_PLATFORM_NAMING_STRATEGY_PROPERTY_NAME, value = "long") public class CucumberRunner { }
但通过Maven命令指定单个Feature执行时:
mvn compile test -Dcucumber.features=.../some.feature
会出现单个Feature执行完成后,自动运行全部Feature文件的问题。从钩子日志可看出重复执行的流程:
BeforeAll Before After Before After AfterAll [INFO] Running com.nedap.healthcare.administration.cucumber.CucumberRunner BeforeAll
因BeforeAll不支持重入引发异常,且首次BeforeAll执行前无JUnit的运行日志,推测@Suite注解未正常生效。
排查步骤
- 检查Maven Surefire插件配置
确认Surefire插件是否同时触发了Cucumber引擎和JUnit Suite的执行。比如是否在pom.xml中配置了<includes>包含CucumberRunner类,同时又通过cucumber.features参数触发了Cucumber的独立执行,导致两次运行。可尝试在Surefire配置中排除CucumberRunner类,或仅通过参数控制执行范围。 - 验证
cucumber.features参数优先级
JUnit 5 Suite中配置的Constants.FEATURES_PROPERTY_NAME和命令行的-Dcucumber.features参数可能存在优先级冲突。检查Cucumber版本是否存在参数覆盖bug,尝试升级到最新稳定版的cucumber-junit-platform-engine依赖。 - 排查多测试入口问题
确认项目中是否有其他Cucumber Runner类(比如旧的JUnit 4风格@RunWith(Cucumber.class)类),或Surefire插件是否默认扫描了所有测试类,导致同时执行指定Feature和Suite类。 - 添加JUnit平台日志排查执行流程
在Maven命令中添加-Dorg.slf4j.simpleLogger.defaultLogLevel=debug或-Djunit.platform.reporting.output.dir=target/junit-report,查看JUnit平台的执行日志,确认两次执行的触发来源,是Suite类被重复执行,还是Cucumber引擎被多次启动。 - 给Runner类添加条件执行逻辑
在CucumberRunner类中添加条件判断,仅当未指定cucumber.features参数时才启用全部Feature的配置,示例:@Suite @IncludeEngines("cucumber") @ConfigurationParameter(key = Constants.FEATURES_PROPERTY_NAME, value = "src/main/features") // 仅当未指定cucumber.features时执行该Suite @EnabledIfSystemProperty(named = "cucumber.features", matches = "^$", disabledReason = "已指定cucumber.features参数,跳过Suite执行") public class CucumberRunner { } - 直接通过Cucumber引擎执行
暂时绕过@Suite注解,直接用Maven命令指定Cucumber参数执行单个Feature,示例:
验证是否还会出现重复执行问题,以此判断是否是mvn compile test -Dcucumber.glue=com/nedap/healthcare/administration/cucumber/glue -Dcucumber.features=.../some.feature -Dcucumber.plugin=pretty,html:target/cucumber.html@Suite与命令行参数的兼容性问题。
内容的提问来源于stack exchange,提问作者tbeernot
相关产品推荐
相关产品推荐

