Gherkin для приёмочных тестов

Gherkin (рус. «Корнишон») — это язык описания тестов, очень похожий на естественный язык

  • язык появился как часть проекта Cucumber (рус. «Огурец») — фреймворка для приёмочного тестирования
  • язык реализует концепцию «исполняемой спецификации» или «спецификации на основе примеров»

Для интерпретаторов Gherkin подходит, чтобы показать примеры реальных программ и тут же использовать их в качестве тестов.

Пример теста на Gherkin #

Тесты на Gherkin обычно хранятся в файлах с расширением .feature.

Пример теста для языка Kaleidoscope на русском диалекте Gherkin:

#language: ru-RU
Функциональность: Последовательное выполнение
    Сценарий: вычисление площади круга
        Когда я выполняю программу:
        """
        # Объявляем константу числа "пи"
        def pi 3.14159;

        # Вычисляем площадь круга с радиусом 4.0.
        var r = 4 in
            pi * r * r;

        # Вычисляем площадь круга с радиусом 10.0.
        var r = 10 in
            pi * r * r;
        """

        Тогда я получаю результаты:
          | Value    |
          | 3.14159  |
          | 50.26544 |
          | 314.159  |

В этом тесте используются:

  • Директива #language: ru-RU для включения русского диалекта
  • Русские ключевые слова
  • Многострочный литерал в качестве аргумента шага «Когда я выполняю программу:»
  • Таблица в качестве аргумента шага «Тогда я получаю результаты:»

Тест проверяет таблицу значений, потому что в языке Kaleidoscope нет поддержки ввода-вывода — интерпретатор просто выводит результаты вычисления каждой инструкции.

В языке с поддержкой ввода вывода тест мог бы выглядеть иначе:

#language: ru-RU
Функциональность: Последовательное выполнение
    Сценарий: вычисление площади круга
        Пусть я запустил программу:
        """
        var r = readInt();
        print(3.14159 * r ** 2)
        """

        Когда я ввожу в консоли:
        """
        4
        """

        Тогда я увижу в консоли:
        """
        50.26544
        """

Структура теста на Gherkin #

Шаги на Gherkin разделяются на три группы:

  1. Given (Пусть) — шаги предварительной настройки, используют глаголы в прошедшем времени
  2. When (Когда) — шаги действий, используют глаголы в настоящем времени
  3. Then (Тогда) — шаги проверок, используют глаголы в будущем времени

Ключевые слова Gherkin:

АнглийскийРусскийКак используется
FeatureФункциональностьОписание функциональности — одно на весь файл
ScenarioСценарийНазвание теста
BackgroundКонтекстКомментарий к тесту либо общие шаги группы тестов
GivenПустьПредварительная настройка (шаг Arrange)
WhenКогдаПроверяемое действие (шаг Act)
ThenТогдаПроверка результата (шаг Assert)
AndИПредлог, соединяющий два шага одного уровня
ButНоПредлог, соединяющий два шага одного уровня

Для параметризованных тестов (которые вряд ли нам понадобятся) есть дополнительные ключевые слова:

АнглийскийРусскийКак используется
Scenario outlineШаблон сценарияНазвание параметризованного теста
ExamplesПримерыЗначения

Выполнение теста на Gherkin #

Большинство реализаций Gherkin работают как интерпретатор.

Если тесты пишутся на том же языке программирования, что и тестируемая система, то можно запускать их в одном процессе для максимальной скорости и стабильности тестов:

flowchart TB
    Gherkin{{"Тесты на Gherkin"}}
    Interpreter["Фреймворк Cucumber"]
    Steps{{"Описания шагов"}}
    SUT["Тестируемая система"]
    Gherkin --> Interpreter
    Interpreter --> Steps
    Steps --> SUT

Reqnroll для C# #

Исторически для C# есть особенная реализация Gherkin — фреймворк Reqnroll (бывш. Specflow). Его особенность в двухэтапной обработке Gherkin:

  1. Сначала тест собирается
flowchart
    subgraph "Запуск"
        direction TB
        GeneratedTest2{{"C# файл .feature.cs"}}
        Steps{{"Описания шагов на C#"}}
        SUT["Тестируемая система"]
        GeneratedTest2 --> Steps
    Steps --> SUT
    end

    subgraph "Сборка"
        direction TB
        Gherkin{{"Gherkin файл .feature"}}
        CodeGenerator["Генератор кода в Reqnroll"]
        GeneratedTest{{"C# файл .feature.cs"}}
        Gherkin --> CodeGenerator
        CodeGenerator --> GeneratedTest
    end

Создание тестов на Reqnroll (C#) #

Для проектов на C#

# Добавяем проект тестов
dotnet new xunit -o tests/Interpreter.Specs

# Добавляем ссылку на тестируемый проект
dotnet add tests/Interpreter.Specs/ reference src/Interpreter/

# Добавляем пакеты:
#   - пакет Reqnroll.xUnit также добавляет Reqnroll
#   - пакет xunit.runner.visualstudio обозначает проект как точку входа для тестов
dotnet add tests/Interpreter.Specs/ package xunit.runner.visualstudio --version 2.8.2
dotnet add tests/Interpreter.Specs/ package xunit --version 2.9.3
dotnet add tests/Interpreter.Specs/ package Reqnroll.xUnit --version 3.1.2

Ссылки #

Reqnroll:

  1. Reqnroll Documentation — документация реализации Gherkin для C#
  2. Gherkin Reference

Cucumber:

  1. Installation — список реализаций Gherkin для различных языков.
  2. Gherkin / Reference — описание языка Gherkin на сайте Cucumber.