TestPilot ist ein Tool zum automatischen Generieren von Unit -Tests für NPM -Pakete, die in JavaScript/TypeScript unter Verwendung eines großen Sprachmodells (LLM) geschrieben wurden.
Beachten Sie, dass TestPilot eine frühzeitige Erkundung bei der Verwendung von LLMs für die Testgenerierung darstellt und in Open Source als Grundlage für Forschung und Exploration zur Verfügung gestellt wurde. Für die tägliche Verwendung dürften die Testgenerierungsfunktionen im Copilot-Chat zu besseren Ergebnissen führen.
TestPilot generiert Tests für eine bestimmte Funktion f , indem sie das LLM mit einem Test eines Tests für f veranlassen, einschließlich Informationen zu f f die in Codekommentare eingebettet ist, wie f . Die Antwort des Modells wird dann analysiert und in einen runnablen Unit -Test übersetzt. Optional wird der Test ausgeführt, und wenn er fehlschlägt, wird das Modell erneut mit zusätzlichen Informationen über den fehlgeschlagenen Test aufgefordert, sodass es die Möglichkeit gibt, den Test zu verfeinern.
Im Gegensatz zu anderen Systemen für die LLM-basierte Testgenerierung benötigt TestPilot kein zusätzliches Trainings- oder Verstärkungslernen, und es sind keine Beispiele für Funktionen und deren zugehörige Tests erforderlich.
Ein Forschungspapier, der Testpilot im Detail beschreibt, finden Sie in Arxiv und IEEExplore.
Um Testpilot ausführen zu können, benötigen Sie im Allgemeinen Zugriff auf einen LLM im Codex-Stil mit Abschluss-API. Setzen Sie die Umgebungsvariable TESTPILOT_LLM_API_ENDPOINT in der URL des LLM -API -Endpunkts, den Sie verwenden möchten, und TESTPILOT_LLM_AUTH_HEADERS auf ein JSON -Objekt, das die Header enthält, die Sie mit der API authentifizieren müssen.
Typische Werte für diese Variablen können sein:
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>"}'Beachten Sie jedoch, dass Sie den Testpilot im Reproduktionsmodus ohne Zugriff auf die LLM -API ausführen können, bei der Modellantworten aus der Ausgabe eines vorherigen Laufs entnommen werden. Weitere Informationen finden Sie unten.
Sie können Testpilot aus einem vorgefertigten Paket oder aus der Quelle installieren.
TestPilot ist ein vorgefertigtes NPM-Paket, das derzeit nicht in der NPM-Registrierung veröffentlicht wird. Sie können einen Tarball aus dem Repository herunterladen und auf die übliche Weise installieren. Beachten Sie, dass diese Verteilung nur den Kernteil des Testpilots enthält, nicht den Benchmarking -Geschirr.
Das src/ Verzeichnis enthält den Quellcode für TestPilot, der in TypeScript geschrieben und in das dist/ Verzeichnis zusammengestellt wird. Tests sind im test/ ; Das benchmark/ Verzeichnis enthält einen Benchmarking -Kabelbaum zum Ausführen von Testpilot auf mehreren NPM -Paketen. und ql/ enthält die CodeQL -Abfragen, die zur Analyse der Ergebnisse verwendet werden.
Führen Sie im Root -Verzeichnis einer Checkout dieses Repositorys npm build aus, um Abhängigkeiten zu installieren und das Paket zu erstellen.
Sie können auch npm run build:watch , dass Sie bei jederzeit Änderungen am Code automatisch erstellen. Beachten Sie jedoch, dass dies nicht automatisch Abhängigkeiten installiert und auch den Benchmarking -Kabelbaum nicht erstellt.
Verwenden Sie npm run test um die Tests auszuführen. Dies wird auch Abhängigkeiten installiert und einen Build ausführen.
Wenn Sie TestPilot von Quelle installieren, können Sie den Benchmarking -Kabelbaum verwenden, um TestPilot auf mehreren Paketen auszuführen und die Ergebnisse zu analysieren. Dies ist derzeit nicht verfügbar, wenn Sie Testpilot aus einem vorgefertigten Paket installieren.
Die Grundnutzung ist wie folgt:
node benchmark/run.js --outputDir < report_dir > --package < package_dir > Dies generiert Tests für alle Funktionen, die vom Paket in <package_dir> exportiert wurden, validiert sie und schreibt die Ergebnisse in <report_dir> .
Beachten Sie, dass dies vorausgesetzt wird, dass Paketabhängigkeiten installiert und alle Build -Schritte ausgeführt wurden (z. B. mit npm i und npm run build ). TestPilot stützt sich auch auf mocha . Wenn das zu testende Paket noch nicht davon abhängt, müssen Sie es separat installieren, beispielsweise mit dem Befehl npm i --no-save mocha .
Der Workflow run-experiment.yml führt ein Experiment zu Github-Aktionen durch und erstellt den Abschlussbericht als Artefakt, den Sie herunterladen können. Das results-all -Artefakt enthält die Ergebnisse aller Pakete, während die anderen Artefakte die individuellen Ergebnisse jedes Pakets enthalten.
Die Ergebnisse von TestPilot sind nicht deterministisch. Selbst wenn Sie sie mehrmals aus demselben Paket auf demselben Computer ausführen, erhalten Sie unterschiedliche Ergebnisse. Das Benchmarking -Kabelbaum zeichnet jedoch genügend Daten auf, um in vielen Fällen einen Benchmark -Lauf wiederholen zu können.
Verwenden Sie dazu die Optionen --api und --responses , um die API -Auflistungen und Antworten aus einem früheren Lauf wiederzuverwenden:
node benchmark/run.js --outputDir < report_dir > --package < package_dir > --api < api.json > --responses < prompts.json >Beachten Sie, dass standardmäßig die Wiederholung fehlschlägt, wenn eine der Eingabeaufforderungen in der Antwortendatei nicht gefunden wird. Dies geschieht normalerweise, wenn TestPilot fehlgeschlagene Tests verfeinert, da in diesem Fall die Eingabeaufforderung zum Modell von der genauen Fehlermeldung abhängt, die systemspezifisch sein kann (z. B. lokale Dateisystempfade) oder von der Node.js-Version oder anderen Faktoren abhängen.
Um diese Einschränkungen zu erledigen, können Sie die --strictResponses false Flaggengriff übergeben, indem Sie sie als Reaktion aus dem Modell behandeln. Dies wird im Allgemeinen nicht die gleichen Ergebnisse erzielen wie der erste Lauf, sondern in vielen Fällen ausreicht.
Die CODEQL -Abfragen in ql/queries können verwendet werden, um die Ergebnisse des Ausführens eines Experiments zu analysieren. Anweisungen zum Einrichten von CodesQL und zum Ausführen der Abfragen finden Sie unter ql/CodeQL.md .
Dieses Projekt ist unter den Bedingungen der MIT Open Source -Lizenz lizenziert. Weitere Informationen finden Sie im MIT.
TestPilot ist ein Forschungsprototyp und wird nicht offiziell unterstützt. Wenn Sie jedoch Fragen oder Feedback haben, stellen Sie bitte ein Problem ein und wir werden unser Bestes tun, um zu antworten.
Wir danken Aryaz Eghbali (@aryaze) für seine Arbeit an der ersten Version von Testpilot.