繁体   English   中英

Cucumber 测试 Spring Boot 应用程序

[英]Cucumber Test a Spring Boot Application

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

这是我的设置

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

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

黄瓜测试.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. 我的应用程序未启动并且黄瓜测试无法建立连接。

谢谢。

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

我已经在这个问题的帮助下解决了这个问题

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

总之, AbstractSpringTest类需要有以下注解:

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

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

结果我错过了以下依赖项(之一):

构建.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"

步骤定义文件

@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
)

进一步@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;
...}

我做了这样的事情来让 Spring 与 JUnit 参数化测试一起工作。 黄瓜应该是相同的概念,但我还没有尝试过。 我使用的是 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 {
}

首先,您需要确保已在 gradle 中应用了 spring-boot 调用gradle build将生成一个可运行的 jar。 不要将 Spring 类的清单调用作为主要调用,而是使用一个包装器在线程中启动它, 等待它稳定下来并运行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);
     }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM