Never Code Alone Logo Never Code Alone
Infection Frameworkl Logo. Ein roter käfer in der mitte des "biohazard" logos.

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?

  1. Mutation: Infection modifiziert deinen Code, z.B. indem es Vergleichsoperatoren wie == zu != ändert oder Bedingungen entfernt.
  2. Testausführung: Nach jeder Mutation führt Infection deine vorhandenen Tests aus.
  3. 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:

Code:
          

composer require --dev infection/infection

Als globales CLI-Tool:

Code:
          

composer global require infection/infection

Als PHAR-Archiv:

Code:
          

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:

Code:
          

{
   "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.

CYPRESS.IO Ambassador und IT Consultant für QA Engenieering und Qualität in PHP Projekten.

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:

Code:
          

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:

Code:
          

vendor/bin/infection --filter=src/Service/WordpressService.php

Threads: Nutze mehrere Threads für schnellere Ausführung:

Code:
          

vendor/bin/infection --threads=4

Minimum MSI: Lege einen Mindestwert für den Mutation Score Indicator (MSI) fest:

Code:
          

vendor/bin/infection --min-msi=70

Nur abgedeckten Code: Teste nur Code, der bereits von Tests abgedeckt ist:

Code:
          

vendor/bin/infection --only-covered

Vorhandene Coverage: Nutze bereits generierte Code-Coverage-Daten:

Code:
          

vendor/bin/infection --coverage=build

Fokus auf Änderungen: Bei großen Projekten kannst du Infection auf kürzlich geänderte Dateien beschränken4:

Code:
          

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:

Code:
          

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.

Mann mit langen Haaren hält einen Vortrag auf einer Usergroup vor einem großen Monitor

Dekoratives Ad Image mit dem Text "Tips für Unit Testing"

Clip Art auf der linken Seite eine Lupe unter der ein Bug auf einem Monitor abgebildet ist. Rechts ein Monitor mit Error und Warnausgabe.

Instagram Quote Bild zu guter Code Coverage und der Hilfe mit Mutation Testing.

Hinweis auf einen neuen Blog Post, wie man die Codequalität mit Mutation Testing erhöht

Dunkle Publikumsaufnahme bei einer Usergroup

Instagram Ad für einen Mutation Testing Vortrag 2023 mit Adam Piotrofski

Mutations-Test-Report mit dunkelviolettem Hintergrund. Zeigt 148 generierte Mutationen: 3 getötet, 139 nicht durch Tests abgedeckt, 6 nicht erkannt. Metriken: MSI 2%, Code-Abdeckung 6%, MSI der abgedeckten Code 33%. Ausführungszeit 1s mit 22MB Speicherverbrauch. Wesentliche Test-Qualitätsmetriken auf einen Blick dargestellt.

PHP Code-Snippet einer getItemsFromBlog Funktion mit Mutation Testing Markup, das zwei Varianten der toArray() Methode zeigt - eine mit throw:true (rot markiert) und eine mit throw:false (grün markiert).

Terminal-Ausgabe eines erfolgreichen PHPUnit Test Refactoring mit Inflection Mutation Testing Durchlaufs mit 14 Mutationen und einem hohen MSI von 92%, angezeigt in einem violetten Terminal-Fenster.

Terminal-Ausgabe eines Mutation Testing Durchlaufs vor dem PHPUnit Test Refactoring mit 9 generierten Mutationen, verschiedenen Metriken wie MSI von 33% und einer Ausführungszeit von 1 Sekunde bei 18MB Speicherverbrauch.