Microsoft объявила о выпуске code-testing-generator — открытого многоязычного агента для генерации модульных тестов. Агент не ограничивается созданием тестов, которые выглядят корректными: сначала он изучает репозиторий проекта, затем определяет код, нуждающийся в тестировании, используемый тестовый фреймворк, место размещения файлов, команды сборки и запуска, после чего проверяет, что тесты обнаруживаются в обычном тестовом процессе репозитория.
Агент доступен в составе расширения dotnet-test в репозитории dotnet/skills. Он изолирует тестируемый код, создавая имитации внешних сервисов и других зависимостей. В его текущую область применения не входят интеграционные тесты, сквозные тесты, браузерные тесты и тесты производительности.
Сначала изучает репозиторий, а затем пишет тесты
Вместо непосредственного начала генерации кода агент ищет часть, которую требуется протестировать, определяет язык и тестовый фреймворк, изучает существующие тесты, чтобы понять, где размещать новые тесты и как их писать. Он также определяет команды сборки и запуска тестов.
Такой подход помогает избежать ситуации, когда новый тестовый проект успешно собирается и запускается отдельно, но не включается в решение или команду тестирования, используемую средой непрерывной интеграции. Поэтому агент проверяет, как репозиторий обнаруживает тесты, и убеждается, что новые тесты появляются в этом процессе.
Агент выбирает уровень работы в зависимости от масштаба запроса:
- Прямой: чтение соответствующего кода, написание тестов и проверка результата.
- Однопроходный: однократные поиск и планирование с последующим выполнением плана.
- Итеративный: повторение цикла поиска, планирования и выполнения для охвата большого запроса или достижения заданной цели по покрытию.
Проверяет полезность тестов, а не только их успешное выполнение
В более крупных задачах агент перечисляет код, нуждающийся в тестах, начиная с самых простых частей и переходя к коду с большим количеством зависимостей. Он также связывает каждое поведение с тестовым файлом, соблюдает локальные правила проекта и запускает тесты в процессе работы.
Если полученный код не собирается, агент исправляет его, а если одно из утверждений некорректно, возвращается к исходному коду и исправляет тест. При генерации тестов он не изменяет производственный код, а также избегает модульных тестов, которые обращаются к внешним адресам, открывают порты или зависят от точного времени.
Перед завершением агент выполняет набор проверок, включая небольшие изменения, которые, как предполагается, должны привести к сбою тестов, в упрощённой форме мутационного тестирования, поиск слабых или отсутствующих утверждений и проверку наличия теста для каждого требуемого сценария. Он также полностью собирает рабочую область и запускает весь набор тестов, проверяя способность команды тестирования репозитория находить новые тесты.
Результаты внутреннего тестирования
В последнем внутреннем эталонном тесте агент выполнил 140 из 152 задач, достигнув показателя 92,1%, против 120 задач и показателя 78,9% у стандартного Copilot при использовании той же модели. Microsoft сообщила, что число сбоев снизилось на 63%.
Наибольшие различия проявились в неоднозначных запросах, оставляющих большую часть решений агенту: специализированный агент успешно выполнил 79 из 89 задач против 59 задач у стандартного Copilot, а число сбоев снизилось с 30 до 10. Для подробных запросов результаты были близкими: агент успешно выполнил 61 из 63 задач.
В 15 задачах, требовавших написать тесты для конкретного изменения в коде, агент успешно выполнил все задачи, тогда как стандартный Copilot не выполнил ни одной. В общей совокупности результатов обе системы успешно выполнили 119 задач, специализированный агент один выполнил 21 задачу, стандартный Copilot один выполнил одну задачу, а обе системы не выполнили 11 задач.
Агент сгенерировал 6 963 теста против 7 129 тестов у стандартного Copilot; среднее итоговое покрытие строк составило 72,4% против 72,2%, а среднее покрытие ветвей — 49,8% против 49,1%. Среднее время выполнения задачи также составило 359 секунд для специализированного агента и 380 секунд для стандартного Copilot. Microsoft утверждает, что преимущество связано с надёжностью, а не с генерацией большего числа тестов.
Поддержка нескольких языков и доступность расширения
Прилагаемые инструкции поддерживают .NET, Python, TypeScript, JavaScript, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell и C++. Тесты показали, что агент изучает правила каждого репозитория, а не применяет шаблоны C# ко всем проектам.
В другом тесте на 44 задачах из набора SWE Atlas агент выполнил 16 задач, достигнув показателя 36,4%, против 12 задач и показателя 27,3% у стандартного Copilot. Сгенерированные тесты также прошли 550 случаев и обнаружили 360 внедрённых ошибок против 493 и 316 соответственно у стандартной системы. Microsoft признаёт, что этот эталонный тест сложнее, а показатели выполнения в нём значительно ниже.
Расширение можно использовать в GitHub Copilot CLI; оно также доступно в Visual Studio Code и VS Code Insiders через поддержку расширений, которая пока находится на стадии предварительного просмотра. Microsoft также работает над поддержкой Visual Studio. Чтобы установить расширение в GitHub Copilot CLI, пользователь добавляет рынок расширений командой /plugin marketplace add dotnet/skills, затем устанавливает его с помощью /plugin install dotnet-test@dotnet-agent-skills, перезапускает CLI и выбирает агента code-testing-generator.