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.
<?phptest('die Anwendung liefert eine erfolgreiche Antwort', function () { $response = $this->get('/'); $response->assertStatus(200);});
<?phpnamespace Tests\Feature;use Tests\TestCase;class ExampleTest extends TestCase{ public function test_the_application_returns_a_successful_response(): void { $response = $this->get('/'); $response->assertStatus(200); }}
Die Methode 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.
In Tests können Sie mit den Methoden get, 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.
<?phptest('einfache Anfrage', function () { $response = $this->get('/'); $response->assertStatus(200);});
<?phpnamespace Tests\Feature;use Tests\TestCase;class ExampleTest extends TestCase{ public function test_a_basic_request(): void { $response = $this->get('/'); $response->assertStatus(200); }}
Innerhalb einer Testmethode sollten Sie grundsätzlich nur eine Anfrage senden. Mehrere Anfragen in derselben Testmethode können zu unerwartetem Verhalten führen.
Um zu prüfen, dass eine bestimmte Ausnahme ausgelöst wird, nutzen Sie die Facade Exceptions.
<?phpuse App\Exceptions\InvalidOrderException;use Illuminate\Support\Facades\Exceptions;test('Ausnahme wird ausgelöst', function () { Exceptions::fake(); $response = $this->get('/order/1'); // Prüfen, dass die Ausnahme ausgelöst wurde Exceptions::assertReported(InvalidOrderException::class); // Inhalt der Ausnahme prüfen Exceptions::assertReported(function (InvalidOrderException $e) { return $e->getMessage() === 'The order was invalid.'; });});
<?phpnamespace Tests\Feature;use App\Exceptions\InvalidOrderException;use Illuminate\Support\Facades\Exceptions;use Tests\TestCase;class ExampleTest extends TestCase{ public function test_exception_is_thrown(): void { Exceptions::fake(); $response = $this->get('/'); Exceptions::assertReported(InvalidOrderException::class); Exceptions::assertReported(function (InvalidOrderException $e) { return $e->getMessage() === 'The order was invalid.'; }); }}
Um sicherzustellen, dass keine Ausnahme ausgelöst wurde, verwenden Sie assertNotReported oder assertNothingReported.
Auf JSON-Daten der Antwort können Sie wie auf ein Array zugreifen.
expect($response['created'])->toBeTrue();
$this->assertTrue($response['created']);
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.
etc() erlaubt zusätzliche, nicht geprüfte Felder in der Antwort. Ohne etc() schlägt der Test fehl, wenn zusätzliche Felder vorhanden sind. So verhindern Sie unbeabsichtigt in Antworten enthaltene sensible Informationen.
Vorhandensein und Nichtvorhandensein von Attributen prüfen Sie mit has() und missing().
Mit Illuminate\Http\UploadedFile und der Methode fake() erzeugen Sie Dummy-Dateien und -Bilder.
In Kombination mit Storage::fake() testen Sie Uploads komfortabel.
Sie können Views auch direkt rendern und testen, ohne eine HTTP-Anfrage zu simulieren.
Die Methode view() erwartet den View-Namen und optional ein Daten-Array und liefert eine Instanz von Illuminate\Testing\TestView.
<?phptest('Welcome-View wird gerendert', function () { $view = $this->view('welcome', ['name' => 'Taylor']); $view->assertSee('Taylor');});
<?phpnamespace Tests\Feature;use Tests\TestCase;class ViewTest extends TestCase{ public function test_a_welcome_view_can_be_rendered(): void { $view = $this->view('welcome', ['name' => 'Taylor']); $view->assertSee('Taylor'); }}
Für die TestView-Klasse stehen folgende Assertions bereit.
Methode
Beschreibung
assertSee($value)
View enthält den angegebenen Text
assertSeeInOrder([...])
View enthält die angegebenen Texte in dieser Reihenfolge
assertSeeText($value)
Der Text der View enthält den angegebenen Text
assertSeeTextInOrder([...])
Der Text enthält die angegebenen Texte in dieser Reihenfolge
assertDontSee($value)
View enthält den Text nicht
assertDontSeeText($value)
Der Text der View enthält den Text nicht
Um den gerenderten Inhalt als String zu erhalten, casten Sie die TestView-Instanz.
$contents = (string) $this->view('welcome');
Um Validierungsfehler an die View zu übergeben, nutzen Sie withViewErrors().
$view = $this->withViewErrors([ 'name' => ['Bitte geben Sie einen gültigen Namen ein.']])->view('form');$view->assertSee('Bitte geben Sie einen gültigen Namen ein.');
HTTP-Tests harmonieren hervorragend mit TDD (Test-Driven Development). Die folgenden Hinweise helfen Ihnen dabei.
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
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
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
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
Für Routen mit Authentifizierung immer sowohl den authentifizierten als auch den nicht authentifizierten Fall testen. So finden Sie Sicherheitsprobleme frühzeitig.