我一直在尝试使用Junit(4.12),Cucumber-Java(4.1.1),Cucumber-Spring(4.1.1)和Cucumber-Junit(4.1.1)的组合来运行基于弹簧的黄瓜测试。 从 IDE 内部运行测试时加载胶水代码没有问题 (IntelliJ 2018.3.4),但似乎由于某种原因,当我尝试从编译的 jar 文件运行时(在这种情况下是必需的)cucumber 找不到步骤定义。
我已经尝试了多种胶水代码格式,例如: "classpath:com.a.b.c.stepdefs" "com.a.b.c.stepdefs" "classpath:com/a/b/c/stepdefs">
我还尝试提供从运行器类到步骤定义类的相对路径(仅嵌套在下面一层) "步进">
还尝试使用JUnit和cucumber.cli.Main运行,并尝试使用不同样式的步骤定义(黄瓜表达式 - 缺少的步骤片段指向我 - 和正则表达式)
我正在使用 spring-boot-maven-插件,所以我知道这通常会改变 jar 结构
从 IDE 运行时,上述所有变体都可以完全工作,但不能从 jar 文件运行
主类:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@ComponentScan(basePackages = {"com.a.b.test.core.data",
"com.a.b.c",
"com.a.b.c.stepdefs"}
)
public class CucumberApplication {
public static void main(String[] args) throws IOException, InterruptedException {
SpringApplication.run(CucumberApplication.class, args);
Result result = JUnitCore.runClasses(RunnerCentral.class);
System.exit(result.wasSuccessful() ? 0 : 1);
}
}
流道类:
package com.a.b.c;
@RunWith(Cucumber.class)
@CucumberOptions(features = "classpath:BOOT-INF/classes/features",
glue = "classpath:com/a/b/c/stepdefs",
plugin = "json:target/cucumber-html-reports/cucumber.json")
public class RunnerCentral {
}
弹簧引导插件的POM配置:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.0.RELEASE</version>
<configuration>
<fork>true</fork>
<mainClass>${start-class}</mainClass>
<requiresUnpack>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-java</artifactId>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-spring</artifactId>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit</artifactId>
</dependency>
</requiresUnpack>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
我希望从 IDE 运行和从打包的源代码运行之间的行为是一致的,尽管我可能缺少一些东西
我想提到的另一件事是,当用黄瓜-皮库容器交换后端时,一切似乎都正常(弹簧是必需的,因此无法交换)
这种问题可能会让您向最近的同事推出热咖啡。
你有没有看过这篇关于使用自定义资源加载器 https://github.com/cucumber/cucumber-jvm/issues/1320 的文章
我认为您必须复制并粘贴 Cucumber.java 类,从应用程序上下文向运行时提供资源加载器,并将 RunnerCentral 类更改为 RunWith 新类。
FWIW 在我的情况下,我将原始项目放在一个 docker 容器中,该容器在启动时运行./mvnw test
这是 Spring Boot 项目中提供的 Maven 包装器。如果使用企业仓库,则可以执行./mvnw test -s /path/to/maven/settings.xml
,并且如果您的容器主机无法访问企业仓库,请先在 Jenkins 盒子(或构建映像的任何位置)上运行映像,这将导致依赖项 jar 下载到里面,然后提交 docker 映像,并将该映像推出。
这样,容器就可以使用其中的本地.m2
目录运行 Cucumber 测试阶段,并且它所需的依赖项已经存在。