tradein/ci: тесты браузерного сайдкара не запускаются в пайплайне — 4 из них лежат красными на main, и об этом никто не знает #2722

Closed
opened 2026-08-06 10:27:31 +00:00 by bot-backend · 1 comment
Collaborator

Найдено при работе над #2676. Тот же класс, что весь эпик #2674: механизм написан, выглядит работающим и ни разу не сработал.

Что происходит

Тесты браузерного сайдкара — tradein-mvp/browser/test_server*.pyне запускаются в CI. Пайплайн гоняет только tradein-mvp/backend.

Следствие обнаружилось сразу: 4 из них лежат красными на main и лежали до сегодняшних правок (падения в _ensure_browser(proxy_override=...) и в пейсинге). То есть тесты есть, они содержательные, они не проходят — и об этом никто не знает, потому что их никто не запускает.

Почему это дороже, чем кажется

Сайдкар — единственная точка, через которую идёт весь браузерный сбор: выдача Авито, детальные страницы, домовая оценка. За последние сутки к нему относились сразу три разбора:

  • #2698 — домовая оценка ходила мимо пула прокси, 34 дня нулевого результата;
  • #2686 — 92 прогона из 115 помечены «нас забанила площадка», хотя это был отказ сайдкара;
  • #2676 — гонка при пересоздании контекста страницы, причём первая правка была опровергнута продом и потребовала второй.

Каждый из этих разборов правил код, чей набор тестов не исполняется. Красный тест здесь не остановит ничего.

Дополнительный риск, который это создаёт

Красные тесты, лежащие в репозитории без запуска, обесценивают сам сигнал: следующий человек, увидев красноту при локальном прогоне, спишет её на «оно тут всегда красное» — и пропустит настоящую регрессию. Сегодня это уже случилось в соседней области: агент столкнулся с падающим test_search_api.py::test_search_cache_hit и потратил время, доказывая, что краснота предсуществующая и не его.

Что нужно

  1. Включить tradein-mvp/browser в CI — отдельным job'ом, если окружение отличается от бэкендового.
  2. До включения починить 4 текущих падения, иначе новый job будет красным с первого дня и его немедленно начнут игнорировать (см. выше).
  3. Проверить, нет ли ещё каталогов с тестами вне охвата CI — этот нашёлся случайно, и метод его поиска тривиален: сверить пути в конфигурации пайплайна со списком каталогов, содержащих test_*.py.

Пункт 3 существеннее первых двух: он отвечает на вопрос, сколько ещё таких мест.

Связано: #2674, #2676, #2698, #2686.

Найдено при работе над #2676. Тот же класс, что весь эпик #2674: механизм написан, выглядит работающим и ни разу не сработал. ## Что происходит Тесты браузерного сайдкара — `tradein-mvp/browser/test_server*.py` — **не запускаются в CI**. Пайплайн гоняет только `tradein-mvp/backend`. Следствие обнаружилось сразу: **4 из них лежат красными на `main`** и лежали до сегодняшних правок (падения в `_ensure_browser(proxy_override=...)` и в пейсинге). То есть тесты есть, они содержательные, они не проходят — и об этом никто не знает, потому что их никто не запускает. ## Почему это дороже, чем кажется Сайдкар — единственная точка, через которую идёт весь браузерный сбор: выдача Авито, детальные страницы, домовая оценка. За последние сутки к нему относились сразу три разбора: - #2698 — домовая оценка ходила мимо пула прокси, 34 дня нулевого результата; - #2686 — 92 прогона из 115 помечены «нас забанила площадка», хотя это был отказ сайдкара; - #2676 — гонка при пересоздании контекста страницы, причём **первая правка была опровергнута продом** и потребовала второй. Каждый из этих разборов правил код, чей набор тестов не исполняется. Красный тест здесь не остановит ничего. ## Дополнительный риск, который это создаёт Красные тесты, лежащие в репозитории без запуска, **обесценивают сам сигнал**: следующий человек, увидев красноту при локальном прогоне, спишет её на «оно тут всегда красное» — и пропустит настоящую регрессию. Сегодня это уже случилось в соседней области: агент столкнулся с падающим `test_search_api.py::test_search_cache_hit` и потратил время, доказывая, что краснота предсуществующая и не его. ## Что нужно 1. Включить `tradein-mvp/browser` в CI — отдельным job'ом, если окружение отличается от бэкендового. 2. **До включения** починить 4 текущих падения, иначе новый job будет красным с первого дня и его немедленно начнут игнорировать (см. выше). 3. Проверить, нет ли ещё каталогов с тестами вне охвата CI — этот нашёлся случайно, и метод его поиска тривиален: сверить пути в конфигурации пайплайна со списком каталогов, содержащих `test_*.py`. Пункт 3 существеннее первых двух: он отвечает на вопрос, сколько ещё таких мест. Связано: #2674, #2676, #2698, #2686.
Author
Collaborator

Сделано тремя PR (все смержены):

  • #2724 — починка 4 красных. Все четыре — устаревшие тесты, а не сломанный код (проверено мутацией). test_pace_provider_disabled_when_zero красный с 2026-06-20: патчил BROWSER_MIN_PAGE_INTERVAL_S, тогда как _pace_provider с коммита 3f30c1c9 читает _MIN_PAGE_INTERVAL_BY_PROVIDER. Три смоук-теста красные с 2026-07-02: подделки _ensure_browser остались одноаргументными после #2164 P4. Попутно: ещё 4 пейсинг-теста зеленели вхолостую — патчили тот же мёртвый символ значением, равным дефолту.
  • #2726 — job browser-tests + paths-filter browser. Окружение: pytest + aiohttp, и всё (camoufox импортируется лениво, async def test_ в каталоге ноль). Живого браузера не требует ни один тест, делить на юнит/интеграцию не понадобилось: 108 passed, 0 skipped.
  • #2729 — побочный пункт про молчаливый деселект. Комментарий в ci-tradein.yml утверждал, что test_search_cache_hit «в изоляции проходит» — замер это опроверг: падал и в изоляции. Причина была в самом тесте (POST без X-Authenticated-User → 401 от RBAC-гарда), а не в порядке прогона. Заголовок добавлен, deselect снят, полный сьют зелёный.

Пункт 3 (аудит охвата). Каталогов с тестами вне CI больше нет — tradein-mvp/browser был единственным. Полная сверка: backend/tests (4646), frontend/src/**/__tests__ (264), tradein-mvp/backend/tests (3761), tradein-mvp/browser (108) — все четыре теперь гоняются. Остальные корни (site-finder/, ops/glitchtip-auth-forwarder/, tradein-mvp/packages/scraper-kit, tradein-mvp/frontend, scripts/, preview/) тестов не содержат вовсе — это дыра другого класса, не «тесты есть, но не бегут».

Доказательство исполнения (не «конфиг выглядит правильно»): отдельный PR-проба с дифом ИСКЛЮЧИТЕЛЬНО по tradein-mvp/browser/** (закрыт после проверки) → в логе прогона 6783 job2: 108 passed in 13.20s, Job succeeded; backend-tests в том же прогоне скипнут (лог 4 строки) — перекрёстных триггеров нет.

Чего НЕ сделал: deploy-tradein.yml не трогал (его правит #2680) — там остался свой экземпляр снятого деселекта и там же browser-тесты по-прежнему не гоняются post-merge; ruff на tradein-mvp/browser/ по-прежнему не распространяется (pre-commit ограничен ^(backend|tradein-mvp/backend)/, под конфигом backend'а каталог даёт 5 замечаний).

Сделано тремя PR (все смержены): - **#2724** — починка 4 красных. Все четыре — **устаревшие тесты, а не сломанный код** (проверено мутацией). `test_pace_provider_disabled_when_zero` красный с 2026-06-20: патчил `BROWSER_MIN_PAGE_INTERVAL_S`, тогда как `_pace_provider` с коммита 3f30c1c9 читает `_MIN_PAGE_INTERVAL_BY_PROVIDER`. Три смоук-теста красные с 2026-07-02: подделки `_ensure_browser` остались одноаргументными после #2164 P4. Попутно: ещё 4 пейсинг-теста зеленели вхолостую — патчили тот же мёртвый символ значением, равным дефолту. - **#2726** — job `browser-tests` + paths-filter `browser`. Окружение: `pytest` + `aiohttp`, и всё (camoufox импортируется лениво, `async def test_` в каталоге ноль). Живого браузера не требует ни один тест, делить на юнит/интеграцию не понадобилось: 108 passed, 0 skipped. - **#2729** — побочный пункт про молчаливый деселект. Комментарий в `ci-tradein.yml` утверждал, что `test_search_cache_hit` «в изоляции проходит» — **замер это опроверг**: падал и в изоляции. Причина была в самом тесте (POST без `X-Authenticated-User` → 401 от RBAC-гарда), а не в порядке прогона. Заголовок добавлен, deselect снят, полный сьют зелёный. **Пункт 3 (аудит охвата).** Каталогов с тестами вне CI больше нет — `tradein-mvp/browser` был единственным. Полная сверка: `backend/tests` (4646), `frontend/src/**/__tests__` (264), `tradein-mvp/backend/tests` (3761), `tradein-mvp/browser` (108) — все четыре теперь гоняются. Остальные корни (`site-finder/`, `ops/glitchtip-auth-forwarder/`, `tradein-mvp/packages/scraper-kit`, `tradein-mvp/frontend`, `scripts/`, `preview/`) тестов не содержат вовсе — это дыра другого класса, не «тесты есть, но не бегут». **Доказательство исполнения** (не «конфиг выглядит правильно»): отдельный PR-проба с дифом ИСКЛЮЧИТЕЛЬНО по `tradein-mvp/browser/**` (закрыт после проверки) → в логе прогона 6783 job2: `108 passed in 13.20s`, `Job succeeded`; `backend-tests` в том же прогоне скипнут (лог 4 строки) — перекрёстных триггеров нет. Чего НЕ сделал: `deploy-tradein.yml` не трогал (его правит #2680) — там остался свой экземпляр снятого деселекта и там же browser-тесты по-прежнему не гоняются post-merge; ruff на `tradein-mvp/browser/` по-прежнему не распространяется (pre-commit ограничен `^(backend|tradein-mvp/backend)/`, под конфигом backend'а каталог даёт 5 замечаний).
Sign in to join this conversation.
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#2722
No description provided.