Microsoft anunció code-testing-generator, un agente multilingüe y de código abierto para generar pruebas unitarias. El agente no se limita a crear pruebas que parecen correctas, sino que primero aprende del repositorio del proyecto y después identifica el código que necesita pruebas, el marco de pruebas utilizado, dónde colocar los archivos y los comandos de compilación y ejecución, antes de verificar que las pruebas se detecten dentro de la ruta de pruebas habitual del repositorio.
El agente está disponible mediante la extensión dotnet-test en el repositorio dotnet/skills. Aísla el código bajo prueba y crea simulaciones de los servicios externos y otras dependencias. Su alcance actual no incluye pruebas de integración, pruebas de extremo a extremo, pruebas de navegador ni pruebas de rendimiento.
Comienza comprendiendo el repositorio antes de escribir las pruebas
En lugar de comenzar directamente a generar código, el agente busca la parte que debe probarse, identifica el lenguaje y el marco de pruebas, y revisa las pruebas existentes para saber dónde colocar las nuevas y cómo escribirlas. También determina los comandos de compilación y ejecución de las pruebas.
Este enfoque ayuda a evitar una situación en la que un nuevo proyecto de pruebas se compile y ejecute correctamente de forma independiente, pero no se incluya en la solución o en el comando de pruebas que utiliza el entorno de integración continua. Por ello, el agente examina cómo el repositorio detecta las pruebas y confirma que las nuevas aparezcan en ese proceso.
El agente elige el nivel de trabajo según el tamaño de la solicitud:
- Directo: leer el código correspondiente, escribir las pruebas y después validar el resultado.
- Una pasada: buscar y planificar una vez, y después ejecutar el plan.
- Iterativo: repetir el ciclo de búsqueda, planificación y ejecución para cubrir una solicitud grande o alcanzar un objetivo de cobertura específico.
Verifica la utilidad de las pruebas, no solo que tengan éxito
En las tareas más grandes, el agente enumera el código que necesita pruebas y comienza por las partes más sencillas antes de pasar al código con más dependencias. También relaciona cada comportamiento con un archivo de pruebas, respeta las convenciones locales del proyecto y ejecuta las pruebas durante el trabajo.
Si el código generado no compila, el agente lo corrige; y si una de las aserciones no es correcta, vuelve al código fuente y corrige la prueba. No modifica el código de producción durante la generación de las pruebas y evita las pruebas unitarias que llaman a direcciones externas, abren puertos o dependen de una temporización precisa.
Antes de finalizar, el agente realiza varias comprobaciones, incluidos pequeños cambios que supuestamente deberían hacer que las pruebas fallaran, como una versión simplificada de las pruebas de mutación; busca aserciones débiles o ausentes y confirma que exista una prueba para cada escenario requerido. También compila todo el espacio de trabajo y ejecuta el conjunto completo de pruebas, y verifica que el comando de pruebas del repositorio pueda encontrar las nuevas pruebas.
Resultados de la prueba interna
En la prueba comparativa interna más reciente, el agente completó 140 de 152 tareas, con una tasa del 92,1 %, frente a 120 tareas y una tasa del 78,9 % para Copilot estándar, utilizando el mismo modelo. Microsoft afirmó que el número de fallos se redujo un 63 %.
Las mayores diferencias aparecieron en las solicitudes ambiguas que dejan la mayoría de las decisiones en manos del agente: el agente especializado tuvo éxito en 79 de 89 tareas, frente a 59 tareas de Copilot estándar, y los fallos disminuyeron de 30 a 10. En cambio, en las solicitudes detalladas los resultados fueron similares: el agente tuvo éxito en 61 de 63 tareas.
En 15 tareas que solicitaban escribir pruebas para un cambio específico en el código, el agente tuvo éxito en todas, mientras que Copilot estándar no tuvo éxito en ninguna. En cuanto a los resultados compartidos, ambos sistemas tuvieron éxito en 119 tareas; el agente especializado tuvo éxito por sí solo en 21 tareas, Copilot estándar por sí solo en una tarea y ambos sistemas fallaron en 11 tareas.
El agente generó 6.963 pruebas, frente a 7.129 pruebas de Copilot estándar, con una cobertura media final de líneas del 72,4 % frente al 72,2 %, y una cobertura media de ramas del 49,8 % frente al 49,1 %. El tiempo medio por tarea también fue de 359 segundos para el agente especializado y de 380 segundos para Copilot estándar. Microsoft afirma que la ventaja provino de la fiabilidad, no de producir un mayor número de pruebas.
Compatibilidad con varios lenguajes y disponibilidad de la extensión
Las instrucciones incluidas ofrecen compatibilidad con .NET, Python, TypeScript, JavaScript, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell y C++. Las pruebas demostraron que el agente aprende las convenciones de cada repositorio en lugar de aplicar patrones de C# a todos los proyectos.
En otra prueba realizada con 44 tareas del benchmark SWE Atlas, el agente completó 16 tareas, con una tasa del 36,4 %, frente a 12 tareas y una tasa del 27,3 % para Copilot estándar. Las pruebas generadas también superaron 550 casos y lograron detectar 360 errores inyectados, frente a 493 y 316, respectivamente, del sistema estándar. Microsoft reconoce que este benchmark es más difícil y que sus tasas de finalización son mucho menores.
La extensión puede utilizarse en GitHub Copilot CLI y también está disponible en Visual Studio Code y VS Code Insiders mediante la compatibilidad con extensiones, que todavía se encuentra en fase de vista previa. Microsoft también está trabajando en la compatibilidad con Visual Studio. Para instalar la extensión en GitHub Copilot CLI, el usuario añade el mercado de extensiones mediante el comando /plugin marketplace add dotnet/skills, después la instala con /plugin install dotnet-test@dotnet-agent-skills, reinicia la CLI y selecciona el agente code-testing-generator.