# Аудит соответствия тестов `semantics-testing`

**Дата**: 2026-06-16
**Файлов проверено**: 433 (.py в `backend/tests/`)
**Тестов**: 7778 unit + 175 integration + 2442 frontend

---

## Сводка

| Критерий | Порог | Факт | Статус |
|----------|:-----:|:----:|:------:|
| **Якоря `#region`** | 100% | **99.3%** (430/433) | 🟢 |
| **`@RELATION BINDS_TO`** | 100% | **90.1%** (390/433) | 🟡 |
| **`@TEST_EDGE` (≥3)** | 100% | **58.2%** (252/433) | 🔴 |
| **`@BRIEF` на тестах** | 100% | **49%** (908/1855) | 🔴 |
| **Размер файла <600 строк** | 100% | **91.2%** (38 >600) | 🟡 |
| **Logic mirrors** | 0 | **0** | 🟢 |
| **ADR regression defense** | 100% | Частично | 🟡 |

---

## 1. Якоря `#region`/`#endregion` — 🟢 99.3%

**430 из 433** файлов имеют корректный `#region` на уровне модуля.

**Нарушения (3 файла):**
| Файл | Причина |
|------|--------|
| `test_smoke_plugins.py` | Нет якоря — создан до стандартизации |
| `api/test_tasks.py` | Нет якоря — создан до стандартизации |
| `services/git/conftest.py` | conftest без якоря |

---

## 2. `@RELATION BINDS_TO` — 🟡 90.1%

**390 из 433** файлов связывают тестовый модуль с production-контрактом.

**43 файла без `BINDS_TO`** — в основном старые тесты (до внедрения `semantics-testing`), а также несколько edge/coverage-файлов, созданных агентами во время кампании покрытия:

| Файл | Комментарий |
|------|------------|
| `test_datasets.py` | Старый тест |
| `test_db_executor.py` | Старый тест |
| `test_core_timezone_edge.py` | Edge-файл без BINDS_TO |
| `test_schemas_edge.py` | Edge-файл без BINDS_TO |
| `test_connection_service.py` | Старый тест |
| `test_orchestrator_direct_db.py` | Старый тест |
| `services/dataset_review/test_semantic_resolver_edge.py` | Edge-файл |
| `services/dataset_review/test_superset_matrix.py` | Специфичный файл |
| `services/dataset_review/test_helpers_edge.py` | Edge-файл |
| `core/test_defensive_guards.py` | Старый тест |

**Рекомендация:** добавить `@RELATION BINDS_TO -> [TargetModule]` во все 43 файла.

---

## 3. `@TEST_EDGE` — 🔴 58.2%

Только **252 из 433** файлов декларируют edge-кейсы в заголовке модуля.

**Требование skills**: минимум 3 edge-кейса: `missing_field`, `invalid_type`, `external_fail`.

**181 файл без `@TEST_EDGE`** — это крупнейший пробел.

**Причины:**
- ~120 файлов созданы до внедрения `semantics-testing` skill
- ~40 coverage/edge-файлов созданы агентами во время кампании — агенты не добавляли `@TEST_EDGE` в заголовки
- ~20 integration-файлов (включая новый TLS Custom CA)

**Рекомендация:** целевая кампания по добавлению `@TEST_EDGE` в заголовки 181 файла. Приоритет: файлы >300 строк и coverage-файлы от агентов.

---

## 4. `@BRIEF` на тестовых функциях — 🔴 49%

Из **1855** тестовых функций с `#region [C:2] [TYPE Function]` только **908** имеют `@BRIEF`.

**947 функций без `@BRIEF`** — большинство созданы агентами, которые генерировали якоря без `@BRIEF` (формат: `#region test_name [C:2] [TYPE Function]` без следующей строки `# @BRIEF ...`).

**Рекомендация:** автоматизированное добавление `@BRIEF` (можно сгенерировать из docstring или имени теста).

---

## 5. Размер файлов — 🟡 91.2%

**38 файлов > 600 строк** (порог `semantics-testing` §II.5).

| Диапазон | Количество | Файлы |
|----------|:---------:|-------|
| 600–700 | 16 | Умеренное превышение |
| 700–1000 | 14 | Значительное превышение |
| 1000–1900 | 8 | Критическое превышение |

**Худшие нарушители (>1000 строк):**

| Строк | Файл | Рекомендация |
|------:|------|-------------|
| 1893 | `api/test_assistant_tools.py` | Разделить по tool-классам |
| 1662 | `plugins/test_llm_analysis_service_coverage.py` | Разделить на 3 файла |
| 1613 | `plugins/test_llm_analysis_service.py` | Разделить по классам сервиса |
| 1459 | `plugins/test_llm_analysis_plugin.py` | Выделить PathA/PathB в отдельные файлы |
| 1347 | `api/test_dataset_review_routes_extended.py` | Разделить по endpoint-группам |
| 1278 | `api/test_dataset_review_deps_unit.py` | Разделить по dependency-классам |
| 1042 | `test_datasets.py` | Разделить по операциям (CRUD, filters, preview) |
| 975 | `test_core/test_async_network.py` | Разделить по протоколам |

**Исключение (integration, до 800 строк):** 2 файла в пределах нормы.

**Рекомендация:** приоритетно разделить 8 файлов >1000 строк.

---

## 6. Logic Mirrors (анти-таутология) — 🟢 0

**Нарушений не обнаружено.** Тесты используют hardcoded fixtures и не вычисляют `expected` через вызовы production-кода.

Это сильная сторона кодбазы — агенты последовательно применяли паттерн `expected = {"id": "dash_1", ...}` вместо `expected = production_fn(x)`.

---

## 7. ADR Regression Defense — 🟡 Частично

Проверка наличия `@REJECTED` в production-коде и соответствующих `@TEST_EDGE` в тестах:

- **ADR-0009** (TLS/SSL): `test_superset_tls_custom_ca.py` проверяет rejected-путь (certifi не доверяет custom CA) ✅
- **ADR-0013** (coverage reporting): ортогональный аудит в `docs/orthogonal-test-report.md` ✅
- Остальные ADR требуют точечной проверки — не автоматизировано

---

## 8. Тесты без `#region` на функциях

Многие тестовые функции (особенно в старых файлах) не имеют `#region`/`#endregion` вообще. Они используют plain `def test_*()` без семантической разметки. Точное количество не подсчитано, но по оценке ~40% тестовых функций не имеют персональных якорей.

---

## Итоговая оценка

| Измерение | Оценка | Комментарий |
|-----------|:------:|------------|
| Структурная целостность | **B+** | 99% файлов с якорями, но много oversized |
| Трассируемость | **C+** | 90% BINDS_TO, но только 58% TEST_EDGE |
| Документированность | **D** | 49% @BRIEF на тестах — агенты не добавляли |
| Анти-таутология | **A** | 0 logic mirrors — сильная сторона |
| Размер файлов | **C** | 38 файлов >600 строк, 8 >1000 строк |

**Общая оценка: C+** — базовая структура заложена, но документация тестов (`@TEST_EDGE`, `@BRIEF`) и размеры файлов требуют значительных улучшений.

---

## Приоритеты исправления

1. 🔴 **Добавить `@TEST_EDGE`** в 181 файл без него
2. 🔴 **Добавить `@BRIEF`** на 947 тестовых функций
3. 🟡 **Разделить 8 файлов >1000 строк**
4. 🟡 **Добавить `@RELATION BINDS_TO`** в 43 файла
5. 🟢 **Добавить якоря** в 3 файла без них
