Схема огурца и сценария
1. Вступление
Cucumber - это среда тестирования BDD (Поведенческая разработка).
Использование структурыto write repetitive scenarios с разными перестановками входов / выходов может занять довольно много времени, сложно поддерживать и, конечно, разочаровывать.
Компания Cucumber пришла с решением для сокращения этих усилий с помощью концепцииScenario Outline coupled with Examples. В следующем разделе мы попытаемся взять пример и посмотреть, как мы можем минимизировать эти усилия.
Если вы хотите узнать больше о подходе и языке Gherkin, посмотритеthis article.
2. Добавление поддержки огурца
Чтобы добавить поддержку Cucumber в простом проекте Maven, нам нужно будет добавить следующие зависимости:
info.cukes
cucumber-junit
1.2.5
test
info.cukes
cucumber-java
1.2.5
test
org.hamcrest
hamcrest-library
1.3
test
Полезные ссылки на зависимости от Maven Central:cucumber-junit,cucumber-java,hamcrest-library
Поскольку это библиотеки для тестирования, их не нужно поставлять с готовыми к развертыванию, поэтому все они имеют область действияtest.
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.example.cucumber.calculator" })
public class CalculatorTest {}
5. Переписывание функций с использованием схем сценария
Мы видели в разделе 4.1. как определение файла объекта может быть трудоемкой задачей и более подвержено ошибкам. Тот же файл функций можно сократить до нескольких строк с помощьюScenario Outline:
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 &
Given I have a calculator
When I add and
Then the result should be
Examples:
| num1 | num2 | total |
| -2 | 3 | 1 |
| 10 | 15 | 25 |
| 99 | -99 | 0 |
| -1 | -10 | -11 |
При сравнении обычногоScenario Definition сScenario Outline значения больше не нужно жестко задавать в определениях шагов. Значения заменяются параметрами как<parameter_name> в самом определении шага.
В конце схемы сценария значения определяются в формате таблицы с разделителями-вертикальными чертами с использованиемExamples.
Пример для определенияExamples показан ниже:
Examples:
| Parameter_Name1 | Parameter_Name2 |
| Value-1 | Value-2 |
| Value-X | Value-Y |
6. Заключение
В этой быстрой статье мы показали, как можно сделать сценарии универсальными. А также уменьшите усилия при написании и поддержании этих сценариев.
Полный исходный код этой статьи можно найти наover on GitHub.