Стратегия тестирования — пирамида unit/integration/e2e, что мокать (границы I/O) а что нет (домен, своя БД в integration), осмысленные пороги покрытия, AAA/given-when-then, критерии хорошего теста, причины flaky → фиксы. Use при проектировании/ревью тестов, выборе уровня и лечении нестабильных.
Installs into .claude/skills of the current project.
Are you the author of Testing Strategy?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/vitammiin-testing-strategy)
---
name: testing-strategy
description: Стратегия тестирования — пирамида unit/integration/e2e, что мокать (границы I/O) а что нет (домен, своя БД в integration), осмысленные пороги покрытия, AAA/given-when-then, критерии хорошего теста, причины flaky → фиксы. Use при проектировании/ревью тестов, выборе уровня и лечении нестабильных.
---
# Навык: Стратегия тестирования
**Зелёный прогон — единственное доказательство.** Новый тест сначала покажи красным: никогда не падавший тест ничего не проверяет.
## Пирамида
- **Unit** (Vitest/Jest/node:test): чистая логика, ветвления, границы, ошибки — основная масса.
- **Integration** (Supertest/`app.inject()`, testcontainers): связка роут → сервис → БД, контракты API.
- **E2E** (Playwright): только критический путь пользователя.
Проверяй на самом низком уровне, где ошибка воспроизводима. Раннер определяй по `package.json` — не навязывай свой.
## Мокать / не мокать
Мокать: границы I/O — сеть (MSW/nock), сторонние API, время (fake timers), random (сид), env. НЕ мокать: свою доменную логику; свою БД в integration (testcontainers/тест-БД, никогда dev/prod); внутренние модули «для скорости». Перемокал — тест проверяет моки, а не код.
## Покрытие — осмысленно
Деньги/авторизация/безопасность/запись данных → ~100% branch; домен → 80–90%; UI-обвязка/конфиг/генерируемое → ниже или исключить. «80% везде» — антипаттерн (рождает тесты геттеров); **branch важнее line**.
## Структура и качество
AAA (Arrange → Act → Assert) или given-when-then; имя — спецификация «что делает при каком условии»; один логический assert. Хороший тест: падает по одной причине; не зависит от порядка (сам создаёт и убирает данные); детерминирован (время/random/сеть под контролем); проверяет поведение, не реализацию.
## Flaky → фиксы
sleep → событийное ожидание (`waitFor`/web-first assertions); shared state → изоляция данных на тест (rollback/truncate); время → fake timers; random → сид; race в async → найти (часто баг прод-кода — чини код); утечки ресурсов → `afterEach`/`finally`. Flaky — баг, не повод для retry. Доказательство лечения: 10 зелёных прогонов подряд, включая перемешанный порядок (`--sequence.shuffle`/`--randomize`).