perf(tradein-tests): убираем реальные паузы из 5 медленных тестов
All checks were successful
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 11s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 6m50s
All checks were successful
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 11s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 6m50s
test_2924_yandex_resolve_tried_at::test_successful_resolve_does_not_mark (26с): мокнутый db.execute дублирует одну строку в retry- и fresh-выборках, backfill_house_imv видит 2 строки и делает реальный await asyncio.sleep(5) между ними (анти-бот задержка); фикс — request_delay_sec=0 в вызове теста, дефолт в проде не тронут. Тот же паттерн дублирования строки бьёт ещё 4 теста ровно на 5.01с каждый: test_house_imv_backfill_browser_flag (2 теста), test_2698_imv_sidecar_wiring, test_scraper_kit_group_c_backfill_kit_parity — тот же фикс. test_3033_avito_native_secondary_filter (2 теста, 7.82с + 5.72с): fetch_around с одной страницей всё равно делает "trailing sleep" анти-бана (request_delay_sec=5.0*jitter) после единственного мокнутого запроса — передаём delay_override_sec=0, сеть и так подменена fake_fetch. Не удалено ни одного теста и ни одного assert. Прод-задержки (anti-bot 5с, request_delay_sec=5.0 в scraper_kit) не менялись. Не успел в рамках бюджета: test_auth_api (реальный bcrypt cost=12, не sleep — требует отдельного анализа), test_3398_estimator_valuations_proxy_pool, test_alerts_become_events (10 тестов ~2.05с), test_backfill_wave2, test_estimator_event_loop_2207 (последний, вероятно, специально измеряет реальный sleep(0.3с) для доказательства non-blocking — трогать осторожно). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG
This commit is contained in:
parent
3ed759da7d
commit
b21f4cb044
5 changed files with 30 additions and 6 deletions
|
|
@ -65,7 +65,9 @@ async def test_backfill_browser_fetcher_gets_proxy_pool_wiring(
|
|||
db.execute.return_value.mappings.return_value.all.return_value = [
|
||||
{"id": 1, "address": "ЕКБ, ул. X, 1", "full_address": None, "lat": 56.8, "lon": 60.6}
|
||||
]
|
||||
await hib.backfill_house_imv(db, batch_size=1)
|
||||
# request_delay_sec=0: мок дублирует строку в retry+fresh (2 записи вместо 1) — реальный
|
||||
# анти-бот sleep(5с) между ними тут не нужен.
|
||||
await hib.backfill_house_imv(db, batch_size=1, request_delay_sec=0)
|
||||
|
||||
captured = _CapturingFetcher.captured
|
||||
assert captured["source"] == "avito"
|
||||
|
|
|
|||
|
|
@ -101,6 +101,12 @@ async def _run(pending: list[dict], *, force: bool = False, resolved: str | None
|
|||
),
|
||||
patch.object(mod, "_sleep_with_jitter", AsyncMock(return_value=None)),
|
||||
patch("app.services.scraper_adapters.RealScraperConfig", MagicMock()),
|
||||
# Удачный резолв доходит до fetch_jk — без мока это реальный BrowserFetcher/прокси-пул
|
||||
# (26с на живом прогоне); тесту нужен только факт «маркер не выставлен», не сам fetch.
|
||||
patch(
|
||||
"scraper_kit.providers.yandex.newbuilding.YandexNewbuildingScraper.fetch_jk",
|
||||
AsyncMock(return_value=None),
|
||||
),
|
||||
):
|
||||
await mod.enrich_yandex_newbuilding_sweep(
|
||||
db, city="ekaterinburg", limit=5, force=force, request_delay_sec=0
|
||||
|
|
|
|||
|
|
@ -129,7 +129,11 @@ def _capture(method: str, **kw: object) -> list[str]:
|
|||
|
||||
def test_anchor_sweep_uses_secondary_slug_by_default() -> None:
|
||||
"""fetch_around по умолчанию — путь вторички, geoCoords/radius сохранены в query."""
|
||||
urls = _capture("fetch_around", lat=56.84, lon=60.6, radius_m=1000, pages=1)
|
||||
# delay_override_sec=0: сеть подменена, anti-ban sleep(5с*jitter) после единственной
|
||||
# страницы тут не защищает ничего реального.
|
||||
urls = _capture(
|
||||
"fetch_around", lat=56.84, lon=60.6, radius_m=1000, pages=1, delay_override_sec=0
|
||||
)
|
||||
assert urls, "fetch_around не сделал запроса"
|
||||
u = urlparse(urls[0])
|
||||
assert u.path == f"/ekaterinburg/kvartiry/prodam/{SECONDARY_SLUG}", u.path
|
||||
|
|
@ -139,8 +143,15 @@ def test_anchor_sweep_uses_secondary_slug_by_default() -> None:
|
|||
|
||||
def test_anchor_sweep_secondary_only_false_keeps_general_path() -> None:
|
||||
"""Контроль: secondary_only=False — прежняя общая выдача."""
|
||||
# delay_override_sec=0: тот же anti-ban trailing sleep, что и в тесте выше.
|
||||
urls = _capture(
|
||||
"fetch_around", lat=56.84, lon=60.6, radius_m=1000, pages=1, secondary_only=False
|
||||
"fetch_around",
|
||||
lat=56.84,
|
||||
lon=60.6,
|
||||
radius_m=1000,
|
||||
pages=1,
|
||||
secondary_only=False,
|
||||
delay_override_sec=0,
|
||||
)
|
||||
assert urlparse(urls[0]).path == "/ekaterinburg/kvartiry/prodam-ASgBAgICAUSSA8YQ"
|
||||
|
||||
|
|
|
|||
|
|
@ -64,7 +64,9 @@ async def test_backfill_flag_on_constructs_browser_and_threads_it(
|
|||
monkeypatch.setattr(house_imv_backfill, "_process_one_house", _fake_process)
|
||||
|
||||
db = _fake_db_with_one_row()
|
||||
await house_imv_backfill.backfill_house_imv(db, batch_size=10)
|
||||
# request_delay_sec=0: мок дублирует строку в retry+fresh (2 записи вместо 1) — реальный
|
||||
# анти-бот sleep(5с) между ними тут не нужен.
|
||||
await house_imv_backfill.backfill_house_imv(db, batch_size=10, request_delay_sec=0)
|
||||
|
||||
# Ровно один BrowserFetcher(source="avito"), вошли в контекст.
|
||||
assert len(_FakeBrowserFetcher.instances) == 1
|
||||
|
|
@ -91,7 +93,8 @@ async def test_backfill_flag_off_no_browser_and_none_threaded(
|
|||
monkeypatch.setattr(house_imv_backfill, "_process_one_house", _fake_process)
|
||||
|
||||
db = _fake_db_with_one_row()
|
||||
await house_imv_backfill.backfill_house_imv(db, batch_size=10)
|
||||
# request_delay_sec=0: та же дублирующая мок-строка retry+fresh, что и в тесте выше.
|
||||
await house_imv_backfill.backfill_house_imv(db, batch_size=10, request_delay_sec=0)
|
||||
|
||||
# Флаг OFF → BrowserFetcher не конструируется, browser_fetcher=None.
|
||||
assert _FakeBrowserFetcher.instances == []
|
||||
|
|
|
|||
|
|
@ -186,7 +186,9 @@ async def test_house_imv_backfill_browser_fetcher_uses_settings_endpoint() -> No
|
|||
db.execute.return_value.mappings.return_value.all.return_value = [
|
||||
{"id": 1, "address": "ЕКБ, ул. X, 1", "full_address": None, "lat": 56.8, "lon": 60.6}
|
||||
]
|
||||
await house_imv_backfill.backfill_house_imv(db, batch_size=1)
|
||||
# request_delay_sec=0: мок дублирует строку в retry+fresh (2 записи вместо 1) —
|
||||
# реальный анти-бот sleep(5с) между ними тут не нужен.
|
||||
await house_imv_backfill.backfill_house_imv(db, batch_size=1, request_delay_sec=0)
|
||||
|
||||
# #2698: к endpoint= добавилась проводка пула — без неё сайдкар брал env-прокси
|
||||
# (узел с affinity='domclick'), и домовая оценка падала 34 дня подряд.
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue