Агент пишет тесты с теми же ошибками, что и код — как это ловить
Если агент пишет код и тесты к нему, ошибка может сохраниться в обоих. Мутационное тестирование и проверка того, какой именно баг ловит тест, помогают это обнаружить.
- Модели, генерирующие тесты при виде дефектной реализации, обнаруживали около 14% отказов, а из свежего контекста — около 25%
- Система ACH от Meta генерирует имитации отказов и просит модель написать тест, проходящий на оригинальном коде и падающий на изменённом
- В оценке Meta на Android Kotlin 277 из 571 антимутантных тестов (около 49%) не добавили нового покрытия

Агент пишет патч, пишет для него тесты, выполняет их и сообщает об успехе. Дифф выглядит здраво, проверка пройдена. Но реализация может согласовываться с тестами, потому что в обоих местах содержится одна и та же ошибка. Если агент недопонял требования при написании кода, это непонимание может сохраниться и при чтении кода для получения ожидаемого результата.
Автор перевода на «Хабре» предлагает просить агента показывать поведение, от которого страхует тест, вероятную неисправную версию, которую тест отклонит, и откуда берётся ожидаемый ответ. Последнее не менее важно, чем демонстрация возможности провалить тест.
Пример с доставкой
Рассмотрим функцию расчёта стоимости доставки: если заказ стоит менее 5000 центов, доставка стоит 500 центов, если 5000 и более — бесплатно. В коде используется условие total_cents >= 5000. Тесты проверяют значения 4999 и 5001, обе ветки выполняются. Но если заменить >= на >, оба теста по-прежнему проходят — а клиент, заказавший ровно на 5000 центов, заплатит за доставку вопреки политике.
Чтобы ухватить разницу, нужно добавить проверку shipping_fee(5000) == 0. При правильной реализации тест проходит, при изменённой — нет. Так можно указать на требование и объяснить, почему отказ важен.
Что показало исследование
В июле 2026 года вышел препринт, в котором Майкл Константиноу, Флориан Тамбон и Майк Пападакис сравнили генерацию тестов в пяти моделях и проверили их на трёх бенчмарках на Python. Модели предлагалась дефектная реализация, и модель обнаруживала около 14% отказов. Тесты, сгенерированные из свежего контекста на основе описания задачи, отлавливали около 25%.
Хуанг с коллегами обнаружили, что контекст с корректной реализацией помогает генерации тестов, если модель сравнивает его с некорректным кодом. Но не стоит трактовать поведение модели как готовый ответ, не убедившись, что она ведёт себя правильно.
Мутационное тестирование
Элементарный пример мутационного тестирования — изменить оператор сравнения, прогнать тесты и посмотреть, отловят ли они изменение. Выживший мутант — повод изучить тесты подробнее. Идею описали Ричард ДеМильо, Ричард Липтон и Фредерик Сэйуорд ещё в 1978 году.
В Meta этот подход сочетают с большими языковыми моделями. Система ACH начинает с инженерной проблемы, генерирует имитации отказов, ускользающие от имеющихся тестов, после чего просит модель написать тест, который проходит на оригинальном коде и не проходит на изменённом. Затем система отфильтровывает предложенные изменения и отправляет тесты на ревью.
При оценке на Android Kotlin 277 из 571 антимутантных тестов (около 49%) не добавили ни строки тестового покрытия — они находили различия, уже охваченные тестами. Фильтр, требующий покрытия новой строки, отбрасывал бы такие тесты.
ACH усиливает уже существующее поведение на материале избранных сымитированных регрессий, но не устанавливает, что оно удовлетворяет всем требованиям. Для сгенерированных тестов есть конкретное применение: ревьюер может сам проверить отказ, отлавливаемый каждым предложенным тестом.
Для профиТехнические детали: архитектура, цифры, ссылки
Исследование: препринт Майкла Константиноу, Флориана Тамбона и Майка Пападакиса (июль 2026) — сравнение генерации тестов в пяти моделях на трёх бенчмарках на Python. Модели предлагалась дефектная реализация, доля обнаруженных отказов — около 14%; тесты из свежего контекста — около 25%.
Система ACH от Meta: генерирует имитации отказов, просит модель написать тест, проходящий на оригинальном коде и падающий на изменённом, фильтрует изменения и отправляет тесты на ревью. Оценка на Android Kotlin: 277 из 571 антимутантных тестов (около 49%) не добавили нового покрытия.
TestGen-LLM от Meta фильтрует тесты, которые собираются, неоднократно проходят и добавляют покрытие. Подход мутационного тестирования восходит к работе Ричарда ДеМильо, Ричарда Липтона и Фредерика Сэйуорда 1978 года об отборе тестовых данных.
Вопросы и ответы
- Почему тесты, написанные агентом, могут пропускать баги?
- Если агент недопонял требования при написании кода, это непонимание может сохраниться и при генерации тестов, поэтому ошибка остаётся в обоих.
- Что такое мутационное тестирование?
- Это подход, при котором в программу намеренно вносят изменение (например, меняют оператор сравнения), прогоняют тесты и смотрят, отловят ли они изменение.
- Какую долю отказов находили модели в исследовании?
- Около 14% при виде дефектной реализации и около 25% при генерации тестов из свежего контекста на основе описания задачи.


