> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Tests de base de données

> Écrivez des tests DB efficaces avec RefreshDatabase, seeders, factories et assertions dédiées.

## 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.

<CodeGroup>
  ```php Pest theme={null}
  <?php

  use Illuminate\Foundation\Testing\RefreshDatabase;

  uses(RefreshDatabase::class);

  test('exemple de base', function () {
      $response = $this->get('/');

      $response->assertOk();
  });
  ```

  ```php PHPUnit theme={null}
  <?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();
      }
  }
  ```
</CodeGroup>

`RefreshDatabase` vérifie si le schéma est à jour. Si oui, il enveloppe la base dans une transaction ; sinon, il migre d'abord.

```mermaid theme={null}
flowchart TD
    A[Test avec RefreshDatabase] --> B{Schéma à jour ?}
    B -- Oui --> C[Transaction DB]
    B -- Non --> D[Migration]
    D --> E[Exécution du test]
    C --> E[Exécution du test]
    E --> F[Rollback / reset]
```

Pour une réinitialisation complète à chaque test, utilisez :

| Trait                | Comportement                                  | Cas d'usage                              |
| -------------------- | --------------------------------------------- | ---------------------------------------- |
| `RefreshDatabase`    | Transaction si schéma à jour, sinon migration | Premier choix                            |
| `DatabaseMigrations` | Migration à chaque test                       | Passer par le cycle complet de migration |
| `DatabaseTruncation` | TRUNCATE des tables                           | Si les transactions ne conviennent pas   |

## Model factories

Utilisez les factories pour générer des modèles rapidement.

Voir [Factories Eloquent](/fr/eloquent-factories) pour les détails.

<CodeGroup>
  ```php Pest theme={null}
  <?php

  use App\Models\User;

  test('peut créer un modèle', function () {
      $user = User::factory()->create();

      expect($user->exists)->toBeTrue();
  });
  ```

  ```php PHPUnit theme={null}
  <?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);
      }
  }
  ```
</CodeGroup>

## 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.

<CodeGroup>
  ```php Pest theme={null}
  <?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 PHPUnit theme={null}
  <?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,
          ]);

          // ...
      }
  }
  ```
</CodeGroup>

Pour seeder automatiquement dans tous les tests utilisant `RefreshDatabase`, ajoutez l'attribut `#[Seed]` à la classe de base.

```php theme={null}
<?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 theme={null}
<?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.

<CodeGroup>
  ```php Pest theme={null}
  $this->assertDatabaseCount('users', 5);
  ```

  ```php PHPUnit theme={null}
  $this->assertDatabaseCount('users', 5);
  ```
</CodeGroup>

### `assertDatabaseEmpty`

Vérifie qu'une table est vide.

<CodeGroup>
  ```php Pest theme={null}
  $this->assertDatabaseEmpty('users');
  ```

  ```php PHPUnit theme={null}
  $this->assertDatabaseEmpty('users');
  ```
</CodeGroup>

### `assertDatabaseHas`

Vérifie qu'un enregistrement correspondant existe.

<CodeGroup>
  ```php Pest theme={null}
  $this->assertDatabaseHas('users', [
      'email' => 'sally@example.com',
  ]);
  ```

  ```php PHPUnit theme={null}
  $this->assertDatabaseHas('users', [
      'email' => 'sally@example.com',
  ]);
  ```
</CodeGroup>

### `assertDatabaseMissing`

Vérifie qu'aucun enregistrement ne correspond.

<CodeGroup>
  ```php Pest theme={null}
  $this->assertDatabaseMissing('users', [
      'email' => 'sally@example.com',
  ]);
  ```

  ```php PHPUnit theme={null}
  $this->assertDatabaseMissing('users', [
      'email' => 'sally@example.com',
  ]);
  ```
</CodeGroup>

### `assertSoftDeleted`

Vérifie qu'un modèle Eloquent est soft-deleted.

<CodeGroup>
  ```php Pest theme={null}
  $this->assertSoftDeleted($user);
  ```

  ```php PHPUnit theme={null}
  $this->assertSoftDeleted($user);
  ```
</CodeGroup>

### `assertNotSoftDeleted`

Vérifie qu'un modèle Eloquent n'est pas soft-deleted.

<CodeGroup>
  ```php Pest theme={null}
  $this->assertNotSoftDeleted($user);
  ```

  ```php PHPUnit theme={null}
  $this->assertNotSoftDeleted($user);
  ```
</CodeGroup>

### `assertModelExists`

Vérifie qu'un modèle (ou une collection) existe en base.

<CodeGroup>
  ```php Pest theme={null}
  <?php

  use App\Models\User;

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

  $this->assertModelExists($user);
  ```

  ```php PHPUnit theme={null}
  <?php

  use App\Models\User;

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

  $this->assertModelExists($user);
  ```
</CodeGroup>

### `assertModelMissing`

Vérifie qu'un modèle (ou une collection) n'existe pas en base.

<CodeGroup>
  ```php Pest theme={null}
  <?php

  use App\Models\User;

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

  $this->assertModelMissing($user);
  ```

  ```php PHPUnit theme={null}
  <?php

  use App\Models\User;

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

  $this->assertModelMissing($user);
  ```
</CodeGroup>

### `expectsDatabaseQueryCount`

Fixe précisément le nombre total de requêtes DB à exécuter. Échec si divergence.

<CodeGroup>
  ```php Pest theme={null}
  $this->expectsDatabaseQueryCount(5);

  // Test...
  ```

  ```php PHPUnit theme={null}
  $this->expectsDatabaseQueryCount(5);

  // Test...
  ```
</CodeGroup>


## Related topics

- [Seeding de base de données](/fr/seeding.md)
- [Configuration de la base de données](/fr/database.md)
- [Migrations de base de données](/fr/migrations.md)
- [Tests de navigateur (Dusk)](/fr/dusk.md)
- [Tester des packages Laravel avec Orchestra Testbench](/fr/advanced/package-testing.md)
