Тестирование
Пирамида тестов
╱ E2E ╲ ← Мало, дорогие, медленные
╱───────╲
╱ Integr. ╲ ← Средне
╱───────────╲
╱ Unit Tests ╲ ← Много, дешёвые, быстрые
╱─────────────────╲Модульные тесты
Требования
- Покрытие бизнес-логики: ≥ 80%
- Быстрые: весь набор unit-тестов < 30 секунд
- Изолированные: не зависят от внешних сервисов, БД, сети
- Детерминированные: один и тот же результат при каждом запуске
Практики
- Паттерн Arrange → Act → Assert
- Один тест — один сценарий
- Мокаем внешние зависимости через интерфейсы
- Тестовые имена описывают сценарий:
TestPayment_WhenInsufficientFunds_ReturnsError
Инструменты
| Платформа | Фреймворк |
|---|---|
| Go | testing + testify |
| TypeScript | Jest / Vitest |
| Swift | XCTest |
| Kotlin | JUnit 5 + MockK |
Интеграционные тесты
Требования
- Проверяют взаимодействие между компонентами
- Используют реальные (или контейнеризированные) зависимости
- Запускаются в CI на каждый PR
Практики
- Testcontainers для запуска БД и сервисов
- Отдельный CI-стейдж для интеграционных тестов
- Каждый тест создаёт и очищает свои данные
E2E-тесты
Требования
- Покрывают критические пользовательские сценарии
- Запускаются на staging перед релизом
- Максимум 20-30 сценариев (самые важные)
Практики
- Page Object / Screen Object паттерн
- Стабильные тестовые данные (fixtures/seeds)
- Retry-механизм для flaky-тестов (но flaky — сигнал к починке)
Когда НЕ нужны тесты
- Тривиальные getter/setter без логики
- Сгенерированный код (protobuf, swagger)
- Конфигурационные файлы
Метрики качества тестов
| Метрика | Целевое значение |
|---|---|
| Code Coverage (unit) | ≥ 80% |
| Mutation Score | ≥ 60% |
| Flaky Test Rate | < 1% |
| CI Test Duration | < 10 мин |