Zum Hauptinhalt springen

Einführung

Laravel bringt Werkzeuge mit, um Funktionen, die eine Datenbank nutzen, sicher und schnell zu prüfen. Traits zum Zurücksetzen der Datenbank, Model-Factories, Seeder und spezielle Assertions ergeben zusammen widerstandsfähige Tests. Als Ausgangspunkt empfiehlt sich RefreshDatabase. In vielen Fällen wahrt es die Isolation zwischen Tests schneller als ein kompletter Reset.

Datenbank nach jedem Test zurücksetzen

Damit Testdaten aus einem Test nicht in den nächsten hineinwirken, verwenden Sie die Traits von Laravel zum Zurücksetzen der Datenbank.
<?php

use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

test('einfaches Beispiel', function () {
    $response = $this->get('/');

    $response->assertOk();
});
<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    use RefreshDatabase;

    public function test_basic_example(): void
    {
        $response = $this->get('/');

        $response->assertOk();
    }
}
RefreshDatabase erkennt, ob das Schema aktuell ist. Ist es aktuell, führt es die Tests in einer Transaktion aus; ist es nicht aktuell, werden zuvor die Migrationen ausgeführt. Wenn Sie keine Transaktion nutzen, sondern bei jedem Test wirklich alles zurücksetzen möchten, stehen weitere Traits zur Verfügung.
TraitVerhaltenWann verwenden
RefreshDatabaseTransaktion bei aktuellem Schema; Migrationen nur bei BedarfDer übliche Standard
DatabaseMigrationsFührt bei jedem Test Migrationen ausWenn Sie den Migrationslebenszyklus jedes Mal durchlaufen möchten
DatabaseTruncationInitialisiert Tabellen per TRUNCATEWenn Transaktionen nicht in Frage kommen und Sie alles leeren möchten

Model-Factories

Zum Anlegen von Testdaten sind Model-Factories die kompakteste Möglichkeit, Eloquent-Modelle zu erzeugen. Details zu Factory-Definitionen, States und Relations finden Sie unter Eloquent-Factories.
<?php

use App\Models\User;

test('Modell lässt sich anlegen', function () {
    $user = User::factory()->create();

    expect($user->exists)->toBeTrue();
});
<?php

namespace Tests\Feature;

use App\Models\User;
use Tests\TestCase;

class UserFactoryTest extends TestCase
{
    public function test_models_can_be_instantiated(): void
    {
        $user = User::factory()->create();

        $this->assertTrue($user->exists);
    }
}

Seeder ausführen

Möchten Sie während eines Tests Daten einspielen, verwenden Sie seed(). Ohne Argument wird der DatabaseSeeder ausgeführt; mit Argument ein bestimmter Seeder (oder ein Array von Seedern).
<?php

use Database\Seeders\OrderStatusSeeder;
use Database\Seeders\TransactionStatusSeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

test('Bestellungen können angelegt werden', function () {
    $this->seed();

    $this->seed(OrderStatusSeeder::class);

    $this->seed([
        OrderStatusSeeder::class,
        TransactionStatusSeeder::class,
    ]);

    // ...
});
<?php

namespace Tests\Feature;

use Database\Seeders\OrderStatusSeeder;
use Database\Seeders\TransactionStatusSeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class OrderTest extends TestCase
{
    use RefreshDatabase;

    public function test_orders_can_be_created(): void
    {
        $this->seed();

        $this->seed(OrderStatusSeeder::class);

        $this->seed([
            OrderStatusSeeder::class,
            TransactionStatusSeeder::class,
        ]);

        // ...
    }
}
Um bei jedem Test, der RefreshDatabase verwendet, automatisch zu seeden, versehen Sie die Basis-Testklasse mit dem Attribut #[Seed].
<?php

namespace Tests;

use Illuminate\Foundation\Testing\Attributes\Seed;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

#[Seed]
abstract class TestCase extends BaseTestCase
{
}
Um automatisch nur bestimmte Seeder auszuführen, verwenden Sie #[Seeder(...)].
<?php

namespace Tests\Feature;

use Database\Seeders\OrderStatusSeeder;
use Illuminate\Foundation\Testing\Attributes\Seeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

#[Seeder(OrderStatusSeeder::class)]
class OrderStatusTest extends TestCase
{
    use RefreshDatabase;
}

Verfügbare Assertions

Laravel bringt spezielle Datenbank-Assertions mit, die sowohl mit Pest als auch mit PHPUnit funktionieren.

assertDatabaseCount

Prüft, dass die Anzahl der Datensätze in einer Tabelle dem erwarteten Wert entspricht.
$this->assertDatabaseCount('users', 5);
$this->assertDatabaseCount('users', 5);

assertDatabaseEmpty

Prüft, dass eine Tabelle leer ist.
$this->assertDatabaseEmpty('users');
$this->assertDatabaseEmpty('users');

assertDatabaseHas

Prüft, dass ein Datensatz existiert, der den angegebenen Kriterien entspricht.
$this->assertDatabaseHas('users', [
    'email' => '[email protected]',
]);
$this->assertDatabaseHas('users', [
    'email' => '[email protected]',
]);

assertDatabaseMissing

Prüft, dass kein Datensatz existiert, der den angegebenen Kriterien entspricht.
$this->assertDatabaseMissing('users', [
    'email' => '[email protected]',
]);
$this->assertDatabaseMissing('users', [
    'email' => '[email protected]',
]);

assertSoftDeleted

Prüft, dass das angegebene Eloquent-Modell soft-deleted ist.
$this->assertSoftDeleted($user);
$this->assertSoftDeleted($user);

assertNotSoftDeleted

Prüft, dass das angegebene Eloquent-Modell nicht soft-deleted ist.
$this->assertNotSoftDeleted($user);
$this->assertNotSoftDeleted($user);

assertModelExists

Prüft, dass das angegebene Modell (oder eine Model-Collection) in der Datenbank vorhanden ist.
<?php

use App\Models\User;

$user = User::factory()->create();

$this->assertModelExists($user);
<?php

use App\Models\User;

$user = User::factory()->create();

$this->assertModelExists($user);

assertModelMissing

Prüft, dass das angegebene Modell (oder eine Model-Collection) in der Datenbank nicht vorhanden ist.
<?php

use App\Models\User;

$user = User::factory()->create();
$user->delete();

$this->assertModelMissing($user);
<?php

use App\Models\User;

$user = User::factory()->create();
$user->delete();

$this->assertModelMissing($user);

expectsDatabaseQueryCount

Legen Sie zu Beginn eines Tests die exakte Anzahl der zu erwartenden Datenbankabfragen fest. Weicht die tatsächliche Zahl ab, schlägt der Test fehl.
$this->expectsDatabaseQueryCount(5);

// Test...
$this->expectsDatabaseQueryCount(5);

// Test...
Zuletzt geändert am 13. Juli 2026