Gherkin синтаксис

Gherkin — это язык, используемый для описания требований к программному обеспечению в формате, понятном как для технических специалистов, так и для бизнес-пользователей. Он лежит в основе Behavior Driven Development (BDD) и позволяет создавать сценарии тестирования, которые становятся одновременно документацией и тестами. В контексте Protractor Gherkin используется вместе с библиотеками вроде Cucumber.js для автоматизации E2E-тестов веб-приложений на Angular и других фреймворках.


Основные конструкции Gherkin

Feature

Feature описывает функциональность, которую необходимо протестировать. Каждая feature-файл начинается с этой ключевой метки и краткого описания. Пример:

Feature: Авторизация пользователя
  Проверка возможности входа в систему с корректными учетными данными.

Особенности:

  • Описание feature должно быть понятным и лаконичным.
  • Несколько сценариев (Scenario) могут относиться к одной feature.

Scenario

Scenario представляет конкретный тестовый сценарий — последовательность шагов, которую необходимо выполнить для проверки функциональности.

Scenario: Успешный вход в систему
  Given я нахожусь на странице входа
  When я ввожу корректные логин и пароль
  Then я вижу главную страницу пользователя

Особенности:

  • Каждый scenario должен быть независимым.
  • Сценарии можно группировать в один feature-файл по логическому признаку.

Scenario Outline

Scenario Outline используется для параметризованных тестов, когда один сценарий нужно проверить с разными данными.

Scenario Outline: Вход в систему с различными учетными данными
  Given я нахожусь на странице входа
  When я ввожу <логин> и <пароль>
  Then я вижу сообщение <результат>

  Examples:
    | логин       | пароль   | результат                 |
    | user1       | pass123  | Добро пожаловать, user1  |
    | invalidUser | wrong    | Ошибка авторизации        |

Особенности:

  • Таблица Examples позволяет многократно запускать один сценарий с разными данными.
  • Параметры обозначаются угловыми скобками <...>.

Шаги сценариев

Given, When, Then

Эти ключевые слова определяют поведение теста:

  • Given — задает начальные условия.
  • When — описывает действие пользователя.
  • Then — проверяет ожидаемый результат.

Дополнительно используются:

  • And и But — для логического расширения шагов без повторения ключевого слова.
Given я нахожусь на главной странице
And я вижу форму поиска
When я ввожу "Protractor"
Then я вижу список результатов поиска
But результат "Пример" отсутствует

Best practices

  • Шаги должны быть максимально читаемыми и описательными.
  • Не стоит включать сложную логику в текст сценария; она реализуется в step definitions на JavaScript.
  • Шаги должны быть повторно используемыми между сценариями.

Step Definitions в Protractor

Step definitions связывают Gherkin-шаги с JavaScript-кодом. Они реализуются через Cucumber.js и Protractor API.

const { Given, When, Then } = require('@cucumber/cucumber');
const { browser, element, by } = require('protractor');

Given('я нахожусь на странице входа', async function () {
  await browser.get('http://example.com/login');
});

When('я ввожу корректные логин и пароль', async function () {
  await element(by.id('username')).sendKeys('user1');
  await element(by.id('password')).sendKeys('pass123');
  await element(by.id('loginButton')).click();
});

Then('я вижу главную страницу пользователя', async function () {
  const title = await browser.getTitle();
  if (title !== 'Главная') {
    throw new Error('Страница не соответствует ожидаемой');
  }
});

Особенности:

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

Использование тегов

Теги (@) позволяют группировать сценарии для выборочного запуска. Например:

@smoke
Scenario: Успешный вход
  Given я нахожусь на странице входа
  When я ввожу корректные логин и пароль
  Then я вижу главную страницу пользователя

Запуск тестов с тегом в Protractor через Cucumber.js:

npx cucumber-js --tags "@smoke"

Особенности:

  • Теги помогают организовать тесты по приоритетам, типам тестирования (smoke, regression, critical).
  • Возможны сложные выражения с логическими операторами: @smoke and not @wip.

Структура проекта с Gherkin и Protractor

  • features/ — директория с feature-файлами.
  • features/step_definitions/ — папка со step definitions.
  • protractor.conf.js — конфигурация Protractor, интеграция с Cucumber.

Пример minimal конфигурации:

exports.config = {
  framework: 'custom',
  frameworkPath: require.resolve('protractor-cucumber-framework'),
  specs: ['features/*.feature'],
  cucumberOpts: {
    require: ['features/step_definitions/*.js'],
    strict: true
  },
  capabilities: {
    browserName: 'chrome'
  }
};

Советы по эффективной работе с Gherkin

  • Держать сценарии короткими и конкретными.
  • Избегать технических деталей в feature-файлах, фокус на бизнес-логике.
  • Использовать reusable steps для уменьшения дублирования кода.
  • Поддерживать актуальность описаний при изменении функциональности.

Эта дисциплина позволяет создавать читабельные, поддерживаемые и автоматизированные тесты, полностью интегрированные с Protractor и современными веб-приложениями.