Что такое Feature file и Step Definition в Cucumber?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Основные компоненты 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, клики по веб-элементам, проверки с помощью ассертов, работа с базой данных и т.д.
Взаимодействие и процесс исполнения
- Запуск: Cucumber читает
.featureфайл. - Парсинг: Он разбирает сценарии на отдельные шаги.
- Сопоставление (Matching): Для каждого шага ищется метод Step Definition, чье регулярное выражение совпадает с текстом шага.
- Исполнение (Execution): Выполняется соответствующий метод, в который передаются извлеченные параметры.
- Отчет (Reporting): Результат (успех/провал) каждого шага выводится в отчет, сохраняя связь с исходным текстом на естественном языке.
Таким образом, Feature File служит для документирования и спецификации требований в доступной форме, а Step Definition — для их технической реализации и автоматизации. Это разделение позволяет поддерживать актуальность тестов при изменении кода приложения и наоборот, а также обеспечивает общее понимание проекта всеми членами команды.