Files
bible/rules/patterns/testing-policy/contract.md
Michael Chus 0005f3e41a Compress always-on contracts and restore pagination fields
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>
2026-06-12 10:05:00 +03:00

3.5 KiB
Raw Blame History

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/.
  • Не использовать реальные сетевые вызовы и реальную БД в юнит-тестах.

Мейнтейнс

  • Сломанный тест — чинится или удаляется в том же коммите где сломался.
  • Закомментированный тест — не допускается. Если тест неактуален — удалить.
  • Тест, проверяющий удалённую функциональность — удалить вместе с функциональностью.
  • При удалении функциональности — удалить соответствующие тесты в том же коммите.