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

DevOps流水线中Gradle@3任务执行Cucumber测试失败求助

DevOps流水线中Gradle@3任务执行Cucumber测试报NoTestsDiscoveredException的排查方案

问题概述

本地执行命令./gradlew clean build test -PincludeTags="LoginFeature" --info可正常跑通Cucumber特性文件,但在DevOps流水线中使用Gradle@3任务时,出现如下错误:

CucumberTestRunner > initializationError FAILED
    org.junit.platform.suite.engine.NoTestsDiscoveredException: Suite [com.app.x.CucumberTestRunner] did not discover any tests
        at java.base@17.0.7/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
        at java.base@17.0.7/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
        at java.base@17.0.7/java.util.Iterator.forEachRemaining(Iterator.java:133)

改用script任务执行相同命令则可正常运行:

- script: |
    chmod +x gradlew
    ./gradlew clean build test -PincludeTags="LoginFeature" --info

特性文件路径为src/test/resources/com/app/x/features,已配置CucumberTestRunner和Gradle相关设置,尝试添加com.gradle.cucumber.companion插件未解决问题。

可能的原因

  1. Gradle@3任务的工作目录或参数传递异常:流水线的Gradle@3任务可能默认工作目录非项目根目录,或参数传递时引号被转义,导致includeTags参数未被正确识别,Cucumber无法筛选到对应标签的测试用例。
  2. Gradle版本或环境不一致:Gradle@3任务可能使用了流水线自带的Gradle版本,而非项目的Gradle wrapper,和本地环境版本差异导致测试引擎兼容性问题。
  3. 测试扫描范围或配置差异:Gradle@3任务的测试执行逻辑可能默认限制了测试类扫描范围,或未正确启用Cucumber的JUnit平台支持,导致无法发现测试用例。

解决方案

1. 修正Gradle@3任务的参数与工作目录配置

确保任务工作目录指向项目根目录,并正确传递参数(注意去掉引号,避免YAML转义问题):

- task: Gradle@3
  inputs:
    workingDirectory: '' # 留空默认使用项目根目录,或明确指定为'$(System.DefaultWorkingDirectory)'
    gradleWrapperFile: 'gradlew' # 强制使用项目的Gradle wrapper
    tasks: 'clean build test'
    arguments: '-PincludeTags=LoginFeature --info'

2. 验证CucumberTestRunner的参数读取逻辑

确保Runner类正确读取includeTags系统属性,示例配置:

import io.cucumber.junit.platform.engine.Cucumber;

@Cucumber(
  features = "src/test/resources/com/app/x/features",
  glue = "com.app.x.steps",
  tags = "${includeTags}"
)
public class CucumberTestRunner {}

如果使用旧版JUnit 4的@CucumberOptions,则配置为:

import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;

@RunWith(Cucumber.class)
@CucumberOptions(
  features = "src/test/resources/com/app/x/features",
  glue = "com.app.x.steps",
  tags = "${includeTags}"
)
public class CucumberTestRunner {}

3. 统一Java与Gradle版本

在Gradle@3任务中指定与本地一致的Java版本(17.0.7),并强制使用项目wrapper:

- task: Gradle@3
  inputs:
    workingDirectory: ''
    gradleWrapperFile: 'gradlew'
    tasks: 'clean build test'
    arguments: '-PincludeTags=LoginFeature --info'
    javaHomeOption: 'JDKVersion'
    jdkVersionOption: '1.17' # 或对应17.0.7的版本标识,根据流水线配置调整

4. 检查测试资源路径映射

确认特性文件路径与Runner配置的features路径完全匹配,避免大小写或目录层级错误(部分CI环境对路径大小写敏感)。

内容的提问来源于stack exchange,提问作者Rashad.Z

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 08:19:57