Перейти к основному содержимому

Огурец и план сценария

· 4 мин. чтения

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 .