Spring Boot cucumber + JUnit5:未找到给定包含的测试

icomxhvb  于 2023-06-22  发布在  Spring
关注(0)|答案(2)|浏览(150)

我正在使用Cucumber和JUnit5为我的项目编写测试。我的项目使用Spring框架和Gradle作为构建工具,我使用IntelliJ Idea作为编辑器,其中包含Cucumber和Gradle插件。下面是我的 cucumber 的跑步机:

package com.mycom.myproject.cucumber;

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

import org.junit.platform.suite.api.*;

@Suite
@IncludeEngines("cucumber")
@SelectClasspathResource("src/test/resources")
@ConfigurationParameters({
            @ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "com.mycom.myproject.cucumber.steps"),
            @ConfigurationParameter(key = FEATURES_PROPERTY_NAME, value = "src/test/resources/cucumber"),
            @ConfigurationParameter(key = PLUGIN_PROPERTY_NAME, value = "html")
})
public class RunCucumberTest {
}

这是我的cucumberBootstrap类:

package com.mycom.myproject.cucumber;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;

import com.mycom.myproject.Application;

import io.cucumber.spring.CucumberContextConfiguration;

@CucumberContextConfiguration
@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, args = "spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,com.arkea.catalyst.kafka.spring.KafkaAutoConfiguration")
@ActiveProfiles({ "IC" })
public class CucumberBootstrap {
}

我的步骤定义类:

package com.mycom.myproject.cucumber.steps;

import static org.junit.jupiter.api.Assertions.assertTrue;

public class StepDefinition extends CucumberBootstrap {

    @Quand("I want to calculate my bill")
    public void iWantToCalculateMyBill() {
         // some code
    }

    @Alors("I have this result")
    public void iHaveThisResult() {
         // some assertions
    }
}

以下是我的gradle.build文件:

// Tests dependencies
   testImplementation 'org.junit.jupiter:junit-jupiter-api'
   testImplementation 'org.junit.jupiter:junit-jupiter-engine'
   testImplementation 'org.springframework.boot:spring-boot-starter-test'
   testImplementation 'org.springframework.security:spring-security-test'
   testImplementation 'io.rest-assured:rest-assured:4.1.2'

   testImplementation "io.cucumber:cucumber-java:$cucumberVersion"
   testImplementation "io.cucumber:cucumber-spring:$cucumberVersion"
   testImplementation "io.cucumber:cucumber-junit-platform-engine:$cucumberVersion"

   testImplementation "org.junit.vintage:junit-vintage-engine"
   testImplementation 'org.junit.platform:junit-platform-suite:1.9.0'
   implementation 'org.junit.platform:junit-platform-commons:1.9.0'
}

test {
   useJUnitPlatform()
   systemProperty 'java.util.logging.manager', 'org.apache.logging.log4j.jul.LogManager'
   testLogging.showStandardStreams = true
   testLogging.exceptionFormat = 'full'
}

我的 cucumber 版本是7.5.0。无论我如何更改代码,我总是遇到“没有找到给定包含的测试”错误,我不知道如何更改它。你们有什么线索吗
谢谢

kzmpq1sx

kzmpq1sx1#

在跑步课上你有两个问题。

问题1

@SelectClasspathResource("src/test/resources")

这将选择一个类路径资源。但是src/test/resources不是类路径上的资源。
为了解释,考虑一个简单的项目,您可能具有以下布局:

src
├── main
│   └── java
│       └── io
│           └── cucumber
│               └── skeleton
│                   └── Belly.java
└── test
    ├── java
    │   └── io
    │       └── cucumber
    │           └── skeleton
    │               ├── RunCucumberTest.java
    │               └── StepDefinitions.java
    └── resources
        ├── io
        │   └── cucumber
        │       └── skeleton
        │           └── belly.feature
        └── junit-platform.properties

这里src/main/javasrc/test/javasrc/test/resources是不同的源。当你构建你的项目时,这些被编译或复制到build文件夹:

build
├── classes
│   └── java
│       ├── main
│       │   └── io
│       │       └── cucumber
│       │           └── skeleton
│       │               └── Belly.class
│       └── test
│           └── io
│               └── cucumber
│                   └── skeleton
│                       ├── RunCucumberTest.class
│                       └── StepDefinitions.class
└── resources
    └── test
        ├── io
        │   └── cucumber
        │       └── skeleton
        │           └── belly.feature
        └── junit-platform.properties

然后在运行测试时,类路径由依赖项和build/classes/java/{main,test}build/resources/test类路径根组成。
这意味着io/cucumber/{Belly,RunCucumberTest,StepDefinitions}.classio/cucumber/skeleton/belly.feature都是类路径上的资源。
因为@SelectClasspathResource选择了一个类路径资源,所以应该使用@SelectClasspathResource("io/cucumber/skeleton/belly.feature")。如果你有多个功能在@SelectClasspathResource("io/cucumber/skeleton")也将工作。

问题二

@ConfigurationParameter(key = FEATURES_PROPERTY_NAME, ..)

FEATURES_PROPERTY_NAME之所以存在,是因为Maven和Gradle不支持命令行中的JUnit5s发现选择器。在这种情况下你不需要它。

r55awzrz

r55awzrz2#

你很接近了!
RunCucumberTest类中:
1.添加

@SelectClasspathResource("features")

1.移除

@ConfigurationParameter(key = FEATURES_PROPERTY_NAME, value = "src/test/resources/cucumber"),

然后将您的功能文件放在以下位置:

src/test/resources/features/

顺便说一句,你不需要:

@IncludeEngines("cucumber")

相关问题