Infection: Mutation Testing für bessere PHPUnit Tests
Infection ist ein leistungsstarkes Mutation Testing Framework für PHP, das dir hilft, die Qualität und Effektivität deiner Tests zu verbessern. Es funktioniert, indem es deinen Quellcode gezielt verändert (mutiert) und dann überprüft, ob deine Tests diese Änderungen erkennen1.
Wie funktioniert es?
- Mutation: Infection modifiziert deinen Code, z.B. indem es Vergleichsoperatoren wie == zu != ändert oder Bedingungen entfernt.
- Testausführung: Nach jeder Mutation führt Infection deine vorhandenen Tests aus.
- Analyse: Wenn die Tests trotz der Änderung weiterhin bestehen, deutet dies auf eine Lücke in deiner Testabdeckung hin1.
Durch diesen Prozess kannst du erkennen, welche Teile deines Codes nicht ausreichend getestet sind und gezielt deine Tests verbessern.
Installation und Konfiguration
Du hast mehrere Möglichkeiten, Infection zu installieren.
Als Entwicklungsabhängigkeit mit Composer:
composer require --dev infection/infection
Als globales CLI-Tool:
composer global require infection/infection
Als PHAR-Archiv:
wget https://github.com/infection/infection/releases/download/0.26.19/infection.phar
chmod +x infection.phar
Konfiguration
Erstelle eine infection.json Datei im Wurzelverzeichnis deines Projekts. Hier ein Beispiel:
{
"source": {
"directories": [
"src"
]
},
"logs": {
"text": "infection.log"
},
"mutators": {
"@default": true
}
}
Passe die Einstellungen an deine Projektstruktur an, z.B. indem du den src Ordner durch deine tatsächlichen Quellcode-Verzeichnisse ersetzt.
Erreichen Sie unsere PHP Consultant Spezialisten
Wir sind Experten für PHP und helfen Ihnen, Ihre digitalen Herausforderungen zu meistern. Unser erfahrenes Team unterstützt Sie bei PHP Updates, PHP Refactoring und berät Sie remote zu allen Fragen rund um PHP. Mit unseren vollautomatischen CI/CD Deployments und einer robusten Docker-Infrastruktur bringen wir Ihre PHP-Projekte auf das nächste Level. Vertrauen Sie auf unsere Expertise für zuverlässige und skalierbare PHP-Lösungen.
Verwendung vom PHP Infection Testing Framework
Grundlegende Ausführung
Um Infection auszuführen, nutze folgenden Befehl in deinem Projektverzeichnis:
vendor/bin/infection
Infection führt dann die Mutationen durch und zeigt dir die Ergebnisse an.
Fortgeschrittene Optionen
Filter: Teste nur bestimmte Dateien oder Verzeichnisse:
vendor/bin/infection --filter=src/Service/WordpressService.php
Threads: Nutze mehrere Threads für schnellere Ausführung:
vendor/bin/infection --threads=4
Minimum MSI: Lege einen Mindestwert für den Mutation Score Indicator (MSI) fest:
vendor/bin/infection --min-msi=70
Nur abgedeckten Code: Teste nur Code, der bereits von Tests abgedeckt ist:
vendor/bin/infection --only-covered
Vorhandene Coverage: Nutze bereits generierte Code-Coverage-Daten:
vendor/bin/infection --coverage=build
Fokus auf Änderungen: Bei großen Projekten kannst du Infection auf kürzlich geänderte Dateien beschränken4:
INFECTION_FILTER=$(git diff origin/master HEAD --name-only | grep /src/ | paste -sd "," -)
vendor/bin/infection --filter="${INFECTION_FILTER}"
Code-Coverage wiederverwenden: Wenn du bereits Code-Coverage-Daten hast, übergib sie an Infection4:
vendor/bin/phpunit --coverage-xml=build/coverage-xml --log-junit=build/phpunit.junit.xml
vendor/bin/infection --coverage=build
Beispiele aus der Praxis
- Aufspüren von Testlücken
Ein Team nutzt Infection und entdeckt, dass eine kritische Bedingung in der Zahlungsverarbeitung nicht ausreichend getestet ist. Sie fügen daraufhin einen entsprechenden Test hinzu. - Verbessern der Testassertions
Infection zeigt, dass das Entfernen einer Passwort-Validierungsfunktion nicht von den Tests erkannt wird. Das Team überarbeitet seine Testassertions, um diesen Fall abzudecken. - Optimieren der Fehlerbehandlung
Beim Mutieren des Exception-Handlings stellt sich heraus, dass einige Fehlerfälle nicht getestet sind. Das Team implementiert zusätzliche Tests für diese Grenzfälle.
Häufige Fragen FAQ
Was ist der Unterschied zwischen Mutation Testing und Code Coverage?
Code Coverage misst, wie viel des Codes von Tests ausgeführt wird, sagt aber nichts über die Qualität der Tests aus. Mutation Testing geht einen Schritt weiter und prüft, ob die Tests auch Fehler im Code erkennen können, indem es den Code gezielt verändert.
Kann ich Infection verwenden, wenn ich keine Unit Tests habe?
Nein, Infection setzt das Vorhandensein von Unit Tests voraus. Wenn du noch keine Tests hast, solltest du zunächst testbaren Code schreiben und Unit Tests implementieren, bevor du Infection einsetzen kannst.
Welche PHP-Versionen unterstützt Infection?
Infection unterstützt aktuell PHP 7.2 und höher. Stelle sicher, dass du eine kompatible PHP-Version verwendest, bevor du Infection installierst.
Kann Infection automatisch Testlücken beheben?
Nein, Infection identifiziert nur Schwachstellen in deinen Tests, behebt sie aber nicht automatisch. Du musst die fehlenden oder unzureichenden Tests manuell ergänzen oder verbessern.
Wie interpretiere ich die Ergebnisse von Infection?
Infection generiert einen Bericht mit dem Mutation Score Indicator (MSI), der angibt, wie gut deine Tests Mutationen erkennen. Ein höherer MSI bedeutet bessere Testqualität. Die Ergebnisse zeigen dir auch, welche Mutationen überlebt haben und wo genau du deine Tests verbessern solltest.
Kann ich Infection in meine CI/CD-Pipeline integrieren?
Ja, es ist sogar empfehlenswert, Infection in deine CI/CD-Pipeline einzubinden. So kannst du die Testqualität kontinuierlich überwachen und sicherstellen, dass keine Rückschritte auftreten. Du kannst Infection als zusätzlichen Schritt nach deinen Unit Tests ausführen.
Verlangsamt Mutation Testing meine Entwicklungszyklen?
Mutation Testing kann zeitaufwendig sein, insbesondere bei großen Codebases. Es ist jedoch eine Investition in die Qualität deiner Software. Du kannst Infection zunächst nur auf kritische Teile deines Codes anwenden oder die Ausführung mit Optionen wie --threads beschleunigen.
Welche Alternativen zu Infection gibt es?
Für PHP gibt es andere Mutation Testing Tools wie Humbug oder Mutatest. In anderen Sprachen existieren ähnliche Tools wie PIT für Java oder Stryker für JavaScript. Infection ist jedoch das am weitesten verbreitete Mutation Testing Framework für PHP.
Kann ich Infection nur auf bestimmte Code-Teile anwenden?
Ja, du kannst Infection gezielt auf einzelne Dateien, Verzeichnisse oder geänderte Code-Teile anwenden. Nutze dafür die --filter Option oder kombiniere Infection mit Tools wie git diff, um nur die relevanten Teile zu testen.
Wie oft sollte ich Mutation Testing durchführen?
Führe Mutation Tests regelmäßig durch, idealerweise bei jedem Push in der CI/CD-Pipeline. In größeren Projekten kannst du Infection auch in längeren Intervallen, z.B. wöchentlich oder vor jedem Release, ausführen. Finde den für dein Team passenden Rhythmus, um die Testqualität konstant hoch zu halten, ohne den Entwicklungsprozess zu stark zu verlangsamen.
Fazit
Infection ist ein wertvolles Tool für jeden PHP-Entwickler, der Wert auf Code-Qualität und robuste Tests legt. Durch den Einsatz von Mutation Testing kannst du Schwachstellen in deinen Tests identifizieren, Lücken in der Testabdeckung schließen und letztlich zuverlässigere Software entwickeln.
Integriere Infection in deinen Entwicklungsprozess, beginne mit einer niedrigen Messlatte und verbessere deine Tests schrittweise. Mit der Zeit wirst du mehr Vertrauen in deine Testsuite gewinnen und sie effektiver gestalten.
Probiere Infection aus und überzeuge dich selbst, wie es die Qualität deiner PHP-Anwendungen auf ein neues Level heben kann!
Instagram Bilder zum Thema Mutation Testing
Liste von Bildern von dem Hashtag #mutationtesting ohne weitere Angaben.