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 上找到。