¿Qué son las pruebas?
Las pruebas son un mecanismo automatizado para verificar que el código funciona como se espera. Al escribirlas puedes comprobar rápidamente si los cambios rompen algo del comportamiento existente. En un equipo, tener pruebas da confianza para modificar y revisar el código. Laravel incluye soporte de pruebas de fábrica y admite tanto Pest como PHPUnit. Al instalar el proyecto ya vienen preparados el archivo de configuraciónphpunit.xml y el directorio tests/.
Estructura del directorio tests/
Feature/— Pruebas de funcionalidad. Sirven para pruebas de mayor tamaño que incluyen solicitudes HTTP. Cubren la integración entre varios objetos o endpoints de API. La mayoría de tus pruebas irán aquí.Unit/— Pruebas unitarias. Sirven para pruebas pequeñas de una clase o método. La aplicación Laravel no se arranca, así que no puedes usar la base de datos ni otras funcionalidades del framework.
Crear una prueba
Crea una nueva clase de prueba con el comando Artisanmake:test.
tests/Feature/TodoTest.php.
Ejecutar las pruebas
Ejecuta las pruebas conphp artisan test.
vendor/bin/pest o vendor/bin/phpunit directamente, pero php artisan test ofrece un formato de salida más legible.
Para ejecutar una suite concreta usa opciones.
Prueba básica
Ejemplo simple de aserciones.Aserciones habituales
| Pest | PHPUnit | Descripción |
|---|---|---|
expect($x)->toBe($y) | $this->assertSame($y, $x) | Estrictamente iguales |
expect($x)->toEqual($y) | $this->assertEquals($y, $x) | Iguales (sin importar el tipo) |
expect($x)->toBeTrue() | $this->assertTrue($x) | Es true |
expect($x)->toBeFalse() | $this->assertFalse($x) | Es false |
expect($x)->toBeNull() | $this->assertNull($x) | Es null |
expect($x)->toContain($y) | $this->assertStringContainsString($y, $x) | Contiene el string |
expect($x)->toHaveCount($n) | $this->assertCount($n, $x) | Número de elementos coincide |
Pruebas HTTP
Las pruebas HTTP de Laravel simulan solicitudes a rutas sin necesidad de arrancar un servidor real. Es una funcionalidad potente disponible en las pruebas deFeature/.
Comprobar que una página se muestra
Conget() envías una solicitud GET y verificas la respuesta.
Ejemplo de pruebas HTTP de una app ToDo
Con un modeloTodo, probamos cada operación CRUD.
Aserciones habituales de respuesta
| Método | Descripción |
|---|---|
assertStatus(200) | Verifica el código de estado HTTP |
assertOk() | Verifica que el código es 200 |
assertRedirect('/path') | Verifica la redirección a la URL indicada |
assertSee('texto') | Verifica que el cuerpo contiene el texto |
assertDontSee('texto') | Verifica que el cuerpo no contiene el texto |
assertJson([...]) | Verifica datos en una respuesta JSON |
assertDatabaseHas('table', [...]) | Verifica que un registro existe en la BD |
assertDatabaseMissing('table', [...]) | Verifica que un registro no existe en la BD |
El trait
RefreshDatabase reinicia la base de datos tras cada prueba. Sirve para evitar interferencias entre pruebas.Entorno de pruebas
Configuración de phpunit.xml
Configura el entorno de pruebas en phpunit.xml en la raíz.
Por defecto se usan drivers array para sesión y caché, evitando que queden datos entre pruebas.
Archivo .env.testing
Si creas .env.testing en la raíz, se lee en lugar de .env al ejecutar pruebas.
Es útil para separar la configuración de conexión o de servicios externos para pruebas.
Ejecución en paralelo
Cuando hay muchas pruebas, el tiempo se alarga. Con--parallel puedes ejecutar en varios procesos a la vez y reducir el tiempo.
Primero instala el paquete brianium/paratest.
--parallel.
--processes.
Próximos pasos
Pruebas HTTP
Aprende con más detalle a simular solicitudes, hacer pruebas con autenticación y aserciones JSON.