- Replace all occurrences of 'ss-tools' with 'superset-tools' in 104 files - Rename git bundle file ss-tools.bundle → superset-tools.bundle - Update .gitignore pattern accordingly - Preserve variable names (hasSsTools etc.) and code identifiers
6.6 KiB
[DEF:ADR-0013:ADR]
@STATUS ACTIVE
@PURPOSE Зафиксировать архитектурное решение об автоматизации сбора покрытия кода, генерации сводного HTML-отчёта и интеграции скрипта scripts/coverage-summary.sh в процесс разработки.
@RELATION DEPENDS_ON -> [ADR-0001-module-layout]
@RELATION DEPENDS_ON -> [ADR-0006-frontend-architecture]
@RELATION DEPENDS_ON -> [ADR-0011-async-backend]
@RELATION DEPENDS_ON -> [ADR-0012-superset-testcontainers]
@RATIONALE Проект superset-tools состоит из двух независимых стеков (Python/FastAPI backend, Svelte frontend), каждый со своим инструментом покрытия (coverage.py, vitest/v8). Разработчику приходится запускать их по отдельности и вручную сопоставлять результаты. Без единого скрипта: (a) покрытие проверяется нерегулярно, (b) регрессии покрытия остаются незамеченными до CI, (c) новые разработчики тратят время на изучение двух разных команд.
@RATIONALE Единый скрипт scripts/coverage-summary.sh решает эти проблемы: (a) одна команда для полного цикла, (b) сводный HTML с визуальным статусом каждого стека, (c) парсинг результатов тестов и процентов покрытия в машиночитаемом виде, (d) детализированные HTML-отчёты coverage по каждому стеку.
Решение
Создан скрипт scripts/coverage-summary.sh, который:
1. Запуск backend-тестов
- Режим integration (по умолчанию):
pytest tests/integration/ --run-integration --cov=src— требует Docker + Testcontainers PostgreSQL - Режим unit:
pytest tests/ --ignore=tests/integration/ --cov=src— SQLite на tempfile, без Docker - Парсинг: строка
TOTALиз coverage.py → statements, missed, процент - Парсинг: строка вида
X passed, Y failed→ количество тестов
2. Запуск frontend-тестов
vitest run --coverage --coverage.reportOnFailureс v8 provider- Парсинг: строка
All files | % Stmts | % Branch | % Funcs | % Linesиз текстового репортера - Парсинг: строка
Tests: X passed, Y failed→ количество тестов
3. Генерация сводного HTML
Единый index.html со:
- Status bar: Overall / Backend / Frontend (цвета: success/failed)
- Карточка каждого стека: тесты (pass/total), покрытие (%), statements/missed
- Для frontend: Statements, Branch, Functions, Lines с цветовой индикацией (зелёный ≥80%, оранжевый 50-79%, красный <50%)
- Сводная таблица Combined Summary
- Ссылки на детализированные HTML-отчёты coverage каждого стека
- Timestamp генерации
4. Режимы запуска
| Флаг | Описание |
|---|---|
| (без флагов) | Backend integration + frontend |
--unit |
Backend unit (SQLite) + frontend |
--backend-only |
Только backend |
--frontend-only |
Только frontend |
--backend-only --unit |
Только backend unit |
--skip-integration |
Только frontend (backend пропущен) |
--output-dir <path> |
Директория отчёта (по умолч. coverage-summary/) |
Альтернативы
@REJECTED Интеграция в CI (GitHub Actions) на данном этапе
Отвергнуто, так как проект ещё не имеет CI-инфраструктуры. Скрипт спроектирован так, чтобы его можно было легко запускать как локально, так и в CI. Добавление CI-шага будет выполнено отдельным ADR.
@REJECTED Единый инструмент покрытия (pytest-cov + vitest в одном плагине)
Отвергнуто из-за разной природы инструментов: coverage.py и vitest/v8 несовместимы на уровне форматов данных. Вместо этого используется гибридный подход: каждый инструмент генерирует свой HTML, а сводка собирается в единый индекс.
@REJECTED Замена vitest/v8 на istanbul
Отвергнуто: v8 provider работает быстрее (@vitest/coverage-v8 уже установлен). Istanbul (@vitest/coverage-istanbul) доступен как опция, но не является default.
Детали реализации
Парсинг coverage.py
TOTAL 34845 18112 48%
Парсятся через awk: statements (колонка 2), missed (колонка 3), процент (колонка 4).
Парсинг vitest
All files | 99.25 | 87.39 | 98.91 | 99.48
Парсятся через awk -F'|': Stmts, Branch, Funcs, Lines.
Файловая структура отчёта
coverage-summary/
├── index.html # Сводный отчёт
├── backend/ # HTML от coverage.py
│ ├── index.html
│ ├── ...
│ └── pytest_output.txt # Raw вывод pytest
└── frontend/ # HTML от vitest --coverage
├── index.html
├── ...
└── vitest_output.txt # Raw вывод vitest
Зависимости
- Backend: Python 3.9+,
.venvс установленнымиpytest-cov(входит вrequirements-dev.txt) - Frontend: Node.js 18+,
node_modulesс@vitest/coverage-v8(входит вdevDependencies) - Docker: только для
--unitне требуется; для integration требуется Docker Engine 24+ - Скрипт написан на bash, не требует дополнительных утилит (кроме стандартных
grep,awk,sed)
Статус
ACTIVE — скрипт создан и протестирован. Используется для локальной проверки покрытия.