Skip to main content

🧬 Итерация 7: @BeforeAll, @AfterAll, @Setup(params) — масштабирование сценариев

🎯 Цель

Добавить поддержку жизненного цикла на уровне класса (@BeforeAll, @AfterAll)
и параметризированной подготовки данных (@Setup(params)).


🧠 Проблема

Когда у нас появляются десятки сценариев:

  • многие требуют авторизации (но не хочется логиниться 10 раз)
  • каждый сценарий может требовать временных сущностей (юзеры, сессии)
  • @Setup() не знает, какие параметры передаются через .each()

✅ Что добавили

  • @BeforeAll() — выполняется один раз до всех тестов класса
  • @AfterAll() — выполняется один раз после всех тестов класса
  • @Setup(params) — теперь получает параметры из @TestCase.each([...])

📦 Пример

@Context()
ctx!: { email?: string; status?: number; token?: string; log?: string[] }

@BeforeAll()
initSuite() {
this.ctx.log = ['🚀 Начинаем']
}

@AfterAll()
finishSuite() {
this.ctx.log?.push('🏁 Конец')
attach('Лог', this.ctx.log?.join('\n') ?? '', 'text/plain')
}

@Setup()
prepare([email, expectedStatus]) {
this.ctx.email = email
this.ctx.status = expectedStatus
this.ctx.token = email + '-token'
this.ctx.log?.push(`🔧 Подготовка: ${email}`)
}

🤔 А откуда params в @Setup()?

Если используется @TestCase.each(...), мы передаём параметры прямо в @Setup():

@Setup()
prepare([email, status]) { ... } // email и статус приходят из each()

Если используется обычный @TestCase(...)@Setup() вызывается без параметров.


📊 Сравнение с итерацией 6

Жизненный циклДля чегоПоведение
@Setup()Подготовка перед каждымРаботает как beforeEach()
@Setup(params)Подготовка с параметрамиРаботает с .each()
@BeforeAll()Общая инициализацияОдин раз на весь класс
@AfterAll()Завершение, очисткаОдин раз после всех

📌 Что это даёт

  • Сокращаем дублирование (login, createProject)
  • Повышаем читабельность (@Setup([email, status]))
  • Строим классический e2e lifecycle
  • Улучшаем Allure-репорты с attach(log)

🚀 Следующий шаг

  • @Step() для методов
  • Переиспользуемые шаги в стиле Playwright / Serenity