BorisovAI
Все публикации
Новая функцияtrend-analisisClaude Code

Тесты падают: как найти виновника, когда это наследство

Тесты падают: как найти виновника, когда это наследство

Когда тесты ломаются, но ты не виноват: история отладки в проекте trend-analysis

Представь ситуацию: ты вносишь изменения в систему анализа трендов, коммитишь в ветку feat/scoring-v2-tavily-citations, запускаешь тесты — и вот, шесть тестов падают красными крестами. Сердце замирает. Первый вопрос: это моя вина или наследство от предков?

Охота на виновника начинается

В проекте trend-analysis я добавлял новые параметры к функции _run_analysis: time_horizon и parent_job_id как именованные аргументы с дефолтными значениями. На бумаге — всё обратно совместимо. На тестах — красный экран смерти.

Первым подозреваемым стала функция next_version(). Её вызов зависит от импорта DB_PATH, и я подумал: может быть, мокирование в тестах не сработало? Но нет — логика показала, что next_version() вообще не должна вызваться, потому что в тесте trend_id=None, а вызов обёрнут в условие if trend_id:.

Второй подозреваемый: graph_builder_agent. Эта штука вызывается со специальным параметром progress_callback=on_zone_progress, но её мок в тестах — просто лямбда-функция, которая принимает только один позиционный аргумент:

lambda s: {...}  # вот так мокируют

А я вызываю её с дополнительным именованным аргументом. Лямбда восстаёт против **kwargs!

Разворот сюжета

Но подождите. Я начал копать логику коммитов и осознал: эта проблема существует ещё до моих изменений. Параметр progress_callback был добавлен раньше, в одном из предыдущих PR, но тест так и не был обновлён под эту функциональность. Я найденный баг не создавал, я его просто разбудил.

Все шесть падающих тестов — это pre-existing issues, наследство от ранних итераций разработки. Мои изменения сами по себе не ломают функционал, они полностью обратно совместимы.

Что дальше?

Решили остановиться на стадии прототипа для валидации концепции. На бэкенде я уже поднял:

  • миграции БД для версионирования анализов (добавил version, depth, time_horizon, parent_job_id);
  • новые функции next_version() и find_analyses_by_trend() в analysis_store.py;
  • обновлённые Pydantic-модели в schemas.py;
  • API endpoints с автоинкрементом версий в routes.py.

Фронтенд получил интерактивный HTML-прототип с четырьмя экранами: временная шкала анализов тренда, навигация между версиями с дельта-полосой, unified/side-by-side сравнение версий и группировка отчётов по трендам.

Урок на память

Когда читаешь падающий тест, первое правило: не сразу ищи свою вину. Иногда это старый долг проекта, который ждал своего часа. Отделение pre-existing issues от собственных ошибок — это половина успеха в отладке. И всегда проверяй логику вызовов функций: лямбда-функция, которая не ожидает **kwargs, будет молча восставать против незнакомых параметров.

Так что: мои изменения безопасны, архитектура готова к следующей фазе, а шесть тестов ждут своего героя, который их наконец-то заимпортирует. 😄

Метаданные

Session ID:
grouped_trend-analisis_20260208_1523
Branch:
feat/scoring-v2-tavily-citations
Dev Joke
Разработчик: «Я знаю Vim». HR: «На каком уровне?». Разработчик: «На уровне Stack Overflow».

Часть потока:

Разработка: trend-analisis

Оцените материал

0/1000