Параметризация в Gherkin

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


1. Основы параметризации

В Gherkin параметры обозначаются при помощи placeholder’ов, которые заключаются в угловые скобки < >. Эти placeholder’ы заменяются конкретными значениями на этапе выполнения теста.

Пример базовой структуры сценария с параметрами:

Scenario: Авторизация пользователя
  Given пользователь находится на странице входа
  When он вводит логин "<username>" и пароль "<password>"
  Then он видит сообщение "<message>"

В данном примере <username>, <password> и <message> — это параметры, которые можно заменять разными значениями для проверки различных вариантов авторизации.


2. Использование Examples для сценариев

Для передачи значений параметров применяется блок Examples. Каждая строка в блоке Examples соответствует одной итерации сценария с конкретными данными.

Scenario Outline: Проверка авторизации пользователя
  Given пользователь находится на странице входа
  When он вводит логин "<username>" и пароль "<password>"
  Then он видит сообщение "<message>"

Examples:
  | username   | password   | message              |
  | admin      | 12345      | Добро пожаловать     |
  | guest      | guestpass  | Ошибка авторизации   |
  | testuser   | test123    | Добро пожаловать     |
  • Scenario Outline — ключевое слово, позволяющее определить шаблон сценария с параметрами.
  • Каждая строка в таблице Examples создаёт отдельный тест с подставленными значениями.
  • Колонки таблицы соответствуют placeholder’ам в сценарии.

3. Многоуровневая параметризация

Параметры могут использоваться в любых шагах Gherkin: Given, When, Then, а также в And и But. Это позволяет комбинировать различные параметры для более сложных сценариев.

Scenario Outline: Поиск продукта в интернет-магазине
  Given пользователь находится на главной странице
  When он ищет продукт "<product>"
  And выбирает категорию "<category>"
  Then он видит результаты поиска с названием "<product>"

Examples:
  | product     | category   |
  | Ноутбук     | Электроника|
  | Смартфон    | Электроника|
  | Книга       | Литература |

Здесь одна таблица параметров позволяет тестировать различные сочетания продуктов и категорий.


4. Параметры в шагах с множественными значениями

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

Пример с таблицей внутри шага:

Scenario Outline: Добавление нескольких товаров в корзину
  Given пользователь находится на странице товара
  When он добавляет в корзину следующие продукты:
    | product    | quantity |
    | <product1> | <qty1>   |
    | <product2> | <qty2>   |
  Then корзина содержит указанные товары

Examples:
  | product1 | qty1 | product2 | qty2 |
  | Ноутбук  | 1    | Мышь     | 2    |
  | Книга    | 3    | Ручка    | 5    |

5. Особенности использования параметров

  1. Согласованность имен: имена placeholder’ов в сценарии должны полностью совпадать с названиями колонок в Examples.
  2. Форматирование значений: текстовые строки лучше заключать в кавычки, если они содержат пробелы или специальные символы.
  3. Проверка null и пустых значений: допускается передавать пустые строки как параметр ("") для тестирования граничных условий.
  4. Переиспользование сценариев: один шаблон можно применять для большого количества тестовых данных, уменьшая дублирование кода.

6. Интеграция с Protractor

В тестах на Protractor шаги Gherkin связываются с функциями JavaScript через step definitions. Параметры передаются как аргументы функции.

Пример:

const { Given, When, Then } = require('cucumber');

When('он вводит логин {string} и пароль {string}', async function(username, password) {
  await element(by.id('login')).sendKeys(username);
  await element(by.id('password')).sendKeys(password);
  await element(by.id('submit')).click();
});

Then('он видит сообщение {string}', async function(message) {
  const alertText = await element(by.id('alert')).getText();
  expect(alertText).toEqual(message);
});
  • {string} в step definition соответствует <username> и <password> в сценарии.
  • Параметры автоматически передаются при выполнении каждой строки из блока Examples.

7. Практические советы

  • Минимизировать дублирование: использовать Scenario Outline с Examples, вместо копирования сценариев с разными значениями.
  • Ясная структура таблиц: избегать слишком длинных таблиц, разделяя сценарии по логическим группам.
  • Комбинация с Before/After hooks: подготовка данных перед тестом и очистка после него позволяет безопасно использовать одну и ту же таблицу параметров.
  • Гибкость step definitions: использовать регулярные выражения, чтобы один шаг обрабатывал несколько вариантов текста с параметрами.

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