1. Введение
Cucumber — это среда тестирования BDD (Behavioral Driven Development).
Использование фреймворка для написания повторяющихся сценариев с различными перестановками входных/выходных данных может занять довольно много времени, быть сложным в обслуживании и, конечно, разочаровывающим.
Cucumber предлагает решение, позволяющее сократить эти усилия, используя концепцию Scenario Outline в сочетании с Examples
. В следующем разделе мы попытаемся рассмотреть пример и посмотреть, как мы можем свести к минимуму эти усилия.
Если вы хотите узнать больше о подходе и языке Gherkin, взгляните на эту статью .
2. Добавление поддержки огурцов
Чтобы добавить поддержку Cucumber в простой проект Maven, нам нужно будет добавить следующие зависимости:
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-junit</artifactId>
<version>1.2.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-java</artifactId>
<version>1.2.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
Полезные ссылки на зависимости от Maven Central: огурец-junit , огурец-java , hamcrest-library
Поскольку это тестовые библиотеки, их не нужно поставлять с фактически развертываемыми — вот почему все они предназначены для тестирования
.
3. Простой пример
Давайте продемонстрируем как раздутый, так и лаконичный способ написания рекомендуемых файлов. Давайте сначала определим логику, для которой мы хотим написать тест:
Давайте сначала определим логику, для которой мы хотим написать тест:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
4. Определение тестов огурца
4.1. Определение файла функций
Feature: Calculator
As a user
I want to use a calculator to add numbers
So that I don't need to add myself
Scenario: Add two numbers -2 & 3
Given I have a calculator
When I add -2 and 3
Then the result should be 1
Scenario: Add two numbers 10 & 15
Given I have a calculator
When I add 10 and 15
Then the result should be 25
Как видно здесь, для проверки логики сложения были использованы 2 разные комбинации чисел. Если не считать цифр, все сценарии абсолютно одинаковы.
4.2. Код «клея»
Чтобы протестировать эти сценарии, необходимо определить каждый шаг с помощью соответствующего кода, чтобы преобразовать оператор в функциональный фрагмент кода:
public class CalculatorRunSteps {
private int total;
private Calculator calculator;
@Before
private void init() {
total = -999;
}
@Given("^I have a calculator$")
public void initializeCalculator() throws Throwable {
calculator = new Calculator();
}
@When("^I add (-?\\d+) and (-?\\d+)$")
public void testAdd(int num1, int num2) throws Throwable {
total = calculator.add(num1, num2);
}
@Then("^the result should be (-?\\d+)$")
public void validateResult(int result) throws Throwable {
Assert.assertThat(total, Matchers.equalTo(result));
}
}
4.3. Класс бегунов
Чтобы интегрировать функции и связующий код, мы можем использовать бегуны JUnit:
@RunWith(Cucumber.class)
@CucumberOptions(
features = { "classpath:features/calculator.feature" },
glue = {"com.foreach.cucumber.calculator" })
public class CalculatorTest {}
5. Переписывание функций с использованием набросков сценария
Мы видели в разделе 4.1. как определение файла функций может быть трудоемкой задачей и более подвержено ошибкам. Тот же файл функций можно сократить до нескольких строк, используя схему сценария:
Feature: Calculator
As a user
I want to use a calculator to add numbers
So that I don't need to add myself
Scenario Outline: Add two numbers <num1> & <num2>
Given I have a calculator
When I add <num1> and <num2>
Then the result should be <total>
Examples:
| num1 | num2 | total |
| -2 | 3 | 1 |
| 10 | 15 | 25 |
| 99 | -99 | 0 |
| -1 | -10 | -11 |
При сравнении обычного определения сценария
со структурой сценария
значения больше не нужно жестко закодировать в определениях шагов. Значения заменяются параметрами как <имя_параметра>
в самом определении шага.
В конце Scenario Outline значения определяются в формате таблицы с разделителями вертикальной чертой с использованием примеров
.
Образец для определения примеров
показан ниже:
Examples:
| Parameter_Name1 | Parameter_Name2 |
| Value-1 | Value-2 |
| Value-X | Value-Y |
6. Заключение
В этой быстрой статье мы показали, как можно сделать сценарии универсальными по своей природе. А также сократить усилия по написанию и сопровождению этих сценариев.
Полный исходный код этой статьи можно найти на GitHub .