Einführung
Laravel stellt eine umfangreiche API zum Simulieren von HTTP-Anfragen und Verifizieren der Antworten bereit. Sie können damit Requests an Ihre Anwendung testen, ohne einen echten HTTP-Server zu starten.get() sendet eine GET-Anfrage an die Anwendung; assertStatus() prüft den HTTP-Statuscode der Antwort.
Während Tests wird die CSRF-Middleware automatisch deaktiviert. Sie müssen sie im Test nicht ausdrücklich abschalten.
Anfragen erzeugen
In Tests können Sie mit den Methodenget, post, put, patch und delete Anfragen absetzen.
Diese senden keine echten Netzwerkanfragen, sondern simulieren die Verarbeitung innerhalb der Anwendung.
Der Rückgabewert ist eine Instanz von Illuminate\Testing\TestResponse, die zahlreiche Assertion-Methoden bietet.
Request-Header anpassen
MitwithHeaders() passen Sie die Header einer Anfrage an.
Cookies
MitwithCookie() bzw. withCookies() setzen Sie Cookie-Werte vor einer Anfrage.
Session und Authentifizierung
MitwithSession() legen Sie Session-Werte vor einer Anfrage fest.
actingAs() versenden Sie Anfragen als authentifizierter Nutzer. Häufig in Kombination mit Model-Factories.
actingAsGuest().
Antwort debuggen
Um während des Tests den Inhalt einer Antwort zu prüfen, nutzen Siedump, dumpHeaders und dumpSession.
dd, ddHeaders, ddBody, ddJson oder ddSession.
Ausnahmen testen
Um zu prüfen, dass eine bestimmte Ausnahme ausgelöst wird, nutzen Sie die FacadeExceptions.
assertNotReported oder assertNothingReported.
withoutExceptionHandling().
assertThrows().
assertDoesntThrow().
Tests für JSON-APIs
Für JSON-APIs bietet Laravel zahlreiche Helfer. Mitjson, getJson, postJson, putJson, patchJson, deleteJson und optionsJson senden Sie JSON-Anfragen.
assertJson() konvertiert die Antwort in ein Array und prüft, ob das angegebene Array Teil der JSON-Antwort ist. Zusätzliche Felder in der Antwort führen nicht zum Fehlschlagen, solange das erwartete Fragment enthalten ist.Exakte Übereinstimmung
MitassertExactJson() prüfen Sie, dass die zurückgegebene JSON-Antwort exakt dem angegebenen Array entspricht.
Werte per JSON-Pfad prüfen
MitassertJsonPath() prüfen Sie den Wert an einem bestimmten Pfad.
Fluent JSON-Tests
WirdassertJson() eine Closure übergeben, können Sie Assertions per AssertableJson verkettet formulieren.
has() und missing().
hasAll() und missingAll() bereit.
JSON-Collections prüfen
Liefert die Route mehrere Elemente, prüfen Sie Anzahl und Inhalt mithas().
each().
JSON-Typen prüfen
MitwhereType() und whereAllType() prüfen Sie den Datentyp einer Property.
| können Sie mehrere Typen angeben; eine Übereinstimmung genügt.
string, integer, double, boolean, array, null.
Auth-Tests
MitactingAs() senden Sie Anfragen als authentifizierter Nutzer.
Beispiel: Registrierungsprozess testen
Beispiel für den Test eines realen Registrierungs-Endpunkts.Session-Tests
MitwithSession() setzen Sie Session-Daten vor der Anfrage; mit assertSessionHas() prüfen Sie deren Vorhandensein.
Übersicht der Session-Assertions
Datei-Upload-Tests
MitIlluminate\Http\UploadedFile und der Methode fake() erzeugen Sie Dummy-Dateien und -Bilder.
In Kombination mit Storage::fake() testen Sie Uploads komfortabel.
assertMissing().
Fake-Dateien anpassen
Bildgröße und Dateigröße sind einstellbar. Nützlich beim Testen von Validierungsregeln.View-Tests
Sie können Views auch direkt rendern und testen, ohne eine HTTP-Anfrage zu simulieren. Die Methodeview() erwartet den View-Namen und optional ein Daten-Array und liefert eine Instanz von Illuminate\Testing\TestView.
TestView-Klasse stehen folgende Assertions bereit.
Um den gerenderten Inhalt als String zu erhalten, casten Sie die
TestView-Instanz.
withViewErrors().
Komponenten testen
Mitblade() rendern Sie einen rohen Blade-Template-String.
component() rendern Sie Blade-Komponenten. Rückgabewert ist eine Illuminate\Testing\TestComponent-Instanz.
Übersicht der Response-Assertions
Wichtige Assertions vonIlluminate\Testing\TestResponse:
HTTP-Status
Redirects
Inhalte
JSON
Header und Cookies
Views
Validierung
Hinweise zu TDD
Mit Feature-Tests beginnen
Mit Feature-Tests beginnen
Legen Sie HTTP-Tests im Verzeichnis
tests/Feature/ an. Wer das Verhalten aus Sicht des Aufrufers (Request → Response) zuerst definiert, macht auch die zu implementierende Funktion klarer.RefreshDatabase verwenden
RefreshDatabase verwenden
Nutzen Sie in Tests, die die Datenbank verwenden, das Trait
RefreshDatabase. So wird die Datenbank nach jedem Test zurückgesetzt, und Tests bleiben voneinander isoliert. Das führt zu einem Testset, das unabhängig von der Ausführungsreihenfolge stabil ist.Factories konsequent verwenden
Factories konsequent verwenden
Mit Model-Factories wie
User::factory()->create() erzeugen Sie Testdaten mit wenig Code. Definieren Sie States, um bestimmte Zustände wiederverwendbar bereitzustellen – das erhöht die Lesbarkeit Ihrer Tests.Eine Assertion pro Test
Eine Assertion pro Test
Prüfen Sie in einer Testmethode möglichst nur eine Sache. Fehler lassen sich dann schneller zuordnen. Das AAA-Muster (Arrange → Act → Assert) erleichtert das Lesen.
Auth-Tests nicht vergessen
Auth-Tests nicht vergessen
Für Routen mit Authentifizierung immer sowohl den authentifizierten als auch den nicht authentifizierten Fall testen. So finden Sie Sicherheitsprobleme frühzeitig.
Verwandte Seiten
Einführung in Tests
Grundlagen zum Schreiben von Tests in Laravel und zur Nutzung von
php artisan test.