Тестирование и рефакторинг с агентом
Автор: Казачкин Даниил Михайлович · Обновлено
Claude Code может генерировать тесты и выполнять рефакторинг, но количество тестов не равно качеству проверки. Задача разработчика — задать поведенческие границы, сохранить семантику и не позволить агенту «улучшить» код вместе с ожидаемым результатом так, что регрессия останется незаметной.
Тестируйте контракт
Сначала перечислите важные сценарии: нормальный путь, границы, ошибки, права доступа и конкурентность. Просите тестировать наблюдаемое поведение через публичный интерфейс, если внутреннее устройство не является контрактом.
Для исправления дефекта тест должен быть написан или показан до изменения реализации и падать по ожидаемой причине.
Иерархия проверок
Начинайте с быстрой целевой проверки, затем расширяйте область:
- тест нового сценария;
- тесты затронутого модуля;
- typecheck и lint;
- интеграционный или e2e-сценарий;
- полная сборка, если изменение влияет на неё.
Команды должны браться из проекта и CLAUDE.md, а не угадываться.
Рефакторинг без изменения поведения
Перед рефакторингом зафиксируйте существующий контракт тестами. Попросите отделить механические изменения от функциональных. Маленькие шаги с зелёной проверкой легче рецензировать, чем переписывание нескольких слоёв одновременно.
Если тест пришлось изменить, агент должен объяснить, какое требование изменилось. Одновременная правка реализации и ожиданий — зона повышенного внимания.
Борьба с ложной уверенностью
Проверяйте, что команда действительно выполнилась после последней правки, процесс завершился с успешным кодом, а нужный тест не был skipped. Для UI или интеграции одного unit-теста может быть недостаточно. Просите точный итог: число suites, failures и предупреждения.
Упражнение: безопасный рефакторинг
Выберите функцию с несколькими ветвями:
- Попросите построить таблицу входов и результатов.
- Добавьте недостающие характеристические тесты.
- Зафиксируйте, что публичный API не меняется.
- Выполните один структурный шаг.
- Просмотрите diff и запустите расширенный набор.
- Отдельным запросом найдите непротестированное отличие поведения.
Что важно запомнить
- Тест должен защищать поведение, а не подыгрывать реализации.
- Проверки расширяют от целевой к системной.
- Рефакторинг требует зафиксированной семантики.
- Успех подтверждается фактическим выводом последнего запуска.
Частые вопросы
Может ли Claude написать тест, который всегда проходит?
Да, как и человек. Проверяйте, что тест падает на намеренно сломанной или прежней реализации и утверждает важный результат.
Нужно ли требовать 100% coverage?
Не обязательно. Coverage показывает исполненные строки, но не доказывает полноту сценариев и корректность assertions.
Когда рефакторинг лучше разделить на отдельный PR?
Когда он велик, не нужен для исправления или затрудняет понимание функционального diff. Разделение уменьшает риск review.