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>
解决思路
拆分配置类:将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 { }
- 创建独立的Spring配置类:
检查feature文件:确保
src/test/resources/features目录存在,且包含匹配步骤定义的.feature文件,示例内容:Feature: Greeting API Test Scenario: Request greeting When I request a greeting清理冗余依赖:移除重复/不必要的依赖:
- 删除单独引入的
spring-boot-test(已被spring-boot-starter-test包含) - 删除
junit-platform-console-standalone(测试环境无需独立运行包)
- 删除单独引入的
完善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>验证包路径:确认
GLUE_PROPERTY_NAME指定的包org.ono.sprint.demo包含步骤定义类和Spring配置类,包结构无误。
内容的提问来源于stack exchange,提问作者onouv
相关产品推荐
相关产品推荐

