← Назад к вопросам

Что такое Feature file и Step Definition в Cucumber?

2.0 Middle🔥 191 комментариев
#Теория тестирования#Фреймворки тестирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Основные компоненты Cucumber: Feature File и Step Definition

В контексте BDD-фреймворка Cucumber, Feature File (файл функций) и Step Definition (определения шагов) являются двумя фундаментальными, взаимосвязанными компонентами, которые реализуют принцип «описания поведения на естественном языке». Они разделяют бизнес-логику (что тестируем) от технической реализации (как тестируем).

Feature File: Описание поведения на естественном языке

Feature File — это текстовый файл с расширением .feature, написанный на языке Gherkin. Его цель — описать функциональность приложения в виде сценариев, понятных как техническим, так и нетехническим участникам проекта (аналитикам, менеджерам, тестировщикам, разработчикам).

Структура и ключевые слова Gherkin в Feature File:

# language: ru
Функция: Перевод средств между счетами
  Чтобы управлять своими финансами
  Как пользователь банка
  Я хочу переводить деньги со своего счета на другой

  Контекст: У пользователя есть счет с достаточным балансом
    Дано на моем основном счете есть 10000 рублей

  Сценарий: Успешный перевод указанной суммы
    Когда я перевожу 2000 рублей на счет получателя "Иванов Иван"
    Тогда баланс моего основного счета должен быть 8000 рублей
    И на счету "Иванов Иван" должно быть зачислено 2000 рублей

  Сценарий: Неудачный перевод из-за недостатка средств
    Когда я пытаюсь перевести 15000 рублей на счет "Петров Петр"
    Тогда я должен увидеть сообщение "Недостаточно средств на счете"
    И баланс моего счета не должен измениться
  • Функция (Feature): Высокоуровневое описание тестируемой бизнес-функции.
  • Сценарий (Scenario): Конкретный пример поведения, тестовый случай. Часто используются Сценарий Outline (Scenario Outline) с примерами (Examples) для параметризованного тестирования.
  • Шаги (Steps): Описание действий и проверок с помощью ключевых слов:
    *   `Дано (Given)` — начальное состояние системы, предусловия.
    *   `Когда (When)` — ключевое действие, выполняемое пользователем.
    *   `Тогда (Then)` — ожидаемый результат, проверка.
    *   `И (And)`, `Но (But)` — для связки нескольких шагов одного типа.

Главная задача Feature File — служить живой документацией и спецификацией, которая одновременно является исполняемым тестом.

Step Definition: Техническая реализация шагов

Step Definition (или Step Definitions) — это код (на Java, JavaScript, Python и др.), который связывает шаги на естественном языке из .feature файла с конкретными командами и проверками в коде. Это «мост» между декларативным описанием и программным исполнением.

Каждый шаг (Дано, Когда, Тогда) должен быть сопоставлен с методом (функцией), содержащим реализацию на языке программирования.

Пример Step Definitions на Java:

package stepdefinitions;

import io.cucumber.java.ru.*;
import static org.junit.jupiter.api.Assertions.*;

public class TransferSteps {
    private Account myAccount;
    private Account recipientAccount;
    private String lastErrorMessage;

    @Дано("на моем основном счете есть {int} рублей")
    public void на_моем_основном_счете_есть_рублей(int initialBalance) {
        myAccount = new Account("Мой счет", initialBalance);
    }

    @Когда("я перевожу {int} рублей на счет получателя {string}")
    public void я_перевожу_рублей_на_счет_получателя(int amount, String recipientName) {
        recipientAccount = new Account(recipientName, 0);
        myAccount.transferTo(recipientAccount, amount);
    }

    @Тогда("баланс моего основного счета должен быть {int} рублей")
    public void баланс_моего_основного_счета_должен_быть_рублей(int expectedBalance) {
        assertEquals(expectedBalance, myAccount.getBalance());
    }

    @Тогда("на счету {string} должно быть зачислено {int} рублей")
    public void на_счету_должно_быть_зачислено_рублей(String accountName, int expectedBalance) {
        assertEquals(expectedBalance, recipientAccount.getBalance());
        assertEquals(accountName, recipientAccount.getOwner());
    }

    @Когда("я пытаюсь перевести {int} рублей на счет {string}")
    public void я_пытаюсь_перевести_рублей_на_счет(int amount, String recipientName) {
        recipientAccount = new Account(recipientName, 0);
        try {
            myAccount.transferTo(recipientAccount, amount);
        } catch (InsufficientFundsException e) {
            lastErrorMessage = e.getMessage();
        }
    }

    @Тогда("я должен увидеть сообщение {string}")
    public void я_должен_увидеть_сообщение(String expectedMessage) {
        assertEquals(expectedMessage, lastErrorMessage);
    }
}

Ключевые аспекты Step Definitions:

  • Связывание (Glue): Аннотации (@Дано, @Когда, @Тогда) содержат регулярное выражение или строку, которая точно соответствует тексту шага в .feature файле. Cucumber использует это для сопоставления.
  • Параметры: Данные из шагов (например, {int}, {string}) автоматически извлекаются и передаются в метод как аргументы.
  • Контекст (World): Состояние (как в примере: myAccount, lastErrorMessage) обычно хранится в полях класса Step Definitions или в специальном объекте контекста, чтобы делиться данными между разными шагами внутри одного сценария.
  • Реализация: Внутри методов содержится тестовый код — вызовы API, клики по веб-элементам, проверки с помощью ассертов, работа с базой данных и т.д.

Взаимодействие и процесс исполнения

  1. Запуск: Cucumber читает .feature файл.
  2. Парсинг: Он разбирает сценарии на отдельные шаги.
  3. Сопоставление (Matching): Для каждого шага ищется метод Step Definition, чье регулярное выражение совпадает с текстом шага.
  4. Исполнение (Execution): Выполняется соответствующий метод, в который передаются извлеченные параметры.
  5. Отчет (Reporting): Результат (успех/провал) каждого шага выводится в отчет, сохраняя связь с исходным текстом на естественном языке.

Таким образом, Feature File служит для документирования и спецификации требований в доступной форме, а Step Definition — для их технической реализации и автоматизации. Это разделение позволяет поддерживать актуальность тестов при изменении кода приложения и наоборот, а также обеспечивает общее понимание проекта всеми членами команды.

Что такое Feature file и Step Definition в Cucumber? | PrepBro