par Juan Altmayer Pizzorno et Emery Berger au laboratoire PLASMA de l'UMass Amherst.
CoverUp génère automatiquement des tests qui garantissent qu'une plus grande partie de votre code est testée (c'est-à-dire qu'il augmente sa couverture de code). CoverUp peut également créer une suite de tests à partir de zéro si vous n'en avez pas encore. Les nouveaux tests sont basés sur votre code, ce qui les rend utiles pour les tests de régression.
CoverUp est conçu pour fonctionner en étroite collaboration avec le framework de test pytest. Pour générer des tests, il mesure d'abord la couverture de votre suite à l'aide de SlipCover. Il sélectionne ensuite les parties du code qui nécessitent des tests supplémentaires (c'est-à-dire le code découvert). CoverUp engage ensuite une conversation avec un LLM, demandant des tests, vérifiant les résultats pour vérifier qu'ils fonctionnent et augmentent la couverture (encore une fois en utilisant SlipCover) et demandant à nouveau des ajustements si nécessaire. Enfin, CoverUp vérifie éventuellement que les nouveaux tests s'intègrent bien, en essayant de résoudre tous les problèmes détectés.
Pour plus de détails techniques et une évaluation complète, consultez notre article arXiv, CoverUp: Coverage-Guided LLM-Based Test Generation (PDF).
CoverUp est disponible sur PyPI, vous pouvez donc l'installer simplement avec
$ python3 -m pip install coverup
CoverUp peut être utilisé avec les modèles OpenAI, Anthropic ou AWS Bedrock ; cela nécessite que les détails d'accès soient définis en tant que variables d'environnement shell : OPENAI_API_KEY
, ANTHROPIC_API_KEY
ou AWS_ACCESS_KEY_ID
/ AWS_SECRET_ACCESS_KEY
/ AWS_REGION_NAME
, respectivement.
Par exemple, pour OpenAI, vous créeriez un compte, vous assureriez qu'il a un solde positif, puis créeriez une clé API, en stockant sa "clé secrète" (généralement une chaîne commençant par sk-
) dans une variable d'environnement nommée OPENAI_API_KEY
:
$ export OPENAI_API_KEY= < ...your-api-key... >
Si votre module s'appelle mymod
, ses sources sont sous src
et les tests sous tests
, vous pouvez exécuter CoverUp comme
$ coverup --source-dir src/mymod --tests-dir tests
CoverUp crée ensuite des tests nommés test_coverup_N.py
, où N
est un nombre, sous le répertoire tests
.
Ici, nous demandons à CoverUp de créer des tests supplémentaires pour le package populaire 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 un peu plus d'une minute, CoverUp augmente la couverture des tests de Flask de 90,9 % à 94,4 %.
Lors de l'évaluation de chaque test nouvellement généré, CoverUp l'exécute plusieurs fois pour tenter de détecter tout test irrégulier ; qui peut être ajusté avec les options --repeat-tests
et --no-repeat-tests
. Si CoverUp détecte qu'un test nouvellement généré est instable, il demande au LLM une correction.
CoverUp ajoute uniquement des tests à la suite qui, lorsqu'ils sont exécutés seuls, réussissent et augmentent la couverture. Cependant, il est possible que des tests « polluent » l’État, en le modifiant d’une manière qui entraîne l’échec d’autres tests. Par défaut, CoverUp utilise le plugin pytest-cleanslate pour isoler les tests, en contournant toute pollution de test (en mémoire) ; qui peut être désactivé en passant l'option --no-isolate-tests
. CoverUp peut également être invité à rechercher et désactiver le module ou la fonction de test polluant ( --disable-polluting
) ou simplement à désactiver tout test ayant échoué (``--disable-failing`).
Pour évaluer les tests générés par le LLM, CoverUp doit les exécuter. Pour une meilleure sécurité et pour minimiser le risque de dommages à votre système, nous vous recommandons d'exécuter CoverUp avec Docker.
Le graphique montre CoverUp par rapport à CodaMosa, un générateur de tests de pointe basé sur la recherche et basé sur le générateur de tests Pynguin. Pour cette expérience, CoverUp et CodaMosa ont créé des tests « à partir de zéro », c'est-à-dire en ignorant toute suite de tests existante. Les barres montrent la différence de pourcentage de couverture entre CoverUp et CodaMosa pour différents modules Python ; les barres vertes, au-dessus de 0, indiquent que CoverUp a obtenu une couverture plus élevée.
Comme le montre le graphique, CoverUp atteint une couverture plus élevée que CodaMosa pour la plupart des modules.
Il s'agit d'une première version de CoverUp. S'il vous plaît, profitez-en et pardonnez toute perturbation pendant que nous travaillons à l'améliorer. Nous acceptons les rapports de bogues, les rapports d'expérience et les demandes de fonctionnalités (veuillez ouvrir un problème).