von Juan Altmayer Pizzorno und Emery Berger im PLASMA-Labor der UMass Amherst.
CoverUp generiert automatisch Tests, die sicherstellen, dass mehr von Ihrem Code getestet wird (d. h. die Codeabdeckung erhöht wird). CoverUp kann auch eine Testsuite von Grund auf erstellen, wenn Sie noch keine haben. Die neuen Tests basieren auf Ihrem Code und sind daher für Regressionstests nützlich.
CoverUp ist so konzipiert, dass es eng mit dem Pytest-Test-Framework zusammenarbeitet. Um Tests zu generieren, misst es zunächst die Abdeckung Ihrer Suite mit SlipCover. Anschließend werden Teile des Codes ausgewählt, die weiterer Tests bedürfen (d. h. Code, der aufgedeckt wird). CoverUp führt dann ein Gespräch mit einem LLM, fordert zu Tests auf, überprüft die Ergebnisse, um sicherzustellen, dass sie funktionieren und die Abdeckung erhöhen (wiederum unter Verwendung von SlipCover), und fordert bei Bedarf erneut zu Anpassungen auf. Abschließend überprüft CoverUp optional, ob die neuen Tests gut integriert sind, und versucht, alle gefundenen Probleme zu beheben.
Technische Details und eine vollständige Bewertung finden Sie in unserem arXiv-Papier „CoverUp: Coverage-Guided LLM-Based Test Generation“ (PDF).
CoverUp ist bei PyPI erhältlich, sodass Sie es einfach mit installieren können
$ python3 -m pip install coverup
CoverUp kann mit OpenAI-, Anthropic- oder AWS Bedrock-Modellen verwendet werden; Es erfordert, dass die Zugriffsdetails als Shell-Umgebungsvariablen definiert werden: OPENAI_API_KEY
, ANTHROPIC_API_KEY
bzw. AWS_ACCESS_KEY_ID
/ AWS_SECRET_ACCESS_KEY
/ AWS_REGION_NAME
.
Für OpenAI würden Sie beispielsweise ein Konto erstellen, sicherstellen, dass es einen positiven Kontostand hat, und dann einen API-Schlüssel erstellen und seinen „geheimen Schlüssel“ (normalerweise eine Zeichenfolge, die mit sk-
beginnt) in einer Umgebungsvariablen namens OPENAI_API_KEY
speichern:
$ export OPENAI_API_KEY= < ...your-api-key... >
Wenn Ihr Modul den Namen mymod
hat, sich seine Quellen unter src
und die Tests unter tests
befinden, können Sie CoverUp als ausführen
$ coverup --source-dir src/mymod --tests-dir tests
CoverUp erstellt dann Tests mit dem Namen test_coverup_N.py
, wobei N
eine Zahl ist, im tests
.
Hier haben wir von CoverUp zusätzliche Tests für das beliebte Paket Flask erstellen lassen:
$ 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%
$
In etwas mehr als einer Minute erhöht CoverUp die Testabdeckung von Flask von 90,9 % auf 94,4 %.
Während CoverUp jeden neu generierten Test auswertet, führt er ihn mehrmals aus, um fehlerhafte Tests zu erkennen. Dies kann mit den Optionen --repeat-tests
und --no-repeat-tests
angepasst werden. Wenn CoverUp feststellt, dass ein neu generierter Test fehlerhaft ist, fordert es den LLM zu einer Korrektur auf.
CoverUp fügt der Suite nur Tests hinzu, die, wenn sie einzeln ausgeführt werden, bestehen und die Abdeckung erhöhen. Es ist jedoch möglich, dass Tests den Zustand „verunreinigen“ und ihn so verändern, dass andere Tests fehlschlagen. Standardmäßig verwendet CoverUp das pytest-cleanslate-Plugin, um Tests zu isolieren und so etwaige (im Speicher befindliche) Testverschmutzungen zu umgehen. Dies kann durch Übergabe der Option --no-isolate-tests
deaktiviert werden. CoverUp kann auch aufgefordert werden, das verschmutzende Testmodul oder die verschmutzende Testfunktion zu finden und zu deaktivieren ( --disable-polluting
) oder einfach alle fehlgeschlagenen Tests zu deaktivieren („--disable-failing“).
Um die vom LLM generierten Tests auszuwerten, muss CoverUp diese durchführen. Für beste Sicherheit und um das Risiko einer Beschädigung Ihres Systems zu minimieren, empfehlen wir, CoverUp mit Docker auszuführen.
Die Grafik zeigt CoverUp im Vergleich zu CodaMosa, einem hochmodernen suchbasierten Testgenerator, der auf dem Pynguin-Testgenerator basiert. Für dieses Experiment haben sowohl CoverUp als auch CodaMosa Tests „von Grund auf neu“ erstellt, das heißt, sie ignorierten alle vorhandenen Testsuiten. Die Balken zeigen den Unterschied im Abdeckungsprozentsatz zwischen CoverUp und CodaMosa für verschiedene Python-Module; Grüne Balken über 0 zeigen an, dass CoverUp eine höhere Abdeckung erreicht hat.
Wie die Grafik zeigt, erreicht CoverUp bei den meisten Modulen eine höhere Abdeckung als CodaMosa.
Dies ist eine frühe Version von CoverUp. Bitte genießen Sie es und entschuldigen Sie etwaige Störungen, während wir daran arbeiten, es zu verbessern. Wir freuen uns über Fehlerberichte, Erfahrungsberichte und Funktionsanfragen (bitte eröffnen Sie ein Problem).