Estamos actualizando el sitio. Durante unos días es posible que veas fallos de diseño o de traducción. La documentación sigue disponible: si una página se ve mal, recárgala más tarde.

Inicio Laravel 10.x Pruebas de Base de Datos

Pruebas de Base de Datos

10.x 7 de mar. de 2026

#Introducción

Laravel ofrece una variedad de herramientas y aserciones útiles para facilitar las pruebas de sus aplicaciones basadas en bases de datos. Además, las factories de modelos y los seeders de Laravel hacen que sea sencillo crear registros de prueba en la base de datos utilizando los modelos Eloquent y sus relaciones de su aplicación. Discutiremos todas estas potentes características en la siguiente documentación.

#Restablecer la base de datos después de cada prueba

Antes de continuar, hablemos de cómo restablecer su base de datos después de cada prueba para que los datos de una prueba anterior no interfieran con las pruebas siguientes. El trait Illuminate\Foundation\Testing\RefreshDatabase incluido en Laravel se encargará de esto por usted. Simplemente use el trait en su clase de prueba:

<?php

namespace Tests\Feature;

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

class ExampleTest extends TestCase
{
    use RefreshDatabase;

    /**
     * Un ejemplo básico de prueba funcional.
     */
    public function test_basic_example(): void
    {
        $response = $this->get('/');

        // ...
    }
}

El trait Illuminate\Foundation\Testing\RefreshDatabase no migra su base de datos si su esquema está actualizado. En su lugar, solo ejecutará la prueba dentro de una transacción de base de datos. Por lo tanto, cualquier registro agregado a la base de datos por casos de prueba que no usen este trait puede seguir existiendo en la base de datos.

Si desea restablecer completamente la base de datos, puede usar los traits Illuminate\Foundation\Testing\DatabaseMigrations o Illuminate\Foundation\Testing\DatabaseTruncation. Sin embargo, ambas opciones son significativamente más lentas que el trait RefreshDatabase.

#Factories de Modelos

Al realizar pruebas, puede que necesite insertar algunos registros en su base de datos antes de ejecutar la prueba. En lugar de especificar manualmente el valor de cada columna al crear estos datos de prueba, Laravel le permite definir un conjunto de atributos predeterminados para cada uno de sus modelos Eloquent usando factories de modelos.

Para aprender más sobre cómo crear y utilizar factories de modelos para crear modelos, consulte la documentación completa de factories de modelos. Una vez que haya definido una factory, puede usarla dentro de su prueba para crear modelos:

use App\Models\User;

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

    // ...
}

#Ejecutar Seeders

Si desea usar seeders de base de datos para poblar su base de datos durante una prueba funcional, puede invocar el método seed. Por defecto, el método seed ejecutará el DatabaseSeeder, que debería ejecutar todos sus otros seeders. Alternativamente, puede pasar el nombre de una clase seeder específica al método seed:

<?php

namespace Tests\Feature;

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

class ExampleTest extends TestCase
{
    use RefreshDatabase;

    /**
     * Probar la creación de una nueva orden.
     */
    public function test_orders_can_be_created(): void
    {
        // Ejecutar el DatabaseSeeder...
        $this->seed();

        // Ejecutar un seeder específico...
        $this->seed(OrderStatusSeeder::class);

        // ...

        // Ejecutar un array de seeders específicos...
        $this->seed([
            OrderStatusSeeder::class,
            TransactionStatusSeeder::class,
            // ...
        ]);
    }
}

Alternativamente, puede indicar a Laravel que ejecute automáticamente el seeder antes de cada prueba que use el trait RefreshDatabase. Puede lograr esto definiendo una propiedad $seed en su clase base de prueba:

<?php

namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication;

    /**
     * Indica si el seeder por defecto debe ejecutarse antes de cada prueba.
     *
     * @var bool
     */
    protected $seed = true;
}

Cuando la propiedad $seed es true, la prueba ejecutará la clase Database\Seeders\DatabaseSeeder antes de cada prueba que use el trait RefreshDatabase. Sin embargo, puede especificar un seeder específico que se debe ejecutar definiendo una propiedad $seeder en su clase de prueba:

use Database\Seeders\OrderStatusSeeder;

/**
 * Ejecutar un seeder específico antes de cada prueba.
 *
 * @var string
 */
protected $seeder = OrderStatusSeeder::class;

#Aserciones disponibles

Laravel proporciona varias aserciones de base de datos para sus pruebas funcionales con PHPUnit. Discutiremos cada una de estas aserciones a continuación.

#assertDatabaseCount

Asegura que una tabla en la base de datos contenga el número dado de registros:

$this->assertDatabaseCount('users', 5);

#assertDatabaseHas

Asegura que una tabla en la base de datos contenga registros que coincidan con las restricciones de consulta clave/valor dadas:

$this->assertDatabaseHas('users', [
    'email' => 'sally@example.com',
]);

#assertDatabaseMissing

Asegura que una tabla en la base de datos no contenga registros que coincidan con las restricciones de consulta clave/valor dadas:

$this->assertDatabaseMissing('users', [
    'email' => 'sally@example.com',
]);

#assertSoftDeleted

El método assertSoftDeleted puede usarse para asegurar que un modelo Eloquent dado ha sido "soft deleted":

$this->assertSoftDeleted($user);

#assertNotSoftDeleted

El método assertNotSoftDeleted puede usarse para asegurar que un modelo Eloquent dado no ha sido "soft deleted":

$this->assertNotSoftDeleted($user);

#assertModelExists

Asegura que un modelo dado existe en la base de datos:

use App\Models\User;

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

$this->assertModelExists($user);

#assertModelMissing

Asegura que un modelo dado no existe en la base de datos:

use App\Models\User;

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

$user->delete();

$this->assertModelMissing($user);

#expectsDatabaseQueryCount

El método expectsDatabaseQueryCount puede invocarse al inicio de su prueba para especificar el número total de consultas a la base de datos que espera que se ejecuten durante la prueba. Si el número real de consultas ejecutadas no coincide exactamente con esta expectativa, la prueba fallará:

$this->expectsDatabaseQueryCount(5);

// Prueba...