🔁 Итерация 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.comparam2 = admin123param3 = 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,
не конкурируя с ним, а надстраивая декларативный слой.