OVERALL: C+ (good structure, documentation gaps) STRENGTHS: - 99.3% files with #region anchors (430/433) - 0 logic mirrors (tautology) — all hardcoded fixtures - 90.1% with @RELATION BINDS_TO (390/433) GAPS: - Only 58.2% with @TEST_EDGE (252/433) — 181 files missing edge declarations - Only 49% test functions have @BRIEF (908/1855) - 38 files > 600 lines (8 > 1000 lines) - 3 files missing module-level anchors PRIORITY FIXES: 1. Add @TEST_EDGE to 181 files (coverage campaign agents skipped this) 2. Add @BRIEF to 947 test functions (agents generated anchors without BRIEF) 3. Split 8 files > 1000 lines (test_assistant_tools 1893, llm_analysis 1662, etc)
8.4 KiB
Аудит соответствия тестов 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-testingskill - ~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) и размеры файлов требуют значительных улучшений.
Приоритеты исправления
- 🔴 Добавить
@TEST_EDGEв 181 файл без него - 🔴 Добавить
@BRIEFна 947 тестовых функций - 🟡 Разделить 8 файлов >1000 строк
- 🟡 Добавить
@RELATION BINDS_TOв 43 файла - 🟢 Добавить якоря в 3 файла без них