perf(tests): заглушить форсайт-enqueue в analyze-тестах Site Finder #3502

Merged
lekss361 merged 2 commits from perf/3471-tests-faster-sitefinder into main 2026-09-12 14:09:24 +00:00
Collaborator

Summary

  • Диагноз: analyze_parcel() в конце безусловно дёргает forecast_site_finder_report.delay(...) (best-effort §22-форсайт enqueue, app/api/v1/parcels.py). В тестовой песочнице Celery-брокер (Redis) недоступен — .delay() синхронно ждёт kombu reconnect-backoff (~69с) прежде чем try/except его проглотит. Пауза общая для ВСЕХ тестов, дёргающих POST /analyze без мока форсайт-таски — 32 теста в 9 файлах tests/api/v1/test_analyze_*.py + test_2464*.py, ~2218 из 2503с полного прогона (89%).
  • Фикс: autouse-фикстура _stub_forecast_enqueue в backend/tests/api/v1/conftest.py, по образцу уже существующей _stub_zone_regulation_resolver — глушит .delay в no-op MagicMock для всех тестов каталога. Тесты самого enqueue (test_parcels_forecast.py, test_run_history_and_response_contract.py) переопределяют тот же target своим per-test patch поверх авто-фикстуры (nested mock-scope) — их проверки не затронуты.
  • Ни один assert не тронут, ничего не помечено skip/xfail, продовые таймауты не менялись.

Test plan

  • ruff check backend/tests/api/v1/conftest.py — чисто
  • 7 целевых файлов из issue (32 теста) прогнаны вместе: 36.7с суммарно вместо таймаутов по 90с/файл, всё зелёное
Файл Было Стало
test_2464_confidence_zoning_source.py 74s 36.7s суммарно на все 7 файлов / 32 теста
test_2464g_noise_source_filter.py rc=124 (>90s) "
test_analyze_inline_weights.py rc=124 (>90s) "
test_analyze_market_price.py rc=124 (>90s) "
test_analyze_osrm_distances.py rc=124 (>90s) "
test_analyze_parcel_meta.py rc=124 (>90s) "
test_analyze_recent_permits.py rc=124 (>90s) "
  • Полный прогон набора (5085 тестов) НЕ запускался — идёт часами, вне scope этой правки.

Известный остаток (не в scope)

Два теста в целевом наборе всё ещё держат ~16с каждый — test_analyze_market_price.py::test_market_price_invalid_cad_returns_404 и test_analyze_recent_permits.py::test_recent_permits_invalid_cad_no_regression. Похоже на отдельный неглушённый network/DB round-trip на invalid-cad ветке (НЕ форсайт-таска — она уже заглушена). Не трогал, отдельная причина — на усмотрение владельца.

🤖 Generated with Claude Code

https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG

## Summary - Диагноз: `analyze_parcel()` в конце безусловно дёргает `forecast_site_finder_report.delay(...)` (best-effort §22-форсайт enqueue, `app/api/v1/parcels.py`). В тестовой песочнице Celery-брокер (Redis) недоступен — `.delay()` синхронно ждёт kombu reconnect-backoff (~69с) прежде чем try/except его проглотит. Пауза общая для ВСЕХ тестов, дёргающих `POST /analyze` без мока форсайт-таски — 32 теста в 9 файлах `tests/api/v1/test_analyze_*.py` + `test_2464*.py`, ~2218 из 2503с полного прогона (89%). - Фикс: autouse-фикстура `_stub_forecast_enqueue` в `backend/tests/api/v1/conftest.py`, по образцу уже существующей `_stub_zone_regulation_resolver` — глушит `.delay` в no-op `MagicMock` для всех тестов каталога. Тесты самого enqueue (`test_parcels_forecast.py`, `test_run_history_and_response_contract.py`) переопределяют тот же target своим per-test `patch` поверх авто-фикстуры (nested mock-scope) — их проверки не затронуты. - Ни один assert не тронут, ничего не помечено skip/xfail, продовые таймауты не менялись. ## Test plan - [x] `ruff check backend/tests/api/v1/conftest.py` — чисто - [x] 7 целевых файлов из issue (32 теста) прогнаны вместе: **36.7с** суммарно вместо таймаутов по 90с/файл, всё зелёное | Файл | Было | Стало | |---|---|---| | test_2464_confidence_zoning_source.py | 74s | 36.7s суммарно на все 7 файлов / 32 теста | | test_2464g_noise_source_filter.py | rc=124 (>90s) | " | | test_analyze_inline_weights.py | rc=124 (>90s) | " | | test_analyze_market_price.py | rc=124 (>90s) | " | | test_analyze_osrm_distances.py | rc=124 (>90s) | " | | test_analyze_parcel_meta.py | rc=124 (>90s) | " | | test_analyze_recent_permits.py | rc=124 (>90s) | " | - Полный прогон набора (5085 тестов) НЕ запускался — идёт часами, вне scope этой правки. ## Известный остаток (не в scope) Два теста в целевом наборе всё ещё держат ~16с каждый — `test_analyze_market_price.py::test_market_price_invalid_cad_returns_404` и `test_analyze_recent_permits.py::test_recent_permits_invalid_cad_no_regression`. Похоже на отдельный неглушённый network/DB round-trip на invalid-cad ветке (НЕ форсайт-таска — она уже заглушена). Не трогал, отдельная причина — на усмотрение владельца. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG
bot-backend added 1 commit 2026-09-12 13:54:23 +00:00
perf(tests): заглушить форсайт-enqueue в analyze-тестах Site Finder
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 12s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m9s
CI / backend-tests (pull_request) Successful in 6m46s
12e2a9949d
analyze_parcel() в конце безусловно дёргает
forecast_site_finder_report.delay(...) (best-effort §22-форсайт, обёрнут
в try/except). В тестовой песочнице Celery-брокер (Redis) недоступен,
и .delay() синхронно ждёт kombu reconnect-backoff (~69с) прежде чем
исключение будет проглочено — эта пауза сидела внутри КАЖДОГО теста,
дёргающего POST /analyze без мока форсайт-таски (9 файлов
tests/api/v1/test_analyze_*.py, test_2464*.py — 32 теста, ~2218 из
2503с полного прогона).

Добавлена autouse-фикстура в tests/api/v1/conftest.py по образцу уже
существующей _stub_zone_regulation_resolver — глушит .delay в no-op
MagicMock для всех тестов каталога. Тесты самого enqueue
(test_parcels_forecast.py, test_run_history_and_response_contract.py)
переопределяют тот же target своим per-test patch поверх авто-фикстуры
(nested mock-scope), их проверки не затронуты.

Проверено: 7 целевых файлов (32 теста) — 36.7с суммарно вместо
таймаутов по 90с на файл, все зелёные.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG
bot-backend added 1 commit 2026-09-12 14:01:25 +00:00
perf(tests): схлопнуть inline-ожидание NSPD-фетча в analyze-тестах
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / changes (pull_request) Successful in 12s
CI / frontend-tests (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m23s
CI / backend-tests (pull_request) Successful in 6m41s
464e9e1c67
Два теста (`test_market_price_invalid_cad_returns_404`,
`test_recent_permits_invalid_cad_no_regression`) спали ровно по 16с: ветка
«участка нет в БД» в `analyze_parcel` ждёт появления геометрии циклом
`sleep(_INLINE_FETCH_POLL_INTERVAL_S)` до `_INLINE_FETCH_WAIT_S` (15с), а в
тестах фетч замокан и геометрия не появляется никогда.

Autouse-фикстура каталога ужимает окно до 0.05с при шаге опроса 0.01с. Цикл
остаётся рабочим (несколько итераций), а не выключается нулём — тесты
fast-path'а продолжают видеть опросы; тесты с собственным patch того же
имени переопределяют фикстуру поверх.

tests/api/v1 целиком: 898с → 7.7с, 377 passed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG
lekss361 merged commit 98a582e242 into main 2026-09-12 14:09:24 +00:00
lekss361 deleted branch perf/3471-tests-faster-sitefinder 2026-09-12 14:09:24 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3502
No description provided.