1. Обзор
Cucumber — очень мощная среда тестирования, написанная на языке программирования Ruby, которая следует методологии BDD (разработка, управляемая поведением). Он позволяет разработчикам писать сценарии использования высокого уровня в виде простого текста, которые могут быть проверены нетехническими заинтересованными сторонами, и превращать их в исполняемые тесты, написанные на языке под названием Gherkin.
Мы уже обсуждали это в другой статье .
А интеграция Cucumber-Spring предназначена для упрощения автоматизации тестирования. Как только мы интегрируем тесты Cucumber со Spring, мы сможем выполнять их вместе со сборкой Maven.
2. Зависимости Maven
Давайте начнем использовать интеграцию Cucumber-Spring, определив зависимости Maven, начиная с зависимости Cucumber-JVM:
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-java</artifactId>
<version>6.8.0</version>
<scope>test</scope>
</dependency>
Мы можем найти самую последнюю версию Cucumber JVM здесь .
Далее мы добавим зависимость тестирования JUnit и Cucumber:
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit</artifactId>
<version>6.8.0</version>
<scope>test</scope>
</dependency>
Самую последнюю версию Cucumber JUnit можно найти здесь .
И, наконец, зависимость Spring и Cucumber:
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-spring</artifactId>
<version>6.8.0</version>
<scope>test</scope>
</dependency>
Опять же, мы можем проверить самую последнюю версию Cucumber Spring здесь .
3. Конфигурация
Теперь мы рассмотрим, как мы можем интегрировать Cucumber в приложение Spring.
Во- первых, мы создадим приложение 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, — это создать один пустой класс с аннотацией @RunWith(Cucumber.class)
:
@RunWith(Cucumber.class)
@CucumberOptions(features = "src/test/resources")
public class CucumberIntegrationTest {
}
Мы можем видеть аннотацию @CucumberOptions
, где мы указываем расположение файла Gherkin, который также известен как файл функций. В этот момент Cucumber распознает язык корнишонов; вы можете прочитать больше о 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
Сценарий состоит в том, чтобы сделать вызов GET для URL-адреса /версии
службы REST и проверить ответ.
Далее нам нужно создать так называемый связующий код. Это методы, которые связывают один шаг корнишона с кодом 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 могут быть помещены в отдельный класс Java, который расширяет SpringIntegrationTest
:
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.foreach.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 будет удобно использовать компоненты, настроенные Spring, в тестировании BDD. Это простое руководство по интеграции теста Cucumber в приложение Spring-Boot.
Как обычно, все примеры кода, показанные в этом руководстве, доступны на GitHub .