Coverage и Codecov¶
RimLoc использует Codecov для отслеживания покрытия автоматическими тестами.
Coverage — сигнал, а не оценка корректности. Выполненная строка не доказывает правильность RimWorld semantics, filesystem safety, UX, accessibility или поведения в игре.
Текущие coverage families¶
Workflow загружает три независимо сформированных отчёта:
- rust — Rust workspace под
crates/, без Tauri GUI; - gui-rust — desktop Rust/Tauri с отдельными GTK/WebKit/frontend prerequisites;
- frontend-react — весь production React source (
src/**/*.{ts,tsx}), включая непроверенные экраны с 0%, а не скрывая их.
Codecov Components разделяют эти отчёты на области продукта без повторного прогона тестов:
- Domain & Core; Services; RimWorld parsers & validation; import/export formats;
- CLI; providers/config; plugin compatibility; desktop Rust/Tauri; React frontend.
Flags показывают семейства тестов, Components — архитектурные области.
Формат отчёта¶
Rust CI использует cargo-llvm-cov и отправляет native Codecov coverage JSON вместо обычного LCOV. React использует Vitest V8 и загружает Istanbul JSON (coverage/coverage-final.json), одновременно создавая текстовый и LCOV-отчёты для локальной проверки.
Причины:
- сохраняется более богатая LLVM region information;
- мы не включаем нестабильный
--branchрежим cargo-llvm-cov только ради цифры; - Codecov получает формат напрямую без преждевременного сведения к line-only LCOV.
Локально удобнее HTML:
cargo llvm-cov \
--workspace \
--all-features \
--exclude rimloc-gui \
--html
Формат как в CI:
cargo llvm-cov \
--workspace \
--all-features \
--exclude rimloc-gui \
--codecov \
--output-path codecov.json
Аутентификация¶
Upload использует GitHub OIDC, поэтому repository secret CODECOV_TOKEN не нужен.
Same-repo PR/push получают OIDC identity. Fork PR не получает repository secrets; workflow допускает public/tokenless путь Codecov и не должен ломать внешний PR только из-за отсутствия upload-auth.
Доверие к конфигурации¶
Codecov читает repository policy только из default branch: после первых успешных Rust и desktop coverage upload на main включён codecov.strict_yaml_branch: main. Pull request может менять код, который генерирует coverage, но не может ослабить Codecov policy, которой оценивается этот же PR.
Политика pre-beta¶
Statuses сначала informational.
Мы не ставим случайный глобальный gate "80%". Сначала собираем baseline на реальных PR, затем постепенно включаем:
- project
target: autoс небольшим допустимым regression; - разумный patch coverage для нового/изменённого кода;
- более строгие component gates для safety-critical областей после стабилизации baseline;
- только обоснованные исключения для generated/platform glue.
Цель — не максимизировать vanity percentage, а не допускать деградацию и видеть нетестированный код.
React coverage¶
Job frontend-react из .github/workflows/coverage.yml выполняет
npm test в gui/tauri-app/frontend-react (Vitest V8, конфигурация
test.coverage) и загружает coverage/coverage-final.json под флагом
Codecov frontend-react. Дополнительная проверка JSON требует наличие
App.tsx, Workspace.tsx, project.ts и entryUid.ts в отчёте.
Покрытие включает все production-файлы src/**/*.{ts,tsx}, а не только
проверенные state-модули. Поэтому непроверенные экраны честно показывают
0%: это baseline, а не автоматическая оценка готовности к релизу.
При Data Safety review отдельно анализировать project.ts и entryUid.ts.
Зелёные Rust/Tauri-тесты сами по себе не доказывают покрытие React и
работоспособность настоящего собранного приложения.
Pull Request: зелёные проверки — не конец ревью¶
- Проверять комментарии Codecov и других ботов, все статусы
patch/project/flags/components, конкретные непокрытые изменённые строки и
review threads на точном HEAD PR.
informational: trueпозволяет зелёный статус даже ниже цели; успешный upload означает лишь очередь обработки, а не принятый отчёт. strict_yaml_branch: main— намеренная политика: до merge Codecov применяет YAML изmain, а не новые настройки из PR. Проверять эффективныеignore/components/flags изmainперед заявлениями, что новая область продукта учитывается.- Исключение
ignore: "gui/tauri-app/frontend"захватывает иfrontend-react. Для legacy-папки нужно окончаниеfrontend/; после обработки Codecov проверить, что React действительно измеряется. Статус "Coverage not affected" у флага требует расследования. - Проверять фактическую таблицу по файлам и их перечень в JSON.
coverage.includeнаходится внутриtest.coverage, а не в корне Vite config. Зелёный workflow с неправильным знаменателем не доказывает заявленные метрики. - Если изменился знаменатель, baseline либо политика исключений, проценты «до/после» нельзя напрямую сравнивать. Не скрывать файлы, не уменьшать требования ради цифры; добавлять поведенческие и отрицательные тесты реальных рисков, документировать исключения.
- Покрытие дополняется реальными Tauri IPC-тестами, native WDIO, проверкой экспорта в RimWorld, CodeQL/зависимостей и UAT владельца.
Test Analytics — позже¶
Codecov умеет принимать JUnit-style test results и показывать duration/failure rate/flaky tests. Подключать это стоит, когда Rust/React runner уже выдаёт нормальный JUnit.
Не надо повторно гонять весь suite только ради Test Analytics.
Что coverage не заменяет¶
Отдельно нужны:
- same-corpus RimWorld differential;
- in-game/runtime verification;
- path/symlink/adversarial filesystem tests;
- CodeQL, dependency review, Dependabot и cargo-deny;
- owner visual review;
- accessibility review;
- macOS/Windows artifact acceptance.
CI files¶
.github/workflows/coverage.yml— генерация/upload;codecov.yml— policy, components, flags, PR comments.
Workflow сначала валидирует codecov.yml, затем запускает coverage.