Схема огурца и сценария

Схема огурца и сценария

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.