Open-Source-Sprachunabhängiger automatischer Unit-Test-Generator + LLM-basierter Mutationstest für automatisierte Softwaretests
UPDATE 2024-07-18
Wir freuen uns, Ihnen unsere Roadmap mit den bevorstehenden Funktionen und Verbesserungen für Mutahunter vorzustellen!
Schauen Sie es sich hier an: Roadmap
Wir würden uns über Ihr Feedback, Ihre Vorschläge und Ihre Gedanken zum Thema Mutationstests freuen. Beteiligen Sie sich an der Diskussion und teilen Sie Ihre Erkenntnisse zur Roadmap oder andere Ideen, die Sie haben. ?
Merkmale
Unit-Test-Generator: Verbesserung der Linien- und Mutationsabdeckung (WIP)
Erste Schritte mit Mutationstests
Beispiele
CI/CD-Integration
Mutahunter kann automatisch Unit-Tests generieren, um die Linien- und Mutationsabdeckung zu erhöhen und dabei Large Language Models (LLMs) nutzen, um Lücken in der Testabdeckung zu identifizieren und zu schließen. Es verwendet LLM-Modelle, um kontextbezogene Fehler in Ihre Codebasis einzufügen. Dieser KI-gesteuerte Ansatz erzeugt weniger äquivalente Mutanten, Mutanten mit höherem Fehlererkennungspotenzial und solche mit höherer Kopplung und semantischer Ähnlichkeit zu echten Fehlern, wodurch umfassende und effektive Tests gewährleistet werden.
Automatische Generierung von Unit-Tests: Generiert Unit-Tests zur Erhöhung der Linien- und Mutationsabdeckung und nutzt LLMs, um Lücken in der Testabdeckung zu identifizieren und zu schließen. Weitere Einzelheiten finden Sie im Abschnitt „Unit-Test-Generator“.
Sprachunabhängig: Kompatibel mit Sprachen, die Abdeckungsberichte in den Formaten Cobertura XML, Jacoco XML und lcov bereitstellen. Erweiterbar auf zusätzliche Sprachen und Test-Frameworks.
LLM-Kontext-sensitive Mutationen: Verwendet LLM-Modelle, um kontextsensitive Mutanten zu generieren. Untersuchungen zeigen, dass durch LLM erzeugte Mutanten ein höheres Fehlererkennungspotenzial, weniger äquivalente Mutanten sowie eine höhere Kopplung und semantische Ähnlichkeit mit echten Fehlern aufweisen. Es verwendet eine Karte Ihres gesamten Git-Repositorys, um mithilfe der Repomap von Aider kontextrelevante Mutanten zu generieren. Unterstützt selbstgehostete LLMs, Anthropic, OpenAI und alle LLM-Modelle über LiteLLM.
Diff-basierte Mutationen: Führt Mutationstests für geänderte Dateien und Zeilen basierend auf den letzten Commit- oder Pull-Request-Änderungen durch und stellt so sicher, dass nur relevante Teile des Codes getestet werden.
LLM-Analyse überlebender Mutanten: Analysiert automatisch überlebende Mutanten, um potenzielle Schwachstellen in der Testsuite, Schwachstellen und Bereiche für Verbesserungen zu identifizieren.
Dieses Tool generiert Unit-Tests, um sowohl die Linien- als auch die Mutationsabdeckung zu erhöhen, inspiriert durch Veröffentlichungen:
Automatisierte Unit-Test-Verbesserung mithilfe großer Sprachmodelle bei Meta: – Verwendet LLMs, um Lücken in der Testabdeckung zu identifizieren und zu schließen.
Effektive Testgenerierung mit vorab trainierten großen Sprachmodellen und Mutationstests: - Generiert Tests, die Codemutanten erkennen und töten und so Robustheit gewährleisten.
## gehe zu examples/java_maven## entferne einige Tests aus BankAccountTest.javamutahunter gen-line --test-command "mvn test -Dtest=BankAccountTest" --code-coverage-report-path "target/site/jacoco/jacoco. xml" --coverage-type jacoco --test-file-path "src/test/java/BankAccountTest.java" --source-file-path "src/main/java/com/example/BankAccount.java" --model "gpt-4o" --target-line-coverage 0.9 --max-attempts 3 Leitungsabdeckung von 47,00 % auf 100,00 % erhöht Die Mutationsabdeckung stieg von 92,86 % auf 92,86 %.
# Installieren Sie das Mutahunter-Paket über GitHub. Python 3.11+ ist erforderlich.$ pip install muthaunter# Arbeiten Sie mit GPT-4o auf Ihrem Repo$ export OPENAI_API_KEY=Ihr-Schlüssel-geht-hier# Oder arbeiten Sie mit den Modellen von Anthropic$ export ANTHROPIC_API_KEY=Ihr-Schlüssel-geht-hier# Ausführen Mutahunter für eine bestimmte Datei. # Der Abdeckungsbericht sollte dem Testbefehl entsprechen.$ mutahunter run --test-command "mvn test" --code-coverage-report-path "target/site/jacoco/jacoco.xml" --coverage-type jacoco -- Modell „gpt-4o-mini“. . . . .-. .-. . . . . . . .-. .-. .-.|/| | | | |-| |-| | | || | |- |(' ` `-' ' ` ' ' ` `-' ' ' ' `-' ' '2024-07-29 12:31:22,045 INFO:=-=-=-=-=-=-= -=-=-=-=-=-=-=-=-=-=-=-=-=-= Gesamtmutationsabdeckung: 100,00 % ? Mutationsabdeckung: 63,33 % ? Gesamtmutanten: 11 ?️ ?️ Getötete Mutanten: 0 Kompilierungsfehler Mutanten: 0 ?️ Gesamtkosten: 0,00167 USD ?=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=29.07.2024 12 :31:22.050 INFO: HTML-Bericht generiert: mutation_report.html2024-07-29 12:31:22.058 INFO: HTML-Bericht generiert: 1.html2024-07-29 12:31:22,058 INFO: Mutationstests dauerten 127 Sekunden
Gehen Sie zum Beispielverzeichnis, um zu sehen, wie Mutahunter in verschiedenen Programmiersprachen ausgeführt wird:
Sehen Sie sich das Java-Beispiel an, um einige interessante Beispiele für LLM-basierte Mutationstests zu sehen.
Java-Beispiel
Gehen Sie zum Beispiel
JavaScript-Beispiel
Python FastAPI-Beispiel
Fügen Sie gerne weitere Beispiele hinzu!
Sie können Mutahunter in Ihre CI/CD-Pipeline integrieren, um Mutationstests zu automatisieren. Hier ist ein Beispiel für eine GitHub Actions-Workflowdatei:
Name: Mutahunter CI/CD auf: Push: Branches: - Main Pull_Request: Branches: - Mainjobs: Mutahunter: Läuft auf: Ubuntu-Latest Steps: - Name: Checkout-Repository verwendet: Actions/Checkout@v4 mit: Fetch-Tiefe: 2 # benötigt für git diff - Name: Python einrichten verwendet: actions/setup-python@v5 mit: Python-Version: 3.11 - Name: Mutahunter installieren, ausführen: pip install mutahunter – Name: Java für Ihr Projekt einrichten verwendet: actions/setup-java@v2 mit: Distribution: „adopt“ Java-Version: „17“ – Name: Abhängigkeiten installieren und Tests ausführen Lauf: mvn test – Name: Führen Sie Mutahunter env: OPENAI_API_KEY: ${{ Secrets.OPENAI_API_KEY }} run: | aus mutahunter run --test-command "mvn test" --code-coverage-report-path "target/site/jacoco/jacoco.xml" --coverage-type jacoco --model "gpt-4o" --diff - Name : PR-Kommentar, den die Mutationsabdeckung verwendet: thollander/[email protected] mit: filePath: logs/_latest/coverage.txt