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 разделяются на три группы:
Given(Пусть) — шаги предварительной настройки, используют глаголы в прошедшем времениWhen(Когда) — шаги действий, используют глаголы в настоящем времени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 --> SUTReqnroll для C# #
Исторически для C# есть особенная реализация Gherkin — фреймворк Reqnroll (бывш. Specflow). Его особенность в двухэтапной обработке Gherkin:
- Сначала тест собирается
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:
- Reqnroll Documentation — документация реализации Gherkin для C#
- Gherkin Reference
Cucumber:
- Installation — список реализаций Gherkin для различных языков.
- Gherkin / Reference — описание языка Gherkin на сайте Cucumber.