Microsoft는 code-testing-generator를 발표했다. 이는 단위 테스트를 생성하는 다중 언어 오픈 소스 에이전트다. 이 에이전트는 올바르게 보이는 테스트를 생성하는 데 그치지 않고, 먼저 프로젝트 저장소에서 학습한 다음 테스트가 필요한 코드를 식별하고, 사용되는 테스트 프레임워크와 파일을 배치할 위치, 빌드 및 실행 명령을 파악한 뒤, 테스트가 저장소의 일반적인 테스트 경로에서 검색되는지 검증한다.
이 에이전트는 dotnet/skills 저장소의 dotnet-test 확장 기능으로 제공된다. 테스트 대상 코드를 격리하고 외부 서비스 및 기타 종속성에 대한 모의를 생성한다. 현재 범위에는 통합 테스트, 종단 간 테스트, 브라우저 테스트 또는 성능 테스트가 포함되지 않는다.
테스트를 작성하기 전에 저장소를 이해하는 것부터 시작
코드 생성을 바로 시작하는 대신, 에이전트는 테스트해야 할 부분을 찾고 언어와 테스트 프레임워크를 파악하며 기존 테스트를 검토해 새 테스트를 어디에 어떤 방식으로 작성할지 확인한다. 또한 빌드 및 테스트 실행 명령을 식별한다.
이 방식은 새 테스트 프로젝트를 별도로 빌드하고 실행하면 성공하지만, 솔루션이나 지속적 통합 환경에서 사용하는 테스트 명령에는 포함되지 않는 상황을 방지하는 데 도움이 된다. 따라서 에이전트는 저장소가 테스트를 검색하는 방식을 검사하고 새 테스트가 그 과정에 나타나는지 확인한다.
에이전트는 요청 규모에 따라 작업 수준을 선택한다.
- 직접: 관련 코드를 읽고 테스트를 작성한 다음 결과를 검증한다.
- 단일 패스: 한 번 검색하고 계획을 세운 다음 계획을 실행한다.
- 반복: 대규모 요청을 처리하거나 특정 커버리지 목표에 도달할 때까지 검색, 계획, 실행 사이클을 반복한다.
테스트가 성공했는지만이 아니라 유용한지도 검증
더 큰 작업에서 에이전트는 테스트가 필요한 코드를 나열하고, 더 복잡한 종속성이 있는 코드로 넘어가기 전에 더 단순한 부분부터 시작한다. 또한 각 동작을 테스트 파일에 연결하고 프로젝트의 로컬 관례를 따르며 작업 중 테스트를 실행한다.
생성된 코드가 빌드되지 않으면 에이전트가 이를 수정하고, 어설션이 올바르지 않으면 소스로 돌아가 테스트를 수정한다. 테스트를 생성하는 동안 프로덕션 코드는 변경하지 않으며, 외부 주소를 호출하거나 포트를 열거나 정밀한 타이밍에 의존하는 단위 테스트도 피한다.
에이전트는 완료 전에 일련의 검사를 수행한다. 여기에는 테스트가 실패해야 하는 작은 변경을 적용하는 간소화된 변이 테스트, 약하거나 누락된 어설션 검색, 필요한 각 시나리오에 테스트가 존재하는지 확인하는 작업이 포함된다. 또한 전체 작업 공간을 빌드하고 전체 테스트 모음을 실행하며, 저장소의 테스트 명령이 새 테스트를 찾을 수 있는지 확인한다.
내부 테스트 결과
최신 내부 벤치마크에서 에이전트는 152개 작업 중 140개를 완료해 92.1%의 비율을 기록했다. 동일한 모델을 사용한 표준 Copilot은 120개 작업을 완료해 78.9%를 기록했다. Microsoft는 실패 사례가 63% 감소했다고 밝혔다.
가장 큰 차이는 대부분의 결정을 에이전트에 맡기는 모호한 요청에서 나타났다. 전문 에이전트는 89개 중 79개 작업에 성공한 반면, 표준 Copilot은 59개 작업에 성공했으며 실패 사례는 30건에서 10건으로 감소했다. 반면 상세한 요청에서는 결과가 비슷했으며, 에이전트는 63개 작업 중 61개에 성공했다.
특정 코드 변경에 대한 테스트 작성을 요청한 15개 작업에서 에이전트는 모든 작업에 성공했지만, 표준 Copilot은 하나도 성공하지 못했다. 공통 결과 기준으로는 두 시스템이 119개 작업에 성공했고, 전문 에이전트만 21개 작업에 성공했으며, 표준 Copilot만 1개 작업에 성공했고, 두 시스템 모두 11개 작업에 실패했다.
에이전트는 6,963개의 테스트를 생성했고, 표준 Copilot은 7,129개의 테스트를 생성했다. 최종 평균 라인 커버리지는 각각 72.4%와 72.2%였으며, 평균 브랜치 커버리지는 각각 49.8%와 49.1%였다. 평균 작업 시간은 전문 에이전트가 359초, 표준 Copilot이 380초였다. Microsoft는 성과 향상이 더 많은 테스트를 생성했기 때문이 아니라 신뢰성에서 비롯됐다고 설명한다.
다중 언어 지원 및 확장 기능 제공
함께 제공되는 지침에는 .NET, Python, TypeScript, JavaScript, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell 및 C++에 대한 지원이 포함된다. 테스트 결과 에이전트는 모든 프로젝트에 C# 패턴을 적용하는 대신 각 저장소의 관례를 학습하는 것으로 나타났다.
SWE Atlas 벤치마크의 44개 작업을 대상으로 한 또 다른 테스트에서 에이전트는 16개 작업을 완료해 36.4%의 비율을 기록했고, 표준 Copilot은 12개 작업을 완료해 27.3%를 기록했다. 또한 생성된 테스트는 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 에이전트를 선택하면 된다.