TestPilot es una herramienta para generar automáticamente pruebas unitarias para paquetes NPM escritos en JavaScript/TypeScript utilizando un modelo de lenguaje grande (LLM).
Tenga en cuenta que TestPilot representa una exploración temprana en el uso de LLM para la generación de pruebas, y se ha puesto a disposición de código abierto como base para la investigación y la exploración. Para el uso diario, es probable que las características de la generación de pruebas en el chat de copilotos produzcan mejores resultados.
TestPilot genera pruebas para una función f dada al solicitar el LLM con un esqueleto de una prueba para f , incluida la información sobre f incrustada en los comentarios de código, como su firma, el cuerpo de f y los usos de ejemplos de f extraídos automáticamente de la documentación del proyecto. La respuesta del modelo se analiza y se traduce en una prueba unitaria ejecutable. Opcionalmente, la prueba se ejecuta y si falla, el modelo se solicita nuevamente con información adicional sobre la prueba fallida, lo que le da la oportunidad de refinar la prueba.
A diferencia de otros sistemas para la generación de pruebas basada en LLM, TestPilot no requiere capacitación adicional o aprendizaje de refuerzo, y no se necesitan ejemplos de funciones y sus pruebas asociadas.
Un artículo de investigación que describe TestPilot en detalle está disponible en ARXIV e IEEExplore.
En general, para poder ejecutar TestPilot, necesita acceso a un LLM estilo Codex con API de finalización. Establezca la variable de entorno TESTPILOT_LLM_API_ENDPOINT en la URL del punto final de la API LLM que desea usar, y TESTPILOT_LLM_AUTH_HEADERS en un objeto JSON que contiene los encabezados que necesita para autenticar con la API.
Los valores típicos para estas variables pueden ser:
TESTPILOT_LLM_API_ENDPOINT='https://api.openai.com/v1/engines/code-cushman-001/completions'TESTPILOT_LLM_AUTH_HEADERS='{"Authorization": "Bearer <your API key>", "OpenAI-Organization": "<your organization ID>"}'Sin embargo, tenga en cuenta que puede ejecutar TestPilot en modo de reproducción sin acceso a la API LLM donde las respuestas del modelo se toman de la salida de una ejecución anterior; Vea a continuación para más detalles.
Puede instalar TestPilot desde un paquete preconstruido o desde la fuente.
TestPilot está disponible como un paquete NPM previamente construido, aunque actualmente no se publica en el registro NPM. Puede descargar un tarball del repositorio e instalarlo de la manera habitual. Tenga en cuenta que esta distribución solo contiene la parte central de TestPilot, no el arnés de evaluación comparativa.
El directorio src/ contiene el código fuente para TestPilot, que se escribe en TypeScript y se compila en el dist/ Directorio. Las pruebas están en test/ ; El benchmark/ directorio contiene un arnés de evaluación comparativa para ejecutar TestPilot en múltiples paquetes de NPM; y ql/ contiene las consultas CodeQL utilizadas para analizar los resultados.
En el directorio raíz de un pago de este repositorio, ejecute npm build para instalar dependencias y construir el paquete.
También puede usar npm run build:watch para construir automáticamente cada vez que realice cambios en el código. Sin embargo, tenga en cuenta que esto no instalará automáticamente dependencias, y tampoco construirá el arnés de evaluación comparativa.
Use npm run test para ejecutar las pruebas. Por conveniencia, esto también instalará dependencias y ejecutará una compilación.
Si instala TestPilot desde la fuente, puede usar el arnés de evaluación comparativa para ejecutar TestPilot en múltiples paquetes y analizar los resultados. Actualmente no está disponible si instala TestPilot desde un paquete preconstruido.
El uso básico es el siguiente:
node benchmark/run.js --outputDir < report_dir > --package < package_dir > Esto genera pruebas para todas las funciones exportadas por el paquete en <package_dir> , las valida y escribe los resultados en <report_dir> .
Tenga en cuenta que esto supone que las dependencias de paquetes están instaladas y se han ejecutado cualquier paso de compilación (por ejemplo, utilizando la compilación npm i y npm run build ). TestPilot también se basa en mocha , por lo que si el paquete en la prueba no depende de él, debe instalarlo por separado, por ejemplo, usando el comando npm i --no-save mocha .
El flujo de trabajo run-experiment.yml ejecuta un experimento en acciones de GitHub, produciendo el informe final como un artefacto que puede descargar. El artefacto results-all contiene los resultados de todos los paquetes, mientras que los otros artefactos contienen los resultados individuales de cada paquete.
Los resultados de TestPilot no son deterministas, por lo que incluso si lo ejecuta desde el mismo paquete en la misma máquina varias veces, obtendrá resultados diferentes. Sin embargo, el arnés de evaluación comparativa registra suficientes datos para poder reproducir un punto de referencia en muchos casos.
Para hacer esto, use las opciones --api y --responses para reutilizar los listados de API y las respuestas de una ejecución anterior:
node benchmark/run.js --outputDir < report_dir > --package < package_dir > --api < api.json > --responses < prompts.json >Tenga en cuenta que, por defecto, la repetición fallará si alguna de las indicaciones no se encuentra en el archivo de respuestas. Esto suele ocurrir si TestPilot está refinando las pruebas fallidas, ya que en este caso la solicitud al modelo depende del mensaje de falla exacta, que puede ser específica del sistema (por ejemplo, que contiene rutas del sistema de archivos locales) o depende de la versión Node.js u otros factores.
Para trabajar alrededor de estas limitaciones, puede aprobar el manejo de banderas --strictResponses false Treat Falts Institions al tratarlas como no recibir respuesta del modelo. Esto no producirá, en general, los mismos resultados que la ejecución inicial, sino que es suficiente en muchos casos.
Las consultas CodeQL en ql/queries se pueden usar para analizar los resultados de ejecutar un experimento. Consulte ql/CodeQL.md para obtener instrucciones sobre cómo configurar CodeQL y ejecutar las consultas.
Este proyecto tiene licencia bajo los términos de la licencia de código abierto del MIT. Consulte el MIT para obtener los términos completos.
TestPilot es un prototipo de investigación y no es compatible oficialmente. Sin embargo, si tiene preguntas o comentarios, presente un problema y haremos todo lo posible para responder.
Agradecemos a Aryaz Eghbali (@aryaze) por su trabajo en la versión inicial de TestPilot.