En esta nueva lección del Curso de Laravel desde cero vamos a aprender a configurar y ejecutar operaciones de bases de datos en el entorno de pruebas automatizadas (PHPUnit). Para ello seguiremos una serie de pasos: crearemos una base de datos adicional para el entorno de pruebas automatizadas, veremos cómo ejecutar automáticamente las migraciones de base de datos desde nuestras pruebas y cómo ejecutar las pruebas en un entorno aislado para obtener los resultados esperados.

Repositorio

Ver el código de esta lección en GitHub

Suscríbete a nuestro boletín

Te enviaremos publicaciones con consejos útiles y múltiples recursos para que sigas aprendiendo.

Base de datos para pruebas automatizadas

Asegúrate de estar utilizando el motor InnoDB en la base de datos MySQL para que las pruebas se puedan ejecutar dentro de transacciones de base de datos.

Podemos tener dos bases de datos, una para interactuar con nuestra aplicación en el navegador y otra para las pruebas que vayamos a ejecutar. De esta forma la ejecución de las pruebas automatizadas no afectará nuestra interacción con la aplicación en local y viceversa.

Pasos para configurar la base de datos para pruebas automatizadas:

Configura las variables de entorno en phpunit

En el archivo phpunit.xml, vamos sobrescribir la variable que utiliza Laravel para leer el nombre de la base de datos por defecto. Esto lo hacemos agregando una variable de entorno. En la propiedad name indicamos el nombre de la variable de entorno (DB_DATABASE) y en la propiedad value indicamos el nombre de la base de datos que queremos utilizar para las pruebas (en nuestro ejemplo es curso_styde_tests):

<env name="DB_DATABASE" value="curso_styde_tests"/>

Crea la nueva base de datos

Por supuesto necesitarás crear esta nueva base de datos (por ejemplo, curso_styde_tests). Para ello puedes hacerlo desde la consola o con el administrador de base de datos que prefieras (PHPMyAdmin, Sequel Pro, entre otros).

Usa el trait RefreshDatabase

Incluye el trait RefreshDatabase en cada una de las pruebas que vaya a interactuar con la base de datos. De esta manera, Laravel ejecutará las migraciones de la base de datos antes de ejecutar las pruebas. Además ejecutará cada prueba dentro de una transacción de la base de datos que será revertida después de ejecutar cada método de prueba. De esta forma evitamos tener que migrar manualmente la base de datos y preocuparnos por datos que podrían «contaminar» el estado de cada una de nuestras pruebas:

class UsersModuleTest extends TestCase
{
    use RefreshDatabase;

    // ...

Para poder usarlo, debemos importar el trait al principio del archivo:

use Illuminate\Foundation\Testing\RefreshDatabase;

Utilizando RefreshDatabase las pruebas se ejecutan en transacciones de la base de datos, es decir, cada vez que se ejecuta una prueba la base de datos vuelve a su estado original al finalizar la prueba. Debido a esto, en nuestro ejemplo ambas pruebas van a pasar, a pesar de que en it_shows_users_list() estamos creando dos usuarios y luego en la siguiente prueba comprobamos que no existan usuarios en la base de datos:

function it_shows_the_users_list()
{
    factory(User::class)->create([
        'name' => 'Joel'
    ]);

    factory(User::class)->create([
        'name' => 'Ellie'
    ]);

    // ...
}

function it_shows_a_default_message_if_the_users_list_is_empty()
{
    $this->get('/usuarios')
        ->assertStatus(200)
        ->assertSee('No hay usuarios registrados.');
}

Material relacionado

Únete a nuestra comunidad en Discord y comparte con los usuarios y autores de Styde, 100% gratis.

Únete hoy

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Listado dinámico de Usuarios con Laravel (Módulo CRUD) Lección siguiente Detalles o Perfil de Usuario con Laravel (Módulo CRUD)