Skip to main content

Was ist Pest?

Pest ist ein auf PHPUnit aufbauendes Test-Framework und in neuen Projekten ab Laravel 11 die Standardwahl. Sie können die umfangreichen Assertions von PHPUnit weiter nutzen und Tests dazu in prägnanter, Closure-basierter Syntax schreiben. Wichtige Unterschiede zu PHPUnit:
Pest-Tests laufen auf PHPUnit — bestehende PHPUnit-Tests können nebeneinander bestehen. Ausführen mit php artisan test oder vendor/bin/pest.

describe / it / test sinnvoll einsetzen

test()

Die einfachste Form. Der Testname dient als Beschreibung.

it()

Erlaubt eine natürlichere „it should …”-Formulierung.

describe()

Gruppiert zusammengehörige Tests. Praktisch zum Teilen von beforeEach() und zur logischen Gliederung.
describe() lässt sich verschachteln. Zu tiefe Verschachtelung erschwert die Lesbarkeit — als Faustregel maximal zwei Ebenen.

Expectation API

expect() ist Pests eigene Assertion-Syntax mit Method-Chains.

Grundlegende Assertions

Assertions auf Modellen

and()-Chain

each() — jedes Array-Element prüfen

Parametrisierte Tests mit Datasets

Um dieselbe Logik mit mehreren Eingaben zu testen, verwenden Sie dataset() oder inline with().

Inline-Dataset

Benannte Datasets

Definieren Sie Datasets im Verzeichnis tests/Datasets.

Dynamische Datasets über Closures

Unit-Tests mit Mockery

Service mocken

Spies

Spies führen die reale Implementierung aus und protokollieren Aufrufe.

Partial Mocks

Nur einzelne Methoden mocken, den Rest real ausführen.

Tests externer API-Aufrufe mit HTTP-Fakes

Http::fake() stubbt Responses, sodass keine echten HTTP-Requests gesendet werden.

Grundlegender Fake

Fehler-Response testen

Netzwerkfehler simulieren

Fakes für Events, Mails und Notifications

Event::fake()

Sie können auch nur bestimmte Events faken und andere real verarbeiten lassen.

Mail::fake()

Notification::fake()

Tests von Artisan-Commands

Interaktive Commands testen

RefreshDatabase und LazilyRefreshDatabase

RefreshDatabase

Rollt die Datenbank nach jedem Test zurück und hält sie sauber. Führt beim Start der Suite die Migrationen aus.

LazilyRefreshDatabase

Während RefreshDatabase für jeden Test Migrationen prüft, wartet LazilyRefreshDatabase bis zum ersten DB-Zugriff. Wenn viele Tests die Datenbank gar nicht anfassen, beschleunigt das die Suite.
In den meisten Projekten ist RefreshDatabase die sichere Wahl. LazilyRefreshDatabase lohnt sich, wenn die Suite groß ist und viele Tests ohne DB laufen.

Code Coverage messen

Erfordert Xdebug oder PCOV.
Coverage-Messung verlängert die Testlaufzeit erheblich. In der CI empfiehlt sich ein eigener Job oder das Ausführen nur bei Pull-Requests.

Verwandte Seiten

Einstieg in Tests

Grundlagen des Testens in Laravel und die Nutzung von php artisan test.
Zuletzt geändert am 13. Juli 2026