Technical Design: High-Fidelity Testing & Canary Package Pattern
1. Мотивация
При разработке системных инструментов, таких как HSM, критически важно гарантировать, что конфигурация (переменные окружения, зависимости) не просто «собрана в словарь», а реально доходит до конечного исполнителя:
- менеджера библиотек (уровень 1)
- системы сборки библиотек (уровень 2)
- рантайма сервиса (уровень 3).
Традиционные Unit-тесты проверяют только «намерение» (Intent) — корректность формирования данных в коде.
При High-Fidelity Testing проверяется «эффект» (Effect) — реальное изменение состояния системы.
2. Паттерн «Библиотека-канарейка» (Canary Library)
2.1. Концепция
«Канарейка» — это минимальная Python-библиотека, которая служит индикатором целостности среды. Его единственная задача — вызвать ошибку сборки или запуска, если условия среды не соответствуют ожидаемым.
2.2. Уровни проверки
Уровень 1: Intent (Намерение)
Проверка формирования данных внутри кода HSM.
- Инструмент: Стандартные Unit-тесты (pytest).
- Цель: Убедиться, что
SyncEngineправильно собрал итоговый словарьenv_varsи списокdependenciesиз всех источников (Manifest + Source + Implies), включая механизм Implication Merging.
Уровень 2: Build-time (Сборка) — High-Fidelity
Проверяет путь переменных окружения через всю цепочку:
HSM SyncEngine -> Adapter -> Subprocess -> uv/pixi -> Build Backend (Hatchling).
- Зачем: Многие переменные (например,
CUDA_HOME,API_KEYSдля приватных индексов) нужны именно в момент установки. Если они не дойдут до процесса сборки, пакет не будет установлен. - Реализация: Использование бэкенда Hatchling с
build-hooks. Код хука проверяетos.getenv()и выбрасываетRuntimeError, если переменная отсутствует.
Уровень 3: Runtime (Выполнение) — High-Fidelity
Проверяет сохранность контекста после успешной установки.
- Зачем: Убедиться, что рантайм сервиса (например, запущенный через
uv run) наследует те же переменные, что были заданы при синхронизации. - Реализация: Проверка
os.getenv()вentrypointили__init__.pyпакета.
3. Применимость для «закрытых» рантаймов
Такие инструменты, как uv_build, могут не позволять запускать произвольный код во время сборки (для скорости). Однако:
- Если мы доказали на примере «прозрачного» Hatchling, что HSM корректно передает ENV в системный вызов
subprocess.run. - Значит, системная plumbing проложена верно.
- Любой другой инструмент (
uv,docker), запущенный HSM, гарантированно получит тот же набор данных от ОС.
4. Паттерн Local-Remote (Git)
Для тестирования материализации из Git используется создание временных локальных репозиториев.
- Принцип: Git — распределенная система. Папка на диске с
.gitявляется полноценным «удаленным» сервером для командыclone. - Преимущества: 100% автономность тестов, отсутствие зависимости от сети, возможность имитировать любые состояния репозитория (ветки, теги, конфликты).
5. Заключение
Комбинация Canary Package и Local-Remote позволяет HSM гарантировать работоспособность в реальных условиях эксплуатации, не полагаясь на хрупкие моки и предположения о поведении внешних инструментов.