Cucumber Spring Integration – Cucumber Spring集成

最后修改: 2016年 8月 6日


1. Overview


Cucumber is a very powerful testing framework written in the Ruby programming language, which follows the BDD (behavior-driven development) methodology. It enables developers to write high-level use cases in plain text that can be verified by non-technical stakeholders, and turn them into executable tests, written in a language called Gherkin.


We have already discussed these in a different article.


And the Cucumber-Spring Integration is intended to make test automation easier. Once we have the Cucumber tests integrated with Spring, we should be able to execute them along with the Maven build.


2. Maven Dependencies


Let’s get started using the Cucumber-Spring integration by defining the Maven dependencies – starting with the Cucumber-JVM dependency:



We can find the most recent version of Cucumber JVM here.

我们可以找到Cucumber JVM的最新版本这里

Next, we’ll add the JUnit and Cucumber testing dependency:



The most recent version of Cucumber JUnit can be found here.

Cucumber JUnit的最新版本可以在这里找到。

And finally, the Spring and Cucumber dependency:



Again, we can check out the most recent version of Cucumber Spring over here.

同样,我们可以在这里查看Cucumber Spring的最新版本。

3. Configuration


We’ll now look at how we can integrate Cucumber in a Spring application.


First, we’ll create a Spring Boot application – for which we’ll follow the Spring-Boot application article. Then, we’ll create a Spring REST service and write the Cucumber test for it.

首先,我们将创建一个Spring Boot应用程序–为此我们将遵循Spring-Boot应用程序文章。然后,我们将创建一个Spring REST服务并为其编写Cucumber测试。

3.1. REST Controller


First, let’s create a simple controller:


public class VersionController {
    public String getVersion() {
        return "1.0";

3.2. Cucumber Step Definitions


All we need to run our Cucumber tests with JUnit is to create a single empty class with an annotation @RunWith(Cucumber.class):


@CucumberOptions(features = "src/test/resources")
public class CucumberIntegrationTest {

We can see the annotation @CucumberOptions where we’re specifying the location of the Gherkin file which is also known as the feature file. At this point, Cucumber recognizes the Gherkin language; you can read more about Gherkin in the article mentioned in the introduction.


So now, let’s create a Cucumber feature file:


Feature: the version can be retrieved
  Scenario: client makes call to GET /version
    When the client calls /version
    Then the client receives status code of 200
    And the client receives server version 1.0

The Scenario is to make a GET call to the REST service url /version and verify the response.


Next, we need to create a so-called glue code. These are methods that link a single Gherkin step with Java code.


We have to options here – we can either use Cucumber Expressions or regular expressions inside the annotations. In our case, we’ll stick to the regular expressions:

我们在这里可以选择–我们可以使用Cucumber Expressions或注释内的正则表达式。在我们的案例中,我们将坚持使用正则表达式。

@When("^the client calls /version$")
public void the_client_issues_GET_version() throws Throwable{

@Then("^the client receives status code of (\\d+)$")
public void the_client_receives_status_code_of(int statusCode) throws Throwable {
    HttpStatus currentStatusCode = latestResponse.getTheResponse().getStatusCode();
    assertThat("status code is incorrect : "+ 
    latestResponse.getBody(), currentStatusCode.value(), is(statusCode));

@And("^the client receives server version (.+)$")
public void the_client_receives_server_version_body(String version) throws Throwable {
    assertThat(latestResponse.getBody(), is(version));

So now let’s integrate the Cucumber tests with the Spring Application Context. For that, we’ll create a new class and annotate it with @SpringBootTest and @CucumberContextConfiguration:


public class SpringIntegrationTest {
    // executeGet implementation

Now all the Cucumber definitions can go into a separate Java class which extends SpringIntegrationTest:


public class StepDefs extends SpringIntegrationTest {
    @When("^the client calls /version$")
    public void the_client_issues_GET_version() throws Throwable {

We are all set for a test run now.


Finally, we can do a quick run via the command line, simply running mvn clean install -Pintegration-lite-first – Maven will execute the integration tests and show the results in the console.

最后,我们可以通过命令行进行快速运行,只需运行mvn clean install -Pintegration-lite-first – Maven将执行集成测试并在控制台显示结果。

3 Scenarios ([32m3 passed[0m)
9 Steps ([32m9 passed[0m)

Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 9.283 sec - in
2016-07-30 06:28:20.142  INFO 732 --- [Thread-2] AnnotationConfigEmbeddedWebApplicationContext :
  Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext:
  startup date [Sat Jul 30 06:28:12 CDT 2016]; root of context hierarchy

Results :

Tests run: 12, Failures: 0, Errors: 0, Skipped: 0

4. Conclusion


Having configured Cucumber with Spring, it will be handy to use Spring-configured components in BDD testing. This is a simple guide for integrating the Cucumber test in a Spring-Boot application.


As usual, all code samples shown in this tutorial are available over on GitHub.