TestPilot est un outil pour générer automatiquement des tests unitaires pour les packages NPM écrits en JavaScript / TypeScript à l'aide d'un modèle grand langage (LLM).
Notez que TestPilot représente une exploration précoce de l'utilisation des LLM pour la génération de tests, et a été mis à disposition en open source comme base de recherche et d'exploration. Pour l'utilisation quotidienne, les fonctionnalités de génération de tests dans le chat copilot sont susceptibles de donner de meilleurs résultats.
TestPilot génère des tests pour une fonction donnée f en invitant le LLM avec un squelette d'un test pour f , y compris des informations sur f intégrées dans des commentaires de code, tels que sa signature, le corps de f et des exemples d'utilisation de f ont automatiquement extrait la documentation du projet. La réponse du modèle est ensuite analysée et traduite dans un test unitaire coulable. Facultativement, le test est exécuté et s'il échoue, le modèle est à nouveau invité avec des informations supplémentaires sur le test échoué, ce qui lui a donné une chance d'affiner le test.
Contrairement à d'autres systèmes pour la génération de tests basés sur LLM, TestPilot ne nécessite aucune formation ou apprentissage de renforcement supplémentaire, et aucun exemple de fonctions et leurs tests associés ne sont nécessaires.
Un document de recherche décrivant en détail TestPilot est disponible sur ArXIV et IEEExplore.
En général, pour pouvoir exécuter TestPilot, vous avez besoin d'accéder à un LLM de style Codex avec l'API de complétion. Définissez la variable d'environnement TESTPILOT_LLM_API_ENDPOINT sur l'URL du point de terminaison de l'API LLM que vous souhaitez utiliser, et TESTPILOT_LLM_AUTH_HEADERS sur un objet JSON contenant les en-têtes que vous devez authentifier avec l'API.
Les valeurs typiques de ces variables peuvent être:
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>"}'Notez cependant que vous pouvez exécuter TestPilot en mode de reproduction sans accès à l'API LLM où les réponses du modèle sont tirées de la sortie d'une exécution précédente; Voir ci-dessous pour plus de détails.
Vous pouvez installer TestPilot à partir d'un package pré-construit ou à partir de la source.
TestPilot est un package NPM pré-construit, bien qu'il ne soit pas actuellement publié dans le registre NPM. Vous pouvez télécharger un tarball à partir du référentiel et l'installer de la manière habituelle. Notez que cette distribution ne contient que la partie centrale de TestPilot, et non le harnais d'analyse comparative.
Le src/ Directory contient le code source de TestPilot, qui est écrit en TypeScript et est compilé dans le dist/ Directory. Les tests sont en test/ ; Le benchmark/ répertoire contient un harnais d'analyse comparative pour l'exécution de TestPilot sur plusieurs packages NPM; et ql/ contient les requêtes CodeQL utilisées pour analyser les résultats.
Dans le répertoire racine d'une caisse de ce référentiel, exécutez npm build pour installer les dépendances et construire le package.
Vous pouvez également utiliser npm run build:watch pour construire automatiquement chaque fois que vous apportez des modifications au code. Notez, cependant, que cela n'installe pas automatiquement les dépendances et ne construira pas non plus le harnais d'analyse comparative.
Utilisez npm run test pour exécuter les tests. Pour plus de commodité, cela installera également des dépendances et exécutera une construction.
Si vous installez TestPilot à partir de Source, vous pouvez utiliser le harnais de benchmarking pour exécuter TestPilot sur plusieurs packages et analyser les résultats. Ce n'est pas actuellement disponible si vous installez TestPilot à partir d'un package pré-construit.
L'utilisation de base est la suivante:
node benchmark/run.js --outputDir < report_dir > --package < package_dir > Cela génère des tests pour toutes les fonctions exportées par le package dans <package_dir> , les valide et écrit les résultats à <report_dir> .
Notez que cela suppose que les dépendances de package sont installées et que toutes les étapes de construction ont été exécutées (par exemple, en utilisant la construction npm i et npm run build ). TestPilot s'appuie également sur mocha , donc si le package testé n'en dépend pas déjà, vous devez l'installer séparément, par exemple en utilisant la commande npm i --no-save mocha .
Le flux de travail run-experiment.yml gère une expérience sur les actions GitHub, produisant le rapport final en tant qu'artefact que vous pouvez télécharger. L'artefact results-all contient les résultats de tous les packages, tandis que les autres artefacts contiennent les résultats individuels de chaque package.
Les résultats de TestPilot sont non déterministes, donc même si vous l'exécutez à partir du même package sur la même machine plusieurs fois, vous obtiendrez des résultats différents. Cependant, le harnais d'analyse comparative enregistre suffisamment de données pour être en mesure de rejouer une référence exécutée dans de nombreux cas.
Pour ce faire, utilisez les options --api et --responses pour réutiliser les listes et les réponses API à partir d'une exécution précédente:
node benchmark/run.js --outputDir < report_dir > --package < package_dir > --api < api.json > --responses < prompts.json >Notez que par défaut, la relecture échouera si l'une des invites n'est pas trouvée dans le fichier de réponses. Cela se produit généralement si TestPilot affine des tests d'échec, car dans ce cas, l'invite du modèle dépend du message de défaillance exact, qui peut être spécifique au système (par exemple, contenant des chemins de système de fichiers locaux), ou dépendre de la version node.js ou d'autres facteurs.
Pour contourner ces limitations, vous pouvez passer les invites manquantes de la poignée --strictResponses false drapeau. Cela ne produira pas, en général, les mêmes résultats que l'exécution initiale, mais suffit dans de nombreux cas.
Les requêtes CodeQL dans ql/queries peuvent être utilisées pour analyser les résultats de l'exécution d'une expérience. Voir ql/CodeQL.md pour des instructions sur la façon de configurer CodeQL et d'exécuter les requêtes.
Ce projet est concédé sous licence de la licence open source du MIT. Veuillez vous référer au MIT pour les conditions complètes.
TestPilot est un prototype de recherche et n'est pas officiellement soutenu. Cependant, si vous avez des questions ou des commentaires, veuillez déposer un problème et nous ferons de notre mieux pour répondre.
Nous remercions Aryaz Eghbali (@aryaze) pour son travail sur la version initiale de TestPilot.