Flaky Tests gehören zu den frustrierendsten Problemen in automatisierten Testsuites. Ein Test läuft zunächst erfolgreich, schlägt beim nächsten Durchgang ohne erkennbare Codeänderung fehl und ist bei der einzelnen Wiederholung plötzlich wieder grün. Genau diesem Problem widmet sich PHPUnit 13.3 mit neuen Werkzeugen. Gleichzeitig wurde der HTML-Code-Coverage-Report modernisiert.
In der Release-Session spricht Roland Golla mit PHPUnit-Erfinder Sebastian Bergmann über die wichtigsten Neuerungen. Sebastian erklärt nicht nur die fertigen Features, sondern zeigt auch, wie PHPUnit entwickelt, getestet und veröffentlicht wird. Während des Streams entsteht sogar live das Patch-Release PHPUnit 13.3.1.
Video ansehen: Sebastian Bergmann stellt PHPUnit 13.3, Repeat, Retry und den neuen Code-Coverage-Report vor
Warum Flaky Tests gefährlicher als fehlende Tests sein können
Automatisierte Tests sollen Vertrauen schaffen. Wenn eure Testsuite grün ist, möchtet ihr davon ausgehen können, dass die geprüften Funktionen zuverlässig arbeiten. Flaky Tests zerstören dieses Vertrauen. Schlägt ein Test scheinbar zufällig fehl, lässt sich kaum noch unterscheiden, ob ein echter Bug vorliegt oder nur ein unzuverlässiger Test Probleme macht.
Die Ursachen können sehr unterschiedlich sein. Ein Test räumt möglicherweise Dateien oder Datenbankeinträge nicht korrekt auf. Caching sorgt dafür, dass sich der erste Durchlauf anders verhält als der zweite. Auch Reihenfolge, Zeitabhängigkeiten, Netzwerkzugriffe oder gemeinsam genutzter Zustand können Tests instabil machen.
Im schlechtesten Fall gewöhnt sich ein Team an rote Tests. Fehler werden ignoriert, Builds erneut gestartet oder problematische Tests vollständig deaktiviert. Sebastian formuliert es im Video deutlich: Flaky Tests können schlimmer sein als gar keine Tests, weil sie eine Sicherheit vortäuschen, die in der Praxis nicht existiert.
Flaky Tests mit --repeat zuverlässig aufdecken
PHPUnit 13.3 bringt die Kommandozeilenoption --repeat zurück – diesmal auf einer neu entwickelten technischen Grundlage. Mit einem Aufruf wie --repeat 100 wird jeder ausgewählte Test wiederholt ausgeführt. Scheitert eine der Wiederholungen, wird der Test als fehlgeschlagen markiert.
Damit könnt ihr verdächtige Tests gezielt stressen. Ein Fehler, der normalerweise nur bei jedem fünfzigsten Lauf auftritt, wird so deutlich wahrscheinlicher sichtbar. Repeat behebt das zugrunde liegende Problem nicht, liefert euch aber eine verlässlichere Grundlage für die Analyse.
--retry hilft beim kontrollierten Umgang mit instabilen Tests
Mit --retry verfolgt PHPUnit 13.3 einen anderen Ansatz. Ein fehlgeschlagener Test kann automatisch wiederholt werden. Ist der Test direkt erfolgreich, gibt es keine weitere Wiederholung. Schlägt er fehl, erhält er innerhalb der konfigurierten Grenzen weitere Versuche.
Retry kann sinnvoll sein, wenn ihr einen bekannten Flaky Test nicht sofort reparieren könnt oder der Aufwand aktuell unverhältnismäßig wäre. Zusätzlich lassen sich über das #[Retry]-Attribut einzelne Tests gezielt konfigurieren. Ihr könnt festlegen, wie viele Versuche erlaubt sind und wie viele davon erfolgreich sein müssen.
Dieses Feature verlangt jedoch Disziplin. Retry darf nicht dazu dienen, eine instabile Testsuite künstlich grün aussehen zu lassen. Dokumentiert deshalb, warum ein Test wiederholt wird, und behandelt Retry als bewusste Übergangslösung. Der beste Fall bleibt immer, die tatsächliche Ursache des Flaky Tests zu finden und zu beheben.
Neuer HTML-Code-Coverage-Report ohne unnötigen Ballast
Das zweite große Highlight ist der überarbeitete HTML-Code-Coverage-Report. Die bisherige Oberfläche basierte auf Bootstrap und nutzte nur einen kleinen Teil des Frameworks. Trotzdem mussten große Assets gepflegt und regelmäßig aktualisiert werden. Das neue Design setzt auf reduziertes eigenes CSS, modernes HTML und eine klarere Darstellung.
Die Veränderung ist nicht nur kosmetisch. Neben der bekannten dateibasierten Ansicht gibt es jetzt einen klassenorientierten Report. Ihr könnt Namespaces, Klassen und Traits untersuchen und seht auch, wie geerbter Code zur Abdeckung einer Klasse beiträgt.
Zusätzlich lässt sich der Report nach Testgrößen wie Small, Medium und Large filtern. Das ist hilfreich, wenn ihr Tests konsequent klassifiziert und beispielsweise wissen möchtet, welche Codebereiche bereits durch schnelle Unit Tests abgedeckt werden.
Branch Coverage und Path Coverage endlich verständlicher visualisiert
Line Coverage allein beantwortet nur, ob eine Codezeile ausgeführt wurde. Sie zeigt nicht, ob alle Entscheidungen und möglichen Wege innerhalb dieser Zeile getestet sind. Genau hier helfen Branch Coverage und Path Coverage.
Der neue Report visualisiert, ob Bedingungen sowohl zu true als auch zu false ausgewertet wurden. Außerdem könnt ihr erkennen, welche vollständigen Ausführungspfade durch eine Methode getestet wurden und welche noch fehlen. Dadurch wird sichtbar, warum eine Zeile als ausgeführt gilt, obwohl wichtige Fälle weiterhin ungetestet sind.
Im Video führt Sebastian durch diese Ansichten an einem realen Beispielprojekt. Das macht abstrakte Coverage-Metriken deutlich verständlicher als eine reine Prozentzahl und hilft euch, gezielt fehlende Testfälle abzuleiten.
Weitere Neuerungen für moderne PHP-Projekte
Die Release Notes von PHPUnit 13.3 enthalten noch weitere Verbesserungen. Mit #[CoversFile] und #[CoversDirectory] lässt sich Coverage für nicht objektorientierten Code wie Templates deklarieren. Eigene Exporter können die Darstellung komplexer Objekte bei fehlgeschlagenen Assertions übersichtlicher machen. Auch Property Hooks aus PHP 8.4 werden in Test Doubles besser unterstützt.
Ausblick auf native parallele Tests in PHPUnit
Die Architekturarbeit an Repeat und Retry hat einen weiteren Weg geöffnet: eine mögliche native parallele Testausführung. Sebastian zeigt im Video einen funktionierenden Entwicklungsstand, bei dem die PHPUnit-eigene End-to-End-Testsuite auf seinem Rechner statt rund 250 Sekunden nur etwa 48,5 Sekunden benötigt.
Dabei handelt es sich ausdrücklich um Zukunftsmusik und nicht um ein fertiges Feature von PHPUnit 13.3. Vor einer Veröffentlichung muss die Implementierung an großen Open-Source-Projekten, unterschiedlichen Betriebssystemen und realen Testsuites geprüft werden. Gerade dieser offene Einblick macht die Session wertvoll.
Warum ihr euch die vollständige Release-Session ansehen solltet
Ihr bekommt keine oberflächliche Liste neuer Funktionen, sondern die technischen Entscheidungen hinter PHPUnit erklärt. Sebastian demonstriert Repeat und Retry im Terminal, zeigt den neuen Coverage-Report und führt live durch den Release-Prozess mit Changelog, Commit, Tag, PHAR-Build und GitHub Actions.
Fazit: Gute Tests brauchen Vertrauen und Transparenz
PHPUnit 13.3 liefert starke Werkzeuge, um Flaky Tests sichtbar zu machen, kontrolliert mit ihnen umzugehen und Code Coverage besser zu verstehen. Repeat hilft bei der Analyse, Retry kann in begründeten Fällen Stabilität schaffen und der neue HTML-Report zeigt wesentlich genauer, welche Teile eures Codes tatsächlich geprüft werden.
Wenn ihr eure PHP-Testsuite stabilisieren, Flaky Tests analysieren, Code Coverage sinnvoll einsetzen oder KI-generierte Tests zuverlässig absichern möchtet, nehmt gerne Kontakt mit uns auf. Wir unterstützen euch bei den technischen Themen, bei Testing-Strategien und bei der nachhaltigen Qualitätssicherung eurer Softwareprojekte.
