Files
LMS/docs/evidence/README.md

97 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# LDD: доказательное тестирование
Этот каталог — реестр утверждений о системе и свидетельств того, что они
выполняются. LDD здесь означает не «тесты вместо требований», а
**риск-ориентированную проверку**: требование → проверяемое утверждение →
независимый оракул → воспроизводимое свидетельство → допуск.
## Уровни
- **P0** — утверждение о безопасности, сохранности данных, доступах или
ключевом доменном правиле. P0 без зелёного свидетельства валит
`./gradlew evidenceCheck`.
- **P1** — важное поведение/UX/контракт. Пробел показывается в отчёте, но не
блокирует сборку.
- **runtime** — проверка на реально поднятом стеке. Выполняется отдельным
скриптом; в unit-CI может отсутствовать, но обязательна перед релизом.
## Реестр
`claims.json` содержит:
- `id` — стабильный идентификатор (`LDD-ACCESS-001`);
- `title` — короткая формулировка;
- `criticality` — `P0`/`P1`;
- `status` — `active` или `gap`;
- `requirement` — ссылка на ТЗ/отчёт;
- `claim` — проверяемое утверждение (что именно истинно);
- `oracle` — как это проверяется;
- `evidence` — список `fully.qualified.Class#test name()` из JUnit XML;
- `runtime` — идентификаторы проверок из `build/evidence/runtime.json`;
- `limitations` — что утверждение **не** покрывает.
## Запуск
```bash
# 1. Все тесты и линтеры
./gradlew test ktlintCheck detekt
# 2. Гейт свидетельств (P0 без evidence = fail)
./gradlew evidenceCheck
# 3. Полный runtime-smoke на одноразовой БД
./scripts/ldd-runtime.sh
# 4. Проверка upgrade с master-схемы
./scripts/ldd-migration-upgrade.sh
# 5. Mutation testing критичных P0-компонентов
./scripts/ldd-mutation.sh
# 6. Браузерный E2E (Playwright + Chromium)
./scripts/ldd-browser.sh
```
Для E2E один раз установите зависимости: `cd e2e && npm install`.
Mutation harness использует JUnit 4: JUnit5-плагин PIT несовместим с JUnit
Platform 6 из Spring Boot 4.
Отчёт: `build/reports/evidence/index.md`.
## Правила
1. Новое P0-требование без свидетельства не мержится.
2. Свидетельство должно быть воспроизводимым в CI, а не «проверил руками».
3. Тест должен падать при поломке соответствующей логики. Для критичных
пакетов это измеряется mutation testing: сейчас `CourseAccessService` —
75% test strength, `PromotionPlanner` — 69%.
4. Один тест может подтверждать несколько claims, но claim не должен
опираться на тест, который проверяет только реализацию.
5. `limitations` обязателен: LDD не должен создавать иллюзию полного
доказательства.
6. При переименовании теста обновляется `claims.json`; устаревшая ссылка —
это gap, а не «забыли».
7. Runtime-свидетельства обязательны перед релизом; CI проверяет unit/
integration-слой.
## Текущий baseline
Первый LDD-цикл выполнен 2026-10-27/28:
- **273 автоматических теста**, 0 failures/errors;
- **34 claims**: 19 P0 + 15 P1. P0 — доступы, повышение, жизненный цикл,
профиль/скачивание, материалы/активы, миграция V13, аудит; P1 — группы,
авторство, UI, контракты, импорт, копирование лаб, runtime, mutation и
browser E2E;
- mutation testing: `CourseAccessService` 75% test strength,
`PromotionPlanner` 69%;
- Playwright: 3 сценария (admin, teacher, student/anonymous), все зелёные;
- runtime-smoke, master-upgrade, mutation и browser E2E вынесены в отдельные
скрипты.
В ходе E2E найден и исправлен реальный дефект: Jackson 3 не применял
Kotlin-модуль, поэтому DTO с default-значениями требовали все поля JSON
(например, создание студента без `firstName`/`basis` давало 400).
Результаты и остаточные ограничения — в `baseline-2026-10-27.md`.