Cucumber 测试 Spring 启动应用程序
Cucumber Test a Spring Boot Application
有谁知道我在哪里可以找到一个示例应用程序,其中 Cucumber 用于通过 Gradle 测试 Spring 引导应用程序?我可以 运行 测试很好地在 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. 我的应用程序没有启动,黄瓜测试无法建立连接。
谢谢。
编辑:或者如果有人可以告诉我如何使用 gradle 启动和停止应用程序,那也是可以接受的。
我做了类似的事情来让 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 {
}
首先,您需要确保您有 applied spring-boot in gradle. Invoke gradle build
which will produce a runnable jar. Instead of having your manifest call for the Spring class as your main, have a wrapper that starts it in a thread, waits for it to settle down and runs 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);
}
}
在 this question 的帮助下我已经解决了这个问题。
这是包含答案的存储库:
https://github.com/jakehschwartz/spring-boot-cucumber-example
简而言之,AbstractSpringTest
class需要有如下注解:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = DemoApplication.class, loader = SpringApplicationContextLoader.class)
@WebAppConfiguration
@IntegrationTest
进一步@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 上下文...
原来我错过了以下依赖项(之一):
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;
}
更新:Spring启动 1.5.1
@ContextConfiguration(
loader = SpringBootContextLoader.class,
classes = Application.class
)
有谁知道我在哪里可以找到一个示例应用程序,其中 Cucumber 用于通过 Gradle 测试 Spring 引导应用程序?我可以 运行 测试很好地在 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. 我的应用程序没有启动,黄瓜测试无法建立连接。
谢谢。
编辑:或者如果有人可以告诉我如何使用 gradle 启动和停止应用程序,那也是可以接受的。
我做了类似的事情来让 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 {
}
首先,您需要确保您有 applied spring-boot in gradle. Invoke gradle build
which will produce a runnable jar. Instead of having your manifest call for the Spring class as your main, have a wrapper that starts it in a thread, waits for it to settle down and runs 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);
}
}
在 this question 的帮助下我已经解决了这个问题。
这是包含答案的存储库: https://github.com/jakehschwartz/spring-boot-cucumber-example
简而言之,AbstractSpringTest
class需要有如下注解:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = DemoApplication.class, loader = SpringApplicationContextLoader.class)
@WebAppConfiguration
@IntegrationTest
进一步@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 上下文...
原来我错过了以下依赖项(之一):
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;
}
更新:Spring启动 1.5.1
@ContextConfiguration(
loader = SpringBootContextLoader.class,
classes = Application.class
)