Skip to main content

🎯 Итерация 8: @Step, @Scenario() и автономные классы шагов

Цель

Выделить шаги сценария в отдельный класс, сделать их читаемыми, переиспользуемыми и автоматически выполняемыми в Allure-отчётах — без ручного вызова step(...) и без boilerplate-кода runAllSteps().


Решение

1. @Step() — помечает любой метод как шаг для Allure

@Step('Проверка email')
async checkEmail() { ... }

2. @Scenario() — помечает класс, в котором шаги должны выполняться последовательно

@Scenario()
class AccessSteps { ... }

3. runSteps(instance, ctx) — универсальный раннер для таких классов

await runSteps(AccessSteps, this.ctx)

Что мы сделали

  • ✅ Создали @Step() — минимальный декларативный шаг
  • ✅ Добавили @Scenario() — метку класса для автоматического исполнения
  • ✅ Написали runSteps() — запуск шагов по порядку
  • ✅ Добавили поддержку @Context() внутри step-класса

Пример использования

@Scenario()
class AccessSteps {
@Context()
ctx!: { email?: string; token?: string; status?: number }

@Step('Проверка email')
async checkEmail() {
expect(this.ctx.email).toMatch(/@example\.com/)
}

@Step('Проверка токена')
async checkToken() {
expect(this.ctx.token).toBe(this.ctx.email + '-token')
}
}

И в тесте:

await runSteps(AccessSteps, this.ctx)

Что это даёт?

  • 🧩 Выделить шаги в отдельные модули (шаги = lego-блоки сценария)
  • ♻️ Использовать один и тот же набор шагов в разных сценариях и классах
  • 🧠 Читаемые отчёты Allure с понятными шагами
  • 🎯 Автоматическое исполнение — порядок = порядок в коде
  • 🚀 Запускать шаги автоматически, без ручного вызова — даже в других раннерах

Это решение вдохновлено практиками Serenity и Playwright, но адаптировано под декларативный DSL.


Идея на будущее

Можно автоматически вызывать шаги по условию, по профилю, по пользовательской логике.
Этот фундамент пригодится нам и для более сложных кейсов: например, вложенных шагов, UI-цепочек, сценариев c branching.


🧠 Ключевая мысль

@Step + @Scenario() превращают набор методов в декларативный сценарий.
runSteps() — ваш сценарный раннер.