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

Spring Boot集成Cucumber+JUnit5时@Suite未发现测试求助

解决Spring Boot+Cucumber+JUnit5测试环境的NoTestsDiscoveredException异常

搭建Spring Boot+Cucumber+JUnit5测试环境时,运行测试抛出以下异常:

org.junit.platform.suite.engine.NoTestsDiscoveredException: Suite [org.ono.sprint.demo.CucumberRunnerTest] did not discover any tests

以下是当前的测试配置:

测试启动类CucumberRunnerTest

package org.ono.sprint.demo;

import io.cucumber.spring.CucumberContextConfiguration;
import org.junit.platform.suite.api.ConfigurationParameter;
import org.junit.platform.suite.api.IncludeEngines;
import org.junit.platform.suite.api.SelectClasspathResource;
import org.junit.platform.suite.api.Suite;
import org.springframework.boot.test.context.SpringBootTest;

import static io.cucumber.junit.platform.engine.Constants.GLUE_PROPERTY_NAME;

@Suite
@IncludeEngines("cucumber")
@SelectClasspathResource("features")
@ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "org.ono.sprint.demo")
@CucumberContextConfiguration
@SpringBootTest
public class CucumberRunnerTest {
}

步骤定义类StepDefinitionsTest

package org.ono.sprint.demo;

import org.junit.jupiter.api.Assertions;

import org.springframework.boot.test.web.server.LocalServerPort;
import org.springframework.web.client.RestTemplate;

import io.cucumber.java.en.When;

public class StepDefinitionsTest {

  @LocalServerPort
  private int port;

  private final RestTemplate restTemplate = new RestTemplate();

  @When("I request a greeting")
  public void i_request_a_greeting() {
    String greetingUrl = "http://localhost:" + port + "/greetings";

    String greeting = restTemplate.getForObject(greetingUrl, String.class);
    Assertions.assertEquals("Hello", greeting);
  }

}

Maven依赖配置

<properties>
    <java.version>17</java.version>
    <junit-platform.version>1.9.1</junit-platform.version>
    <cucumber.version>7.10.1</cucumber.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-test</artifactId>
        <version>3.2.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>

    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-engine</artifactId>
        <version>${junit-platform.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-suite-api</artifactId>
        <version>${junit-platform.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-console-standalone</artifactId>
        <version>${junit-platform.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-spring</artifactId>
        <version>${cucumber.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-java</artifactId>
        <version>${cucumber.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-junit-platform-engine</artifactId>
        <version>${cucumber.version}</version>
        <scope>test</scope>
    </dependency>       
</dependencies>

解决思路

  1. 拆分配置类:将Cucumber Suite配置和Spring上下文配置分开,避免引擎冲突

    • 创建独立的Spring配置类:
      package org.ono.sprint.demo;
      
      import io.cucumber.spring.CucumberContextConfiguration;
      import org.springframework.boot.test.context.SpringBootTest;
      
      @CucumberContextConfiguration
      @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
      public class CucumberSpringConfiguration {
      }
      
    • 修改CucumberRunnerTest,仅保留Cucumber相关注解:
      package org.ono.sprint.demo;
      
      import org.junit.platform.suite.api.ConfigurationParameter;
      import org.junit.platform.suite.api.IncludeEngines;
      import org.junit.platform.suite.api.SelectClasspathResource;
      import org.junit.platform.suite.api.Suite;
      
      import static io.cucumber.junit.platform.engine.Constants.GLUE_PROPERTY_NAME;
      
      @Suite
      @IncludeEngines("cucumber")
      @SelectClasspathResource("features")
      @ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "org.ono.sprint.demo")
      public class CucumberRunnerTest {
      }
      
  2. 检查feature文件:确保src/test/resources/features目录存在,且包含匹配步骤定义的.feature文件,示例内容:

    Feature: Greeting API Test
      Scenario: Request greeting
        When I request a greeting
    
  3. 清理冗余依赖:移除重复/不必要的依赖:

    • 删除单独引入的spring-boot-test(已被spring-boot-starter-test包含)
    • 删除junit-platform-console-standalone(测试环境无需独立运行包)
  4. 完善Maven插件配置:确保spring-boot-maven-plugin版本与Spring Boot一致,添加maven-surefire-plugin保证测试执行:

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>3.2.0</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.2.2</version>
            </plugin>
        </plugins>
    </build>
    
  5. 验证包路径:确认GLUE_PROPERTY_NAME指定的包org.ono.sprint.demo包含步骤定义类和Spring配置类,包结构无误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 21:14:54