A Microsoft anunciou o code-testing-generator, um agente multilíngue e de código aberto para gerar testes unitários. O agente não se limita a criar testes que parecem corretos: primeiro aprende com o repositório do projeto e, em seguida, identifica o código que precisa ser testado, a estrutura de testes utilizada, o local onde os arquivos devem ser colocados e os comandos de compilação e execução, antes de verificar se os testes são descobertos no fluxo de testes habitual do repositório.
O agente está disponível na extensão dotnet-test do repositório dotnet/skills. Ele isola o código em teste, criando simulações para serviços externos e outras dependências. Seu escopo atual não inclui testes de integração, testes de ponta a ponta, testes de navegador ou testes de desempenho.
Começa entendendo o repositório antes de escrever os testes
Em vez de começar diretamente pela geração do código, o agente procura a parte que deve ser testada, identifica a linguagem e a estrutura de testes e analisa os testes existentes para saber onde colocar os novos testes e como escrevê-los. Ele também identifica os comandos de compilação e de execução dos testes.
Essa abordagem ajuda a evitar uma situação em que um novo projeto de testes seja compilado e executado corretamente de forma isolada, mas não seja incluído na solução ou no comando de testes usado pelo ambiente de integração contínua. Por isso, o agente examina como o repositório descobre os testes e confirma que os novos testes aparecem nesse processo.
O agente escolhe o nível de trabalho de acordo com o tamanho da solicitação:
- Direto: ler o código relevante, escrever os testes e validar o resultado.
- Uma passagem: pesquisar e planejar uma vez e, em seguida, executar o plano.
- Iterativo: repetir o ciclo de pesquisa, planejamento e execução para cobrir uma solicitação grande ou atingir uma meta de cobertura específica.
Verifica a utilidade dos testes, não apenas seu sucesso
Nas tarefas maiores, o agente lista o código que precisa de testes e começa pelas partes mais simples antes de passar ao código com mais dependências. Ele também associa cada comportamento a um arquivo de teste, segue as convenções locais do projeto e executa os testes durante o trabalho.
Se o código gerado não for compilado, o agente o corrige; se uma asserção estiver incorreta, ele retorna à origem e corrige o teste. Ele não modifica o código de produção durante a geração dos testes e evita testes unitários que chamem endereços externos, abram portas ou dependam de temporização precisa.
Antes de terminar, o agente realiza um conjunto de verificações, incluindo pequenas alterações que, supostamente, fariam os testes falhar, em uma forma simplificada de teste de mutação; procura asserções fracas ou ausentes; e confirma a existência de um teste para cada cenário solicitado. Ele também compila todo o espaço de trabalho e executa o conjunto completo de testes, verificando se o comando de testes do repositório consegue encontrar os novos testes.
Resultados do teste interno
No teste interno padronizado mais recente, o agente concluiu 140 de 152 tarefas, com uma taxa de 92,1%, contra 120 tarefas e uma taxa de 78,9% do Copilot padrão, usando o mesmo modelo. A Microsoft afirmou que o número de falhas caiu 63%.
As maiores diferenças apareceram nas solicitações ambíguas, que deixam a maior parte das decisões para o agente: o agente especializado teve sucesso em 79 de 89 tarefas, contra 59 tarefas do Copilot padrão, e as falhas caíram de 30 para 10. Já nas solicitações detalhadas, os resultados foram próximos: o agente teve sucesso em 61 de 63 tarefas.
Em 15 tarefas que pediam a escrita de testes para uma alteração específica no código, o agente teve sucesso em todas, enquanto o Copilot padrão não teve sucesso em nenhuma. Considerando os resultados compartilhados, os dois sistemas tiveram sucesso em 119 tarefas, enquanto apenas o agente especializado teve sucesso em 21 tarefas, apenas o Copilot padrão teve sucesso em uma tarefa e ambos falharam em 11 tarefas.
O agente gerou 6.963 testes, em comparação com 7.129 testes do Copilot padrão, com uma cobertura média final de linhas de 72,4% contra 72,2% e uma cobertura média de ramificações de 49,8% contra 49,1%. O tempo médio da tarefa também foi de 359 segundos para o agente especializado e 380 segundos para o Copilot padrão. A Microsoft afirma que o ganho veio da confiabilidade, não da produção de um número maior de testes.
Suporte a várias linguagens e disponibilidade da extensão
As instruções incluídas oferecem suporte a .NET, Python, TypeScript, JavaScript, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell e C++. Os testes mostraram que o agente aprende as convenções de cada repositório, em vez de aplicar padrões de C# a todos os projetos.
Em outro teste com 44 tarefas do benchmark SWE Atlas, o agente concluiu 16 tarefas, com uma taxa de 36,4%, contra 12 tarefas e uma taxa de 27,3% do Copilot padrão. Os testes gerados também passaram em 550 casos e conseguiram detectar 360 erros injetados, contra 493 e 316, respectivamente, do sistema padrão. A Microsoft reconhece que esse benchmark é mais difícil e que as taxas de conclusão são muito menores nele.
A extensão pode ser usada no GitHub Copilot CLI e também está disponível no Visual Studio Code e no VS Code Insiders por meio do suporte a extensões, que ainda está em fase de pré-visualização. A Microsoft também está trabalhando no suporte ao Visual Studio. Para instalar a extensão no GitHub Copilot CLI, o usuário adiciona o marketplace de extensões com o comando /plugin marketplace add dotnet/skills, depois instala a extensão usando /plugin install dotnet-test@dotnet-agent-skills, reinicia a CLI e seleciona o agente code-testing-generator.