🔁 Итерация 3: параметризация тестов с @TestCase.each
Один из самых частых паттернов в автотестах — проверка одного сценария с разными данными.
Vitest умеет test.each(...)
, но наш DSL — тоже.
🧩 Цель
- Добавить
@TestCase.each([...])
— для генерации множественных тестов - Автоматически передавать параметры в метод
- Фиксировать значения в отчёте через
allure.parameter
📦 Как выглядит
@Feature('Авторизация')
class AuthTests {
@TestCase.each([
['admin@example.com', 'admin123', 200],
['user@example.com', 'user123', 200],
['hacker@example.com', 'wrongpass', 401],
])('Логин для %s', async (email, password, expectedStatus) => {
const res = await axios.post('/login', { email, password })
expect(res.status).toBe(expectedStatus)
})
}
✅ Что происходит:
- Генерируются 3 отдельных теста с названиями:
Логин для admin@example.com
- ...
- Аргументы
email
,password
,expectedStatus
передаются в метод - Allure фиксирует параметры:
param1 = admin@example.com
param2 = admin123
param3 = 200
🧠 Любое количество аргументов
Метод получает столько аргументов, сколько указано в .each()
:
@TestCase.each([
['admin', '123', 'desktop', true],
['guest', 'qwerty', 'mobile', false]
])('Попытка входа: %s', async (login, pass, platform, expected) => {
// все аргументы приходят как есть
})
DSL не ограничивает количество параметров — работает как
(...args) => {}
📈 Выгода:
- Читаемость и лаконичность
- Единая точка теста и данных
- Allure отображает параметры и шаги для каждого случая
- Работает с
step()
иattach()
🎯 Результат
Теперь наш DSL поддерживает один из самых частых паттернов в тестировании.
В следующей итерации — @BeforeEachCase
, хуки и re-use шагов.
💭 «Постойте… А чем это лучше обычного test.each
?»
Отличный вопрос.
Вы, скорее всего, сейчас думаете:
«Окей, я вижу
@TestCase.each
, красиво, декларативно…
Но ведь у Vitest уже естьtest.each(...)
— разве не то же самое?»
Разберём по полочкам.
🤜 test.each — это удобно. Но…
Когда вы пишете так:
test.each([
['email1', 'pass1', 200],
['email2', 'pass2', 401],
])('Login for %s', ...)
— вы получаете быстрый, минималистичный тест.
Но что если вы хотите:
- Подсветить фичу (
@Feature('Авторизация')
) - Повесить ID на тест (
AS_ID
,TMS
,Issue
) - Проставить severity или owner
- Сделать структурированные шаги внутри отчёта
- Приложить response JSON в Allure
Всё это вам придётся делать вручную, с кучей allure.label(...)
, allure.step(...)
и allure.attachment(...)
.
🎯 А вот @TestCase.each
— уже про сценарии
@TestCase.each([
['admin@example.com', 'admin123', 200],
['user@example.com', 'user123', 200],
])('Логин для %s', { severity: 'critical' })
async login(email, password, expectedStatus) {
...
}
И вы получаете:
- ✅ Один метод → несколько кейсов
- ✅ Метки (
severity
,feature
) — встроены - ✅ Название кейса — шаблонное
- ✅ Параметры отображаются в Allure
- ✅ Весь отчёт структурирован: шаги, вложения, параметры
📊 Сравнение
Параметр | test.each(...) | @TestCase.each(...) |
---|---|---|
Краткость | ✅ | ✅ |
Структура отчёта | ❌ | ✅ |
Метки, severity | ❌ | ✅ |
Шаблон названия | ✅ | ✅ |
Поддержка классов | ❌ | ✅ |
Расширяемость | ⚠️ Ограничена | ✅ Управляемая |
Интеграция с TestOps | ❌ | ✅ |
💡 Модель мышления | Функция | Тест-кейс |
💡 Вывод
Если вы просто хотите повторить тест 3 раза — test.each
вас спасёт.
Но если вы описываете бизнес-сценарии, хотите качественные отчёты и масштабируемый DSL,
то @TestCase.each
— это уже язык, а не просто удобная функция.
По сути, мы создаём структурированный тестовый фреймворк на базе Vitest,
не конкурируя с ним, а надстраивая декларативный слой.