por Juan Altmayer Pizzorno y Emery Berger en el laboratorio PLASMA de UMass Amherst.
CoverUp genera automáticamente pruebas que garantizan que se pruebe una mayor cantidad de su código (es decir, aumenta la cobertura de su código). CoverUp también puede crear un conjunto de pruebas desde cero si aún no tienes uno. Las nuevas pruebas se basan en su código, lo que las hace útiles para las pruebas de regresión.
CoverUp está diseñado para trabajar en estrecha colaboración con el marco de prueba de pytest. Para generar pruebas, primero mide la cobertura de su suite usando SlipCover. Luego selecciona partes del código que necesitan más pruebas (es decir, código que está descubierto). Luego, CoverUp entabla una conversación con un LLM, solicita pruebas, verifica los resultados para verificar que se ejecutan y aumentan la cobertura (nuevamente usando SlipCover) y vuelve a solicitar ajustes según sea necesario. Finalmente, CoverUp verifica opcionalmente que las nuevas pruebas se integren bien, intentando resolver cualquier problema que encuentre.
Para obtener detalles técnicos y una evaluación completa, consulte nuestro artículo de arXiv, CoverUp: generación de pruebas basadas en LLM guiadas por cobertura (PDF).
CoverUp está disponible en PyPI, por lo que puede instalarlo simplemente con
$ python3 -m pip install coverup
CoverUp se puede utilizar con modelos OpenAI, Anthropic o AWS Bedrock; requiere que los detalles de acceso se definan como variables de entorno de shell: OPENAI_API_KEY
, ANTHROPIC_API_KEY
o AWS_ACCESS_KEY_ID
/ AWS_SECRET_ACCESS_KEY
/ AWS_REGION_NAME
, respectivamente.
Por ejemplo, para OpenAI, crearía una cuenta, se aseguraría de que tenga un saldo positivo y luego crearía una clave API, almacenando su "clave secreta" (generalmente una cadena que comienza con sk-
) en una variable de entorno llamada OPENAI_API_KEY
:
$ export OPENAI_API_KEY= < ...your-api-key... >
Si su módulo se llama mymod
, sus fuentes están en src
y las pruebas en tests
, puede ejecutar CoverUp como
$ coverup --source-dir src/mymod --tests-dir tests
CoverUp luego crea pruebas llamadas test_coverup_N.py
, donde N
es un número, en el directorio tests
.
Aquí tenemos a CoverUp para crear pruebas adicionales para el popular paquete Flask:
$ coverup --package src/flask --tests tests
Measuring coverage... 90.9%
Prompting gpt-4o-2024-05-13 for tests to increase coverage...
(in the following, G=good, F=failed, U=useless and R=retry)
100%|███████████████████████████████████████| 92/92 [01:01<00:00, 1.50it/s, G=55, F=122, U=20, R=0, cost=~$4.19]
Measuring coverage... 94.4%
$
En poco más de un minuto, CoverUp aumenta la cobertura de prueba de Flask del 90,9 % al 94,4 %.
Mientras evalúa cada prueba recién generada, CoverUp la ejecuta varias veces en un intento de detectar pruebas deficientes; que se puede ajustar con las opciones --repeat-tests
y --no-repeat-tests
. Si CoverUp detecta que una prueba recién generada es incorrecta, solicita al LLM una corrección.
CoverUp solo agrega pruebas a la suite que, cuando se ejecutan solas, pasan y aumentan la cobertura. Sin embargo, es posible que las pruebas "contaminen" el estado, cambiándolo de una manera que provoque que otras pruebas fallen. De forma predeterminada, CoverUp utiliza el complemento pytest-cleanslate para aislar las pruebas, evitando cualquier contaminación de las pruebas (en memoria); eso se puede desactivar pasando la opción --no-isolate-tests
. También se le puede pedir a CoverUp que busque y deshabilite el módulo o función de prueba contaminante ( --disable-polluting
) o simplemente deshabilite cualquier prueba fallida (``--disable-failing`).
Para evaluar las pruebas generadas por el LLM, CoverUp debe ejecutarlas. Para mayor seguridad y minimizar el riesgo de daños a su sistema, recomendamos ejecutar CoverUp con Docker.
El gráfico muestra CoverUp en comparación con CodaMosa, un generador de pruebas basado en búsquedas de última generación basado en el generador de pruebas Pynguin. Para este experimento, tanto CoverUp como CodaMosa crearon pruebas "desde cero", es decir, ignorando cualquier conjunto de pruebas existente. Las barras muestran la diferencia en el porcentaje de cobertura entre CoverUp y CodaMosa para varios módulos de Python; Las barras verdes, por encima de 0, indican que CoverUp logró una mayor cobertura.
Como muestra el gráfico, CoverUp logra una cobertura mayor que CodaMosa para la mayoría de los módulos.
Esta es una versión anticipada de CoverUp. Disfrútelo y disculpe cualquier interrupción mientras trabajamos para mejorarlo. Agradecemos informes de errores, informes de experiencias y solicitudes de funciones (abra un problema).