Eliminierung technischer Schulden mit PHPStan, Rector PHP und PHPUnit. Über 20 Jahre Praxiserfahrung in skalierbaren Backends.
- Erstellt:
- Aktualisiert:
- Autor:
- Roland Golla
Infection Framework: Mutation Testing für PHP 2026
composer require --dev infection/infection
Inhalt
Mutation Testing mit NCA: Schnelle Hilfe vom Experten
Gesetzliche Konformität & Inklusion. Optimierung von Performance und Conversion durch radikal nutzerzentriertes, universelles Design.
Skalierbare KI-Systeme mit echtem Code Ownership. CI/CD, Backup-Strategien und Infrastruktur, die mit deinem Team wächst.
Installation und Voraussetzungen
composer require --dev infection/infection
chmod +x infection.phar
./infection.phar --version
Konfiguration mit infection.json5
{
"source": {
"directories": [
"src"
]
},
"logs": {
"text": "var/log/infection.log",
"html": "var/log/infection.html"
},
"mutators": {
"@default": true
},
"minMsi": 70,
"minCoveredMsi": 80
}
Infection ausführen: die wichtigsten Optionen
vendor/bin/infection
vendor/bin/infection src/Service/Payment.php --min-msi=70 --show-mutations
- --threads=4 setzt die Zahl der Prozesse fest, wenn dir die automatische Wahl nicht passt.
- --min-msi=70 lässt den Befehl mit Fehlercode enden, wenn der MSI unter der Schwelle liegt.
- --min-covered-msi=80 prüft nur den Code, der von Tests abgedeckt ist.
- --show-mutations zeigt die überlebenden Mutanten als Diff direkt in der Konsole.
- --git-diff-lines mutiert nur die Zeilen, die im aktuellen Branch geändert wurden.
- --coverage=build nutzt bereits erzeugte Coverage Daten statt eines neuen Testlaufs.
- --test-framework-extra-args reicht zusätzliche Argumente an PHPUnit durch.
vendor/bin/phpunit --coverage-xml=build/coverage-xml --log-junit=build/phpunit.junit.xml
vendor/bin/infection --coverage=build
MSI, Mutation Code Coverage und Covered Code MSI verstehen
Metrics:
Mutation Score Indicator (MSI): 47%
Mutation Code Coverage: 67%
Covered Code MSI: 70%
Infection Kennzahlen im Überblick
| Kennzahl | Was sie misst | Nutzen im Projekt |
|---|---|---|
| Mutation Score Indicator (MSI) | Anteil aller erkannten Mutanten am Gesamtbestand | Hauptkennzahl für die Qualität der gesamten Test Suite |
| Mutation Code Coverage | Anteil der Mutanten, die überhaupt von Tests berührt werden | Vergleichswert zur klassischen Code Coverage |
| Covered Code MSI | MSI nur für Code, der bereits getestet ist | Zeigt, wie stark die vorhandenen Assertions wirklich sind |
| Timeouts | Mutanten, die in der Laufzeitgrenze hängen bleiben | Hinweis auf Endlosschleifen und auf zu optimistische MSI Werte |
Infection in der CI Pipeline
vendor/bin/infection --git-diff-lines --git-diff-base=origin/main --threads=4
name: Mutation Testing
on: [pull_request]
jobs:
infection:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0
- uses: shivammathur/setup-php@v2
with:
php-version: '8.4'
coverage: pcov
- run: composer install --no-interaction --no-progress
- run: vendor/bin/infection --git-diff-lines --git-diff-base=origin/main --threads=4 --min-msi=70
Timeouts ehrlich bewerten seit Infection 0.32.3
infection --with-timeouts --min-msi=80
infection --git-diff-lines --max-timeouts=0
{
"timeoutsAsEscaped": true,
"maxTimeouts": 10,
"minMsi": 77
}
Was ist neu: Infection 0.33 bis 0.35 im Jahr 2026
# alt
vendor/bin/infection --filter=src/Service/Payment.php
# neu ab 0.34.0
vendor/bin/infection src/Service/Payment.php
Infection Releases 2026 im Überblick
| Version | Datum | Wichtigste Änderung |
|---|---|---|
| 0.32.3 | 13. Januar 2026 | Optionen --with-timeouts und --max-timeouts, neuer JSON Summary Logger |
| 0.33.0 | 17. Mai 2026 | Unterstützung für das Testframework Testo, konfigurierbarer Dots Reporter |
| 0.33.2 | 20. Mai 2026 | Mehrere Prozesse laufen jetzt standardmäßig statt nur einem |
| 0.33.3 | 18. Juni 2026 | Neue Option --test-framework-extra-args, Logger Ausgabe nach php://output |
| 0.34.0 | 28. Juni 2026 | Positional Arguments für die Quellauswahl, --filter ist veraltet |
| 0.34.2 | 7. August 2026 | Anpassung an PHPUnit 13.3, korrekt escapte GitHub Annotations |
| 0.35.0 | 17. August 2026 | BC Break bei gesetztem auto_prepend_file, Fixes für Windows und mago |
| 0.35.2 | 19. August 2026 | Aktuelle Version, Fix der Testreihenfolge bei PHPUnit Defects |
Typische Funde in echten Testsuiten
- Randbedingungen: Aus einem größer wird ein größer gleich und kein Test merkt es. Der Grenzfall wurde nie geprüft.
- Fehlende Assertions: Der Test ruft eine Methode auf, prüft aber nur, dass keine Exception fliegt. Entfernt Infection den Methodenrumpf, bleibt alles grün.
- Rückgabewerte: Eine Methode gibt true statt des berechneten Werts zurück und die Tests laufen weiter durch.
- Fehlerbehandlung: Catch Blöcke und Exception Pfade sind selten getestet. Mutationen im Error Handling überleben besonders gern.
- Tote Konfiguration: Mutanten in Code, den niemand aufruft. Hier hilft ein Blick auf Unused Public und Class Leak.
Infection zusammen mit statischer Analyse
composer require --dev roave/infection-static-analysis-plugin
Weiterführende Ressourcen
Installation, Mutatoren, Profile und alle Kommandozeilenoptionen.
https://infection.github.io/guide/
Quellcode, Issues, Releases und die Diskussionen des Teams rund um Maks Rafalko.
https://github.com/infection/infection
Mutation Testing im Browser ausprobieren, ohne etwas zu installieren.
https://infection-php.dev/
Do not use Xdebug for collecting code coverage unless you need a path/branch coverage
NCA Erfahrung mit Mutation Testing 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.
Häufige Fragen zum Infection Framework
Was ist das Infection Framework 2026?
Infection ist das Mutation Testing Framework für PHP. Es verändert deinen Quellcode an vielen kleinen Stellen und führt nach jeder Änderung die Tests aus, die diese Zeile abdecken. Bleiben die Tests grün, hat der Mutant überlebt und die Testsuite hat eine Lücke. Die Arbeit läuft auf dem Abstract Syntax Tree, nicht auf reiner Textersetzung.
Welche Infection Version ist 2026 aktuell?
Aktuell ist 0.35.2 vom 19. August 2026. Das Jahr brachte drei Minor Versionen: 0.33 mit Unterstützung für das Testframework Testo, 0.34 mit Positional Arguments anstelle von --filter und 0.35 mit einem BC Break bei gesetztem auto_prepend_file. Seit 0.33.2 arbeitet Infection außerdem ohne weitere Angabe schon parallel.
Welche PHP Version braucht Infection 2026?
Aktuelle Infection Versionen brauchen PHP 8.3 oder neuer. Dazu kommt ein Coverage Treiber: Xdebug, phpdbg oder pcov. Für ältere PHP Versionen gibt es ältere Infection Releases, die Zuordnung steht als Tabelle in der offiziellen Installationsdokumentation. Wer auf PHP 8.5 arbeitet, nutzt mindestens die PHAR aus Version 0.35.1.
Was kostet Infection 2026?
Infection ist freie Open Source Software unter der BSD-3-Clause Lizenz. Für die Nutzung fallen keine Lizenzkosten an, weder lokal noch in der Pipeline. Das Projekt finanziert sich über GitHub Sponsors. Der tatsächliche Aufwand liegt woanders: in der Rechenzeit der Pipeline und in der Arbeit, die überlebenden Mutanten auch wirklich zu bearbeiten.
Wie unterscheidet sich Mutation Testing 2026 von Code Coverage?
Code Coverage misst, welche Zeilen beim Testlauf ausgeführt werden. Mutation Testing misst, ob deine Tests bei einem Fehler in diesen Zeilen auch rot werden. Eine Datei kann 100 Prozent Coverage haben und trotzdem keine einzige sinnvolle Assertion enthalten. Genau diese Lücke zwischen Ausführung und Prüfung macht der Mutation Score Indicator sichtbar.
Welchen MSI Wert sollte ein PHP Projekt erreichen?
Es gibt keinen allgemeingültigen Zielwert. Sinnvoll ist der Wert, den dein Projekt heute erreicht, als Startschwelle in der Konfiguration. Von dort ziehst du minMsi in kleinen Schritten an, damit die Pipeline nicht dauerhaft rot steht. Aussagekräftiger als der reine MSI ist oft der Covered Code MSI, weil er ungetesteten Code ausblendet.
Funktioniert Infection ohne bestehende Unit Tests?
Nein. Infection bewertet vorhandene Tests und kann ohne sie nichts messen. Ohne Testsuite gibt es keine Coverage Daten und damit auch keine Mutanten, die geprüft werden könnten. Der erste Schritt ist also eine laufende Testsuite. Bei Legacy Code sind Characterization Tests der übliche Einstieg, danach zeigt Infection, wie belastbar sie sind.
Welche Test Frameworks unterstützt Infection?
Infection arbeitet mit PHPUnit, PhpSpec, Codeception und seit Version 0.33.0 auch mit Testo zusammen. Die PHAR Distribution bringt alle offiziell unterstützten Adapter bereits mit. Bei der Composer Installation kommen die Adapter über den Extension Installer dazu und werden automatisch erkannt. In der Konfiguration legst du mit testFramework fest, welches Framework verwendet wird.
Wie lange dauert ein kompletter Mutation Lauf?
Deutlich länger als ein normaler Testlauf, weil für jeden Mutanten die abdeckenden Tests erneut starten. Seit 0.33.2 nutzt Infection von sich aus mehrere Prozesse, das nimmt einiges an Laufzeit. Weitere Hebel sind vorhandene Coverage Daten aus dem regulären Testlauf und eine Beschränkung auf die geänderten Zeilen.
Wie integriere ich Infection in GitHub Actions?
Im Pull Request läuft Infection mit --git-diff-lines nur auf den geänderten Zeilen und mit --min-msi als Abbruchkriterium. Wichtig sind zwei Dinge im Workflow: die volle Git History über fetch-depth 0 und ein aktivierter Coverage Treiber wie pcov. Den vollständigen Lauf legst du auf einen Nightly Job oder den Release Branch.
Was bedeutet ein entkommener Mutant?
Ein entkommener Mutant ist eine Codeänderung, die keine Testfehler ausgelöst hat. Der Report zeigt sie als Diff gegen das Original. Jede dieser Stellen ist ein konkreter Hinweis: Entweder fehlt eine Assertion, oder der Code ist überflüssig. Beide Antworten sind wertvoll, denn sie führen zu besseren Tests oder zu weniger Code.
Was bringen die Optionen mit Timeouts?
Timeouts zählten bisher wie getötete Mutanten und haben den MSI auf langsamer CI Hardware geschönt. Mit --with-timeouts werden sie als entkommen gewertet und drücken den Score auf einen ehrlichen Wert. Mit --max-timeouts setzt du eine harte Obergrenze, ab der der Build scheitert. Beide Schalter lassen sich auch in der Konfiguration hinterlegen.
Welche Alternativen zu Infection gibt es?
Für PHP ist Infection der De-facto-Standard. Der Vorgänger Humbug wurde zugunsten von Infection eingestellt. In anderen Sprachen gibt es vergleichbare Werkzeuge wie PIT für Java oder Stryker für JavaScript und .NET. Ergänzend statt alternativ arbeiten statische Analysewerkzeuge wie PHPStan und Psalm, die andere Fehlerklassen finden.
Wie starte ich Infection in einem großen Legacy Projekt?
Nicht mit einem Komplettlauf. Häng den Pfad eines Moduls direkt an den Befehl oder nutze --git-diff-lines für die Änderungen im Branch. So bekommst du in Minuten ein Ergebnis statt in Stunden. Erst wenn die Quality Gates stehen und die Testsuite stabil läuft, lohnt der vollständige Durchlauf im Nightly Job.