Pest 5 erscheint mit Test Impact Analysis, KI-Agenten-Tools und Eval-Support
Nuno Maduro hat Pest 5 auf der Laracon US 2026 vorgestellt.
Das Release bringt eine Test-Impact-Analysis-Engine, die Laravel Clouds Suite mit 19.000 Tests von 3 Minuten auf 5 Sekunden verkürzte, sowie Plugins für KI-Agenten-Verifizierung, LLM-Evals, PHPStan und Rector. Basis sind PHP 8.4 und PHPUnit 13.
Nuno Maduro hat Pest 5 auf der Bühne der Laracon US 2026 in Boston angekündigt und v5.0.0 noch während der Konferenz getaggt. Die neue Major-Version des PHP-Testframeworks setzt PHP 8.4 voraus und läuft auf PHPUnit 13.
Das zentrale Feature ist die Tia-Engine (Test Impact Analysis). Beim ersten Lauf zeichnet sie auf, welche Tests welche Dateien berühren; danach führt `./vendor/bin/pest --parallel --tia` nur die von Änderungen betroffenen Tests aus und spielt den Rest aus dem Cache ab. Laravel Clouds Suite mit über 19.000 Tests sank Berichten zufolge von 3 Minuten auf 5 Sekunden. Gecachte Ergebnisse behalten vollständige Zeilen- und Branch-Coverage, sodass `--coverage`-Reports und `--min`-Schwellen sich verhalten, als sei die ganze Suite gelaufen. Der Abhängigkeitsgraph geht über PHP hinaus: Eine geänderte Migration startet nur Tests, die die betreffende Tabelle abfragten; eine bearbeitete JS-Komponente folgt Vites Modulgraphen zu betroffenen Inertia-Pages; ein angefasstes Blade-Template startet die Tests, die es gerendert haben. Laravel, Symfony, Livewire, Inertia und Browser-Assets werden automatisch über Composer erkannt. Dateien werden vor dem Hashing normalisiert (Whitespace, Kommentare und Docblocks entfernt), sodass ein Pint-Lauf keine Re-Runs auslöst. Für die Baseline-Aufzeichnung ist PCOV oder Xdebug nötig; CI kann die Baseline einmal pro Merge nach main aufzeichnen, wobei das Teilen eine authentifizierte GitHub CLI erfordert und nur auf GitHub funktioniert. Konfiguriert wird das Verhalten in tests/Pest.php über `pest()->tia()` mit Methoden wie `always()`, `locally()`, `baselined()` und `filtered()`.
Das Agent-Plugin (pestphp/pest-plugin-agent) gibt KI-Coding-Agenten eine Möglichkeit, Änderungen zu verifizieren. Die Option `--agent` führt ein Snippet als isolierten Test namens "verify" aus, mit Factories, RefreshDatabase und Laravel-Fakes – etwa einen User anlegen und eine Dashboard-Anfrage auf OK prüfen. Mit installiertem Browser-Testing-Plugin können Probes einen echten Browser steuern und Backend-Seiteneffekte prüfen. Gedacht ist es als schnelles Feedback, nicht als Ersatz für committete Regressionstests.
Das Evals-Plugin (pestphp/pest-plugin-evals) behandelt nicht-deterministische LLM-Ausgaben, indem es Qualität bewertet statt Gleichheit zu prüfen – über die bekannte expect()-API. Evals rufen echte Modelle auf, werden daher bei normalen Läufen übersprungen und nur mit `--evals` ausgeführt. Deterministische Expectations wie toContain(), toMatch(), toBe() und toBeJson() brauchen keinen Driver. Bewertete Expectations akzeptieren einen Schwellenwert von 0.0 bis 1.0 (Standard 0.7): toBeRelevant(), toBeSafe(), toBeFactual(), toBeSimilar() und toPassJudge() für Kriterien in freiem Text, dazu toHaveToolCalls() und toFollowTrajectory() für Tool-Nutzung von Agenten, repeat() für Mehrfach-Sampling und toPassScorer() für eigene Scorer. Standardmäßig läuft die Bewertung über Laravel AI; Judge- und Embeddings-Driver lassen sich per Closures oder eigenen Klassen austauschen.
Erstklassiger PHPStan-Support (pestphp/pest-plugin-phpstan) war lange gewünscht. Das Plugin liest die Pest.php, um zu bestimmen, was $this in Test-Closures ist, unterstützt sowohl uses(TestCase::class)->in(...) als auch pest()->extend(...) und registriert sich mit phpstan/extension-installer selbst. Typen fließen durch Expectation-Chains, toBeInt() verengt Unions, in beforeEach() gesetzte Properties werden typisiert, und unmögliche Expectations wie expect(10)->toStartWith('1') werden gemeldet. Zusätzliche Pest-Regeln decken statische Closures, $this in beforeAll(), doppelte Beschreibungen sowie ungültige throws()/covers()-Referenzen ab, jeweils mit stabilen IDs wie pest.expectation.impossible.
Das Rector-Plugin (pestphp/pest-plugin-rector) liefert 60 Regeln in Coding-Style- und Upgrade-Sets. Das Style-Set schreibt rohe PHP-Assertions zu Matchern um (etwa count- und Key-Prüfungen zu toHaveCount(5)->toHaveKey('id')), konvertiert PHPUnit-Assertions zu expect() und wandelt try/catch-Exception-Tests in toThrow() um. Upgrade-Sets unter PestLevelSetList sind kumulativ; Vorschau mit --dry-run.
Zeitbasiertes Sharding, eingeführt in Pest v4.6.0, verteilt CI-Shards nach gemessener Laufzeit statt Dateianzahl: Timings mit --update-shards aufzeichnen, tests/.pest/shards.json committen, und --shard=1/4 nutzt sie automatisch.
Acht neue Expectations decken mühsame Formatprüfungen ab: toBeEmail(), toBeUlid(), toBeIpAddress(), toBeMacAddress(), toBeHostname(), toBeDomain(), toBeBase64() und toBeHexadecimal() – jeweils mit optionaler eigener Fehlermeldung und Negation über not.
Das Upgrade bedeutet, pestphp/pest und Pest-eigene Plugins in composer.json auf ^5.0 zu heben. Der Upgrade-Guide schätzt etwa zwei Minuten ohne API-Brüche jenseits der Versionssprünge; die meiste Reibung dürfte von PHPUnit 13 selbst kommen.
Leserforum
Noch keine Beiträge — eröffne die Debatte.
Starte die Diskussion
Kein Konto, kein Passwort nötig — gib einfach deine E-Mail-Adresse ein, wir senden dir einen einmaligen Anmelde-Link. Beim ersten Mal bist du damit automatisch angemeldet.
Deine Bewertung wird nach der Anmeldung automatisch übernommen.
Schau in dein Postfach
Wir haben einen Anmelde-Link an … gesendet. Öffne ihn auf diesem Gerät — dieser Tab meldet dich automatisch an.
Warte auf deinen Klick …
·