Willkommen im Jahr 2026! Die PHP-Welt steht nicht still und mit dem neuen Jahr gibt es nicht nur gute Vorsätze, sondern auch ein lang erwartetes Update: PHPUnit 13 ist offiziell veröffentlicht. Für viele von uns ist das Testing-Framework das Rückgrat der Softwarequalität im PHP-Ökosystem. Doch was bringt die neue Major-Version wirklich? Lohnt sich das Upgrade sofort oder solltet ihr noch warten?
In einer aktuellen Live-Session von Never Code Alone durfte ich gemeinsam mit Sebastian Bergmann, dem Creator von PHPUnit, tief in die Neuerungen eintauchen. Wenn ihr euch für sauberen Code, stabile Tests und die Zukunft des PHP-Testings interessiert, solltet ihr euch diese Insights nicht entgehen lassen. In diesem Beitrag fasse ich die wichtigsten Lerninhalte für euch zusammen und erkläre, warum ihr euch das gesamte Video anschauen solltet.
1. Was ist die Philosophie hinter PHPUnit 13 und warum wird so viel entfernt statt hinzugefügt?
Eine der überraschendsten Aussagen von Sebastian zu Beginn des Gesprächs war seine persönliche Freude am Release. Oft erwarten wir bei neuen Versionen eine Flut an neuen Features. Bei PHPUnit 13 steht jedoch etwas anderes im Vordergrund: Aufräumen.
Eine Major-Version wie PHPUnit 13 ist für das Projekt die jährliche Gelegenheit, technische Schulden abzubauen. Code, der vor Jahren sinnvoll war, heute aber nur noch im Weg steht, wird konsequent entfernt. Sebastian erklärte im Detail, warum das für euch als Entwickler entscheidend ist. Eine Zeile Code, die nicht existiert, kann keine Fehler enthalten und muss nicht migriert werden. Durch das Entfernen von veralteten Workarounds für alte PHP-Bugs wird die Codebasis nicht nur schlanker, sondern auch wartbarer.
Für euch bedeutet das: PHPUnit 13 ist stabiler und fokussierter. Die kognitive Last beim Maintainen von Tests sinkt, weil ihr euch nicht mehr mit veralteten Konstrukten herumschlagen müsst. Wenn ihr Wert auf Software Quality und langfristige Stabilität legt, ist dieser „Neujahrsputz“ im Core des Frameworks ein starkes Argument für das Update.
Wir sehen dieses Prinzip – weniger ist mehr – in unserer Beratungspraxis bei Never Code Alone seit über 15 Jahren. Technische Schulden konsequent abzubauen ist einer der wirkungsvollsten Hebel für nachhaltige Softwarequalität.
2. Was macht die neue seal() Methode bei Mock Objects und warum ist sie so wichtig?
Kennt ihr das Problem, dass Tests grün sind, aber ein falsches Sicherheitsgefühl vermitteln? Im Video zeigte Sebastian ein Beispiel, bei dem ein Mock Object konfiguriert wurde, um einen Methodenaufruf charge() zu erwarten. Im produktiven Code wurde jedoch versehentlich refund() aufgerufen. Der Test blieb grün, weil PHPUnit unerwartete Aufrufe bisher ignorierte.
Mit PHPUnit 13 gibt es jetzt die seal() Methode. Sobald ihr ein Mock Object „versiegelt“, kann es nicht mehr konfiguriert werden. Noch wichtiger: PHPUnit erwartet automatisch, dass alle anderen Methoden des Interfaces nicht aufgerufen werden. Das schließt blind spots in euren Tests. Ihr müsst nicht mehr manuell never() für jede einzelne Methode definieren.
Das führt zu robusteren Tests und weniger Bugs in der Produktion. Sealed Test Doubles bieten einen klaren Vertrag: Sobald die Konfiguration abgeschlossen ist, wird das Test Double zu einer zuverlässigen, unveränderlichen Fixture. Tests werden wartbarer und fangen unbeabsichtigte Interaktionen ab, die sonst unbemerkt geblieben wären. Das Feature ist rein additiv – ihr müsst bestehende Tests nicht ändern, könnt aber gezielt dort opt-in gehen, wo strikteres Verhalten Mehrwert bringt.
3. Was ersetzen withParameterSetsInOrder und withParameterSetsInAnyOrder und wie nutze ich sie?
Ein weiteres Highlight ist die Weiterentwicklung der Mock-Expectations. Lange gab es das Problem mit withConsecutive, das schwer zu warten war und oft zu Verwirrung führte. Bereits seit PHPUnit 10 mussten Entwickler umständliche Workarounds implementieren, um Aufrufsequenzen abzubilden. In Version 13 wurde dies durch withParameterSetsInOrder und withParameterSetsInAnyOrder ersetzt.
Stellt euch vor, ihr testet einen Event Dispatcher. Manchmal ist die Reihenfolge der Events entscheidend, manchmal nicht. Mit den neuen Methoden habt ihr die volle Kontrolle. Ihr könnt explizit definieren, ob die Aufrufe in einer spezifischen Reihenfolge erfolgen müssen oder ob die Reihenfolge egal ist, solange alle erwarteten Parameter kommen.
Das macht eure Test Doubles deutlich aussagekräftiger und den Code lesbarer. Die vorherige Herangehensweise hatte bekannte Einschränkungen – insbesondere die enge Abhängigkeit von einer festen Aufrufreihenfolge und die wachsende Komplexität in anspruchsvolleren Szenarien. Das Ziel dieser Neuerung ist es, Erwartungen an Mock Objects klarer zu formulieren und die zugehörigen Prüfungen transparenter zu gestalten.
4. Welche neuen Array Assertions gibt es in PHPUnit 13 und wann setze ich sie ein?
Für alle, die viel mit APIs und JSON arbeiten, sind die acht neuen Array Assertions ein Segen. Bisher wart ihr oft gezwungen, komplexe Vergleiche selbst zu bauen. Jetzt könnt ihr aus verschiedenen Härtegraden wählen: Von assertArraysAreIdentical (strenger Vergleich inklusive Reihenfolge und Typen) bis hin zu Vergleichen, die die Reihenfolge ignorieren.
PHPUnit 13 adressiert damit einen lange bestehenden Bedarf an präziserer Array-Vergleichs-Semantik jenseits der allgemeinen assertSame() und assertEquals() Methoden. Je nach Anwendungsfall könnt ihr den passenden Härtegrad wählen: Braucht ihr einen strikten Vergleich inklusive Reihenfolge und Typen? Oder reicht es, wenn die gleichen Elemente vorhanden sind, egal in welcher Reihenfolge?
Das spart euch Zeit und macht die Absicht eurer Tests im Code sofort klar. Gerade in Projekten, die viel mit externen APIs arbeiten, sind diese Assertions ein echter Produktivitätsgewinn. Wenn ihr Unterstützung beim Refactoring eurer bestehenden Array-Tests braucht oder eine Teststrategie für eure API-Integration entwickeln wollt, meldet euch bei uns: roland@nevercodealone.de.
5. Welche PHP-Version brauche ich für PHPUnit 13 und wie plane ich das Upgrade?
PHPUnit 13 erfordert PHP 8.4 oder neuer. Wenn ihr noch auf PHP 8.3 oder älter unterwegs seid, könnt ihr PHPUnit 13 nicht direkt nutzen. Das ist kein Zufall – die einzigen aktiv unterstützten PHP-Versionen zum Release-Zeitpunkt sind PHP 8.4 und PHP 8.5.
Die Empfehlung im Video war klar: Geht Schritt für Schritt vor. Aktualisiert erst die PHP-Version, dann die PHPUnit-Version. Ein direkter Sprung über mehrere Major-Versionen hinweg führt oft zu unnötigem Stress durch Breaking Changes. Sebastian war hier sehr deutlich: Ihr solltet nicht einmal versuchen, auf PHPUnit 13 zu upgraden, wenn ihr PHPUnit 12.5 nicht ohne Deprecation-Warnings ausführen könnt.
Nutzt die Deprecation-Listen der Zwischenversionen, um euren Code anzupassen. Funktionalität, die in PHPUnit 12 nur soft-deprecated war, ist in PHPUnit 13 nun hard-deprecated. Und was in PHPUnit 12 hard-deprecated war, wurde in Version 13 entfernt. Das Upgrade auf eine neue Major-Version muss eine bewusste Entscheidung sein, die Teil eines definierten Prozesses ist.
Wichtig: PHPUnit warnt explizit vor dem sogenannten „Death Star Version Constraint“ – also dem unbeabsichtigten automatischen Upgrade auf eine neue Major-Version über zu offene Composer-Constraints.
6. Kann KI sinnvoll Tests schreiben oder ist das nur AI Slop?
Ein Thema, das im Video intensiv diskutiert wurde, ist der Einsatz von Künstlicher Intelligenz beim Schreiben von Tests. Sebastian brachte eine wichtige Nuance in die Debatte ein, die ihr beachten solltet.
Ja, KI kann Tests generieren, um eine hohe Code Coverage zu erreichen. Aber sind diese Tests wertvoll? Oft handelt es sich um sogenannten „AI Slop“. Die KI generiert Tests, die den Code ausführen, aber nicht dokumentieren, was die Software tun soll. Tests dienen aber nicht nur der Verifikation, sondern auch der Spezifikation und Dokumentation.
Ein interessantes Konzept, das im Gespräch fiel, sind Characterization Tests. Diese testen nicht, ob etwas „richtig“ ist, sondern halten fest, wie sich eine Legacy-Codebasis aktuell verhält. Das kann ein guter Einstieg sein, um alte Systeme zu modernisieren. Doch verlasst euch nicht blind auf KI-Agenten. Die Gefahr des „Deskilling“ ist real: Wenn ihr nicht mehr versteht, was eure Tests tun, weil sie eine KI geschrieben hat, verliert ihr wichtige Fähigkeiten als Entwickler.
Nutzt KI als Unterstützung, etwa um Hypothesen zu prüfen, aber schreibt die kritische Testlogik selbst. Wir bei Never Code Alone begleiten Teams seit über 15 Jahren bei genau dieser Balance zwischen Automatisierung und menschlicher Expertise.
7. Warum wird der any() Matcher deprecated und was bedeutet das für meine Tests?
Die Deprecation des any() Matchers in PHPUnit 13 verstärkt ein fundamentales Prinzip: Mock Objects sind Verifikationswerkzeuge, die dafür konzipiert sind zu prüfen, ob bestimmte Interaktionen stattfinden – nicht um sie stillschweigend zu ignorieren.
Der any() Matcher erzeugt einen konzeptionellen Widerspruch: Ihr erstellt ein Mock Object (also ein Objekt zur Verhaltensverifikation), erklärt dann aber gleichzeitig, dass es euch egal ist, ob eine Methode aufgerufen wird. PHPUnit 13 ermutigt euch, bewusste Entscheidungen zu treffen: Entweder nutzt ihr spezifische Matcher wie once() oder exactly() für echte Verifikation, oder ihr migriert zu Test Stubs, wenn keine Verifikation benötigt wird.
Diese klare Trennung zwischen Stubs und Mocks war schon immer die Empfehlung, wird jetzt aber durch die API stärker durchgesetzt. Braucht ihr ein Objekt als einfachen Platzhalter, das vordefinierte Werte zurückgibt? Nutzt createStub(). Braucht ihr Verifikation von Methodenaufrufen? Nutzt createMock(). Die Unterscheidung macht eure Tests aussagekräftiger und eliminiert den Performance-Overhead von Mock Objects in Szenarien, in denen sie keinen echten Verifikationswert bieten.
8. Kann ich von PHPUnit 9 oder 10 direkt auf PHPUnit 13 springen?
Die kurze Antwort: Das ist technisch möglich, aber nicht empfehlenswert. Die Empfehlung aus dem Video und von Sebastian selbst war eindeutig: Geht Schritt für Schritt vor.
Jede Major-Version von PHPUnit hat ihre eigenen Deprecation-Zyklen. Was in Version 10 deprecated wurde, wurde in Version 11 entfernt. Was in 11 deprecated wurde, ist in 12 raus. Und so weiter. Wenn ihr von Version 9 direkt auf 13 springt, überspringt ihr drei komplette Deprecation-Zyklen. Das bedeutet, ihr bekommt keine hilfreichen Deprecation-Warnings mehr, die euch zeigen, was angepasst werden muss – der Code bricht einfach.
Der empfohlene Weg: Aktualisiert erst auf die jeweils letzte Minor-Version eurer aktuellen Major-Version. Behebt alle Deprecation-Warnings. Dann springt zur nächsten Major-Version. Das klingt aufwändiger, ist aber deutlich weniger stressig als ein Big-Bang-Upgrade. Beachtet auch, dass jede PHPUnit Major-Version eine neuere PHP Minor-Version voraussetzt. Ihr müsst also gegebenenfalls auch eure PHP-Version schrittweise aktualisieren.
Wenn euch der Upgrade-Pfad über mehrere Major-Versionen überfordert oder ihr Unterstützung bei der Migration braucht, sind wir für euch da. Wir sind seit über 15 Jahren auf Softwarequalität spezialisiert und haben schon zahlreiche Teams durch genau solche Migrationen begleitet: roland@nevercodealone.de.
9. Wie steht es um die Unabhängigkeit der PHP-Community und was hat das mit PHPUnit zu tun?
Ein weiterer wichtiger Punkt im Gespräch war die Unabhängigkeit der Community. Sebastian erwähnte Initiativen wie php.cx.tv, eine dezentrale Video-Plattform im Fediverse (PeerTube), die als Alternative zu zentralisierten US-Plattformen dient.
Zudem läuft eine Petition zur Anerkennung von Open-Source-Arbeit als Ehrenamt, um steuerliche Vorteile für Maintainer zu schaffen. Das ist ein Thema, das uns bei Never Code Alone besonders am Herzen liegt. Open Source ist das Fundament, auf dem ein Großteil der modernen Softwareentwicklung aufgebaut ist. Wenn Maintainer wie Sebastian Bergmann tausende Stunden in Projekte wie PHPUnit investieren, die Millionen von Entwicklern nutzen, dann verdient diese Arbeit Anerkennung und Unterstützung.
Es lohnt sich, diese Bewegungen zu unterstützen, um das Ökosystem gesund zu halten. Ob durch Sponsoring, aktive Mitarbeit oder einfach durch das Teilen und Verbreiten solcher Initiativen – jeder Beitrag zählt. Gerade in Zeiten, in denen die Abhängigkeit von großen US-Tech-Plattformen zunehmend kritisch hinterfragt wird, sind dezentrale, community-getriebene Alternativen wichtiger denn je.
10. Warum sollte ich mir das komplette Video der Live-Session anschauen?
Das Gespräch mit Sebastian Bergmann bietet deutlich mehr als nur eine Changelog-Zusammenfassung. Ihr bekommt Einblicke in die Entscheidungsprozesse hinter einem der wichtigsten PHP-Projekte. Die Live-Demos zu den neuen Mock-Object-Features sind Gold wert, um zu verstehen, wie ihr eure Tests sofort verbessern könnt.
Besonders die Demonstration des seal()-Problems – wo ein Test grün blieb, obwohl refund() statt charge() aufgerufen wurde – macht die Dringlichkeit greifbar. Solche Blind Spots in der Testsuite sind in der Praxis häufiger als ihr denkt. Zudem wird die Diskussion um KI im Testing so differenziert geführt, wie es in der Branche selten zu erleben ist.
Lernt, wie ihr technische Schulden identifiziert, wie ihr seal() für sicherere Tests nutzt und warum weniger Code oft die bessere Lösung ist. Dieses Wissen hilft euch, nicht nur PHPUnit besser zu nutzen, sondern eure gesamte Architektur kritischer zu hinterfragen.
Fazit und Unterstützung
PHPUnit 13 ist ein reifes Release, das Stabilität über neue Spielereien stellt. Die neuen Features wie seal(), die verbesserten Parameter-Set-Methoden und die acht neuen Array Assertions lösen echte Probleme im Entwickleralltag. Die Deprecation des any() Matchers und die klarere Trennung zwischen Stubs und Mocks machen eure Tests langfristig aussagekräftiger.
Wenn ihr unsicher seid, wie ihr das Update in eurer bestehenden Infrastruktur umsetzt, oder Hilfe bei der Implementierung von sinnvollen Teststrategien benötigt, seid ihr nicht allein. Nehmt gerne Kontakt mit uns auf für Unterstützung zu den technischen Themen. Wir sind seit über 15 Jahren auf Softwarequalität, Open Source und Remote Consulting spezialisiert und helfen euch dabei, eure Test-Pipelines zu modernisieren, KI sinnvoll zu integrieren und eure Softwarequalität nachhaltig zu sichern: roland@nevercodealone.de.
Schaut euch das vollständige Video an und bleibt grün im Build!
