【问题标题】:Cucumber Test a Spring Boot ApplicationCucumber 测试一个 Spring Boot 应用程序
【发布时间】:2015-08-20 11:23:46
【问题描述】:

有谁知道我在哪里可以找到使用 Cucumber 通过 Gradle 测试 Spring Boot 应用程序的示例应用程序?我可以在 cmd 行上启动服务器并使用我的 IDE 运行测试,但我需要能够在 CI 服务器上以编程方式运行它们。我在这里看到了答案,但该解决方案对我不起作用,很可能是因为我有多个步骤 def 文件。

这是我的设置

build.grade(在另一个问题中提到)

testCompile ("org.springframework.boot:spring-boot-starter-test",
    ...
    "info.cukes:cucumber-spring:${cucumberVersion}")

CucumberTest.java

@RunWith(Cucumber.class)
@CucumberOptions(format = "pretty", features = "src/test/resources")
public class CucumberTest{
}

AbstractSpringTest.java(由所有 StepDef 文件扩展)

@SpringApplicationConfiguration(classes = Application.class)
@RunWith(SpringJUnit4ClassRunner.class)
@Ignore
public abstract class AbstractSpringTest
{ ... }

它在启动时没有做正确的事情,因为它 1. 尝试初始化我的 step def 文件和 2. 我的应用程序没有启动并且 cucumber 测试无法建立连接。

谢谢。

编辑:或者如果有人可以告诉我如何使用 gradle 启动和停止应用程序,那也是可以接受的。

【问题讨论】:

  • 在您的 gradle 配置中启动 spring-boot,然后再执行您的黄瓜测试用例。因为在执行黄瓜测试用例之前,您的 spring-boot 应用程序应该处于运行状态。
  • 我对 groovy/gradle 了解不多,你能给我举个例子吗?它为我的集成测试启动,所以我想我可以使用类似的机制。
  • 你试过@IntegrationTest。据我所知,这将启动您的网络服务器等。我还在黄瓜弹簧旁边使用`testCompile group:'info.cukes',名称:'cucumber-junit',版本:cucumberVersion`。您可以在 ide 中将黄瓜测试作为 junit 测试运行吗?
  • 是的,我已经包含了 cucumber-junit。我无法从 IDE 将我的黄瓜测试作为 junit 测试运行。将@IntegrationTest 添加到我的 CucumberTest 类并以junit 运行该类并没有解决我的问题。
  • 您是否尝试过为测试配置上下文? @ContextConfiguration(classes = YourAppConfig.class, loader = SpringApplicationContextLoader.class)@IntegrationTest 可以通过您的 IDE 运行您的应用程序吗?还是不能运行?

标签: java spring spring-boot cucumber-jvm


【解决方案1】:

我做了这样的事情来让 Spring 与 JUnit 参数化测试一起工作。 Cucumber应该是同一个概念,但我没试过。我使用的是 XML 配置,所以这可能会有所不同。

RunWithSpringJUnit4

public abstract class RunWithSpringJUnit4 {

    private TestContextManager testContextManager;

    public RunWithSpringJUnit4() {
        try {
            this.testContextManager = new TestContextManager(getClass());
            this.testContextManager.prepareTestInstance(this);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

黄瓜测试

@RunWith(Cucumber.class)
@CucumberOptions(format = "pretty", features = "src/test/resources")
public class CucumberTest extends RunWithSpringJUnit4 {
}

【讨论】:

  • 我不知道这是否会更好,因为这仍然无法启动我的应用程序。
  • @JakeSchwartz 好的,这就是我所拥有的!祝你好运!
【解决方案2】:

首先,您需要确保在 gradle 中有 applied spring-boot。调用 gradle build 将生成一个可运行的 jar。与其将 Spring 类的清单调用作为主类,不如使用一个包装器在线程中启动它,waits for it to settle down 并运行Cucumber

@RunWith(Cucumber.class)
public class LucasePsCucumberTest implements Runnable {
    public static void main(String[] args) {
        Thread t = new Thread(this);
        t.start();
        // wait for t
        cucumber.api.cli.Main(null);
     }
}

【讨论】:

  • 所以你是说构建 jar,运行 jar,然后在另一个线程中运行测试?
  • 我想我明白你在说什么,但我认为这对我没有帮助。我想我应该回去编辑我原来的问题。我运行黄瓜测试没有问题。我需要能够通过 gradle 运行它们,以便我的 CI 服务器可以通过我的构建。
  • @hd1 你如何从静态方法访问它?
【解决方案3】:

我在this question 的帮助下解决了这个问题。

这是带有答案的存储库: https://github.com/jakehschwartz/spring-boot-cucumber-example

总之AbstractSpringTest类需要有如下注解:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = DemoApplication.class, loader = SpringApplicationContextLoader.class)
@WebAppConfiguration
@IntegrationTest

【讨论】:

  • 谢谢!我错过了让这个注释工作的一件重要事情是info.cukes:cucumber-spring 在类路径中的存在。没有注意到这一点,尝试运行它时有点挣扎。
  • 从 Spring Boot 1.2.1 开始,您可以使用 @WebIntegrationTest 代替 @WebAppConfiguration@IntegrationTest
  • 存储库代码不起作用。运行 ./gradlew clean build 时测试失败
  • @MartínZaragoza 我并不惊讶它不再有效,这个问题已经超过 3 年了。
【解决方案4】:

除了@jakehschwartz,如果您希望网络应用程序在随机可用端口上启动,AbstractSpringTest 需要:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Application.class, loader = SpringApplicationContextLoader.class)
@WebIntegrationTest({"server.port=0"})
public abstract class AbstractSpringTest {

        @Value("${local.server.port}")
        protected int serverPort;
...}

【讨论】:

    【解决方案5】:

    我有类似的症状,我的黄瓜不会启动 Spring 上下文...

    原来我错过了以下依赖项(其中之一):

    build.gradle

    testCompile "info.cukes:cucumber-junit:1.2.4"
    testCompile "info.cukes:cucumber-java:1.2.4"
    testCompile "info.cukes:cucumber-spring:1.2.4"
    

    StepDefs.java

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(
            loader = SpringApplicationContextLoader.class,
            classes = Application.class
    )
    @WebIntegrationTest(randomPort = true)
    public class StepDefs {
    
        @Value("${local.server.port}")
        int port;
    
    }
    

    更新:SpringBoot 1.5.1

    @ContextConfiguration(
            loader = SpringBootContextLoader.class,
            classes = Application.class
    )
    

    【讨论】:

    • 我有同样的问题,唯一对我在其他网站上搜索有用的是 SpringBoot 1.5.1 的更新
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 2017-01-30
    • 2016-07-01
    • 1970-01-01
    • 2018-07-22
    • 2016-10-20
    相关资源
    最近更新 更多