The always-on set is paid by every session, so it gets the tightest form: git-sync-check shrinks to its procedural core, testing-policy moves the table-test example to README.md and folds the agent instructions into the rules, go-code-style inlines the error-wrapping example. Per-session read cost drops from 403 to 336 lines. Also restore the pagination response fields in table-management: the previous dedup replaced them with a reference to go-api, which the table router line does not load. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
48 lines
3.5 KiB
Markdown
48 lines
3.5 KiB
Markdown
# Contract: Testing Policy
|
||
|
||
Version: 1.2
|
||
|
||
## Purpose
|
||
|
||
Определяет когда писать тесты, когда не писать, и как их поддерживать.
|
||
Применяется ко всем проектам на Go. Агенты следуют этим правилам самостоятельно,
|
||
без запроса подтверждения. See `README.md` for a reference table test.
|
||
|
||
## Когда тест обязателен
|
||
|
||
Тест пишется всегда, когда код делает нетривиальное преобразование данных или реализует бизнес-логику:
|
||
|
||
- **Парсеры** — любой код, читающий внешний формат (XML, JSON, CSV, бинарный)
|
||
- **Трансформации** — конвертация единиц, нормализация, маппинг полей
|
||
- **Бизнес-правила** — расчёты, фильтрация, агрегация, приоритизация
|
||
- **Граничные случаи** — пустой ввод, нулевые значения, переполнение, отсутствующие поля
|
||
- **Degraded / legacy states** — legacy schema, interrupted migrations, duplicates, invalid persisted rows, partially migrated tables
|
||
- **Регрессии** — если баг был найден, тест фиксирует его до исправления
|
||
|
||
Тест пишется в том же коммите, что и функциональность. Функциональность без теста (там где он обязателен) — неполный коммит.
|
||
|
||
Для local-first desktop приложений правила деградированных состояний и recovery-тестов определяются также `local-first-recovery` contract.
|
||
|
||
## Когда тест не нужен
|
||
|
||
Тест не пишется на код, где он не даёт ценности. Не писать его и не упоминать его отсутствие:
|
||
|
||
- Геттеры и сеттеры: `func (s *Server) Port() int { return s.port }`
|
||
- Конфиг-структуры и константы
|
||
- Тривиальный клей: передача параметров, инициализация, dependency wiring
|
||
- Логирование и форматирование вывода
|
||
- HTTP-хендлеры без бизнес-логики (только роутинг и вызов сервиса)
|
||
|
||
## Структура теста
|
||
|
||
- Стандартный Go `testing`. Табличные тесты (`[]struct{ ... }`) — когда случаев больше двух.
|
||
- Фикстуры (XML, JSON, бинарные данные) — инлайн-константы или файлы в `testdata/`.
|
||
- Не использовать реальные сетевые вызовы и реальную БД в юнит-тестах.
|
||
|
||
## Мейнтейнс
|
||
|
||
- Сломанный тест — чинится или удаляется в том же коммите где сломался.
|
||
- Закомментированный тест — не допускается. Если тест неактуален — удалить.
|
||
- Тест, проверяющий удалённую функциональность — удалить вместе с функциональностью.
|
||
- При удалении функциональности — удалить соответствующие тесты в том же коммите.
|