Passer au contenu principal

Introduction

Laravel intègre des outils pour tester en toute sécurité et rapidement les fonctionnalités reposant sur la base : trait de réinitialisation, factories, seeders, assertions dédiées. Combinés, ils produisent des tests robustes. Commencez par RefreshDatabase : dans la plupart des cas, il assure l’isolation plus vite qu’une réinitialisation complète.

Réinitialiser la base entre chaque test

Utilisez le trait Laravel pour empêcher les données d’un test d’influencer le suivant.
<?php

use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

test('exemple de base', 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 vérifie si le schéma est à jour. Si oui, il enveloppe la base dans une transaction ; sinon, il migre d’abord. Pour une réinitialisation complète à chaque test, utilisez :
TraitComportementCas d’usage
RefreshDatabaseTransaction si schéma à jour, sinon migrationPremier choix
DatabaseMigrationsMigration à chaque testPasser par le cycle complet de migration
DatabaseTruncationTRUNCATE des tablesSi les transactions ne conviennent pas

Model factories

Utilisez les factories pour générer des modèles rapidement. Voir Factories Eloquent pour les détails.
<?php

use App\Models\User;

test('peut créer un modèle', 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);
    }
}

Exécuter les seeders

Utilisez seed() pour peupler la base. Sans argument, il exécute DatabaseSeeder ; avec un argument, un seeder ou tableau spécifique.
<?php

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

uses(RefreshDatabase::class);

test('crée une commande', 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,
        ]);

        // ...
    }
}
Pour seeder automatiquement dans tous les tests utilisant RefreshDatabase, ajoutez l’attribut #[Seed] à la classe de base.
<?php

namespace Tests;

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

#[Seed]
abstract class TestCase extends BaseTestCase
{
}
Pour un seeder précis, utilisez #[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;
}

Assertions disponibles

Laravel fournit des assertions dédiées à la base, utilisables avec Pest et PHPUnit.

assertDatabaseCount

Vérifie le nombre d’enregistrements dans une table.
$this->assertDatabaseCount('users', 5);
$this->assertDatabaseCount('users', 5);

assertDatabaseEmpty

Vérifie qu’une table est vide.
$this->assertDatabaseEmpty('users');
$this->assertDatabaseEmpty('users');

assertDatabaseHas

Vérifie qu’un enregistrement correspondant existe.
$this->assertDatabaseHas('users', [
    'email' => '[email protected]',
]);
$this->assertDatabaseHas('users', [
    'email' => '[email protected]',
]);

assertDatabaseMissing

Vérifie qu’aucun enregistrement ne correspond.
$this->assertDatabaseMissing('users', [
    'email' => '[email protected]',
]);
$this->assertDatabaseMissing('users', [
    'email' => '[email protected]',
]);

assertSoftDeleted

Vérifie qu’un modèle Eloquent est soft-deleted.
$this->assertSoftDeleted($user);
$this->assertSoftDeleted($user);

assertNotSoftDeleted

Vérifie qu’un modèle Eloquent n’est pas soft-deleted.
$this->assertNotSoftDeleted($user);
$this->assertNotSoftDeleted($user);

assertModelExists

Vérifie qu’un modèle (ou une collection) existe en base.
<?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

Vérifie qu’un modèle (ou une collection) n’existe pas en base.
<?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

Fixe précisément le nombre total de requêtes DB à exécuter. Échec si divergence.
$this->expectsDatabaseQueryCount(5);

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

// Test...
Dernière modification le 13 juillet 2026