Skip to content

Unit tests — что и как покрывать

Статья для людей. Для агентов и IDE: skill introvert-testing и файл coverage.md в той же папке skill.

Принцип

Каждый тест должен отвечать на вопрос: какую регрессию он поймает?

Не пишем тесты «на каждый новый метод» и не проверяем, что stub вернул захардкоженную строку.

Когда тест нужен

СлойПримеры
Domain / чистая логикапарсинг, фильтры, границы, state machine
Remote repositoryмаппинг ошибок (401, timeout), DTO → entity, cache fallback
Converternull, unknown enum, вложенные поля
Providerтолько если есть логика поверх вызова репозитория
Driftмиграции, нетривиальные DAO-запросы
UIgolden в Sandbox или Marionette smoke

Когда тест не нужен

  • Stub/fake просто возвращает константу
  • Provider — одна строка repo.call().toValue()
  • Сгенерированный код (Freezed, routes, Pigeon, Drift)
  • «Метод вернул ok» без проверки смысла

Стиль в репозитории

  • Assertions: package:checks/checks.dart
  • Имена тестов — по поведению: maps 401 to NotAuthenticatedFailure
  • Образцы: features/banners/test/home_banners_test.dart, features/core/test/iterable/range_test.dart

Запуск

bash
melos test
fvm flutter test path/to/single_test.dart

Подробные сценарии и антипаттерны — в .cursor/skills/introvert-testing/coverage.md.

Авторы

The avatar of contributor named as Vadim Melnikov Vadim Melnikov

История