1. 概述

Cucumber 是一款由 Ruby 编程语言编写的强大测试框架,遵循 BDD(行为驱动开发)方法论。它允许开发者用纯文本编写高层次的使用场景,这些场景可以被非技术相关方验证,并将其转化为使用一种名为 Gherkin 的语言编写的可执行测试。

我们在另一篇文章中已经讨论过这个主题。

Cucumber-Spring 集成旨在使自动化测试更加便捷。一旦我们将 Cucumber 测试与 Spring 整合,我们就可以在 Maven 构建过程中执行它们。

2. Maven 依赖

让我们通过定义 Maven 依赖来开始使用 Cucumber-Spring 集成:首先,从 Cucumber-JVM 依赖开始:

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-java</artifactId>
    <version>7.14.0</version>
    <scope>test</scope>
</dependency>

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

接下来,添加 JUnit 和 Cucumber 测试依赖:

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-junit</artifactId>
    <version>7.14.0</version>
    <scope>test</scope>
</dependency>

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

最后,添加 Spring 和 Cucumber 依赖:

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-spring</artifactId>
    <version>7.14.0</version>
    <scope>test</scope>
</dependency>

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

3. 配置

现在,我们将探讨如何在 Spring 应用程序中集成 Cucumber。

首先,我们将创建一个 Spring Boot 应用程序——我们将遵循 Spring Boot 应用配置文章中的步骤。然后,我们将创建一个 Spring REST 服务,并为其编写 Cucumber 测试。

3.1. REST 控制器

首先,让我们创建一个简单的控制器:

@RestController
public class VersionController {
    @GetMapping("/version")
    public String getVersion() {
        return "1.0";
    }
}

3.2. Cucumber 步骤定义

为了使用 JUnit 运行我们的 Cucumber 测试,我们需要创建一个带有注解 @RunWith(Cucumber.class) 的空类:

@RunWith(Cucumber.class)
@CucumberOptions(features = "src/test/resources")
public class CucumberIntegrationTest {
}

在注解 @CucumberOptions 中,我们可以指定 Gherkin 文件的位置,也称为特性文件。此时,Cucumber 识别了 Gherkin 语言;有关 Gherkin 的更多信息,请参阅介绍部分提到的文章。

现在,让我们创建一个 Cucumber 特性文件:

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

场景是向 REST 服务的 URL /version 发送 GET 请求并验证响应。

接下来,我们需要创建所谓的粘合代码。这些是将单个 Gherkin 步骤链接到 Java 代码的方法。

在这里,我们可以选择使用 Cucumber 表达式 或者在注解中使用正则表达式。在我们的例子中,我们将使用正则表达式:

@When("^the client calls /version$")
public void the_client_issues_GET_version() throws Throwable{
    executeGet("http://localhost:8080/version");
}

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

现在,让我们将 Cucumber 测试与 Spring 应用上下文整合。为此,我们将创建一个新的类,并使用注解 @SpringBootTest@CucumberContextConfiguration

@CucumberContextConfiguration
@SpringBootTest
public class SpringIntegrationTest {
    // executeGet implementation
}

现在,所有的 Cucumber 定义都可以放在一个扩展自 SpringIntegrationTest 的单独 Java 类中:

public class StepDefs extends SpringIntegrationTest {
   
    @When("^the client calls /version$")
    public void the_client_issues_GET_version() throws Throwable {
        executeGet("http://localhost:8080/version");
    }
}

我们现在可以进行测试运行了。

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

3 Scenarios ([32m3 passed[0m)
9 Steps ([32m9 passed[0m)
0m1.054s

Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 9.283 sec - in
  com.baeldung.CucumberTest
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. 总结

配置好 Cucumber 与 Spring 后,在 BDD 测试中使用 Spring 配置的组件会非常方便。这是一篇关于在 Spring Boot 应用中集成 Cucumber 测试的简单指南。

如往常一样,本教程的所有示例代码可在 GitHub 上找到。


« 上一篇: Spring Cloud Config介绍
» 下一篇: JSONForms简介