Skip to main content

Qué es Pest

Pest es un framework de tests construido sobre PHPUnit que se adopta por defecto en los proyectos nuevos desde Laravel 11. Aprovecha todas las aserciones de PHPUnit y añade una sintaxis concisa basada en closures. Principales diferencias con PHPUnit:
Como los tests de Pest se ejecutan sobre PHPUnit, pueden convivir con tests PHPUnit existentes. Los ejecutas con php artisan test o vendor/bin/pest.

Cuándo usar describe / it / test

test()

La definición más sencilla. Usa el nombre del test como su descripción.

it()

Permite un estilo cercano al lenguaje natural, tipo «it should…».

describe()

Agrupa tests relacionados. Útil para compartir beforeEach() y organizar lógicamente los archivos.
describe() admite anidamiento, pero un anidamiento excesivo dificulta la lectura. Como regla general, no pases de dos niveles.

Expectation API

expect() es la sintaxis de aserción propia de Pest. Permite encadenar condiciones.

Aserciones básicas

Aserciones sobre modelos

Cadena con and()

Verificar cada elemento con each()

Tests parametrizados con datasets

Para probar la misma lógica con varios valores, usa dataset() o with() en línea.

Dataset en línea

Dataset con nombre

Define datasets en el directorio tests/Datasets.

Dataset dinámico con closures

Tests unitarios con Mockery

Mockear un servicio

Spy

Un spy ejecuta la implementación real y registra las llamadas.

Mock parcial

Se mockean solo algunos métodos y el resto se usa con la implementación real.

Pruebas de llamadas a APIs externas con HTTP fake

Con Http::fake() puedes hacer stub de las respuestas sin enviar peticiones reales.

Fake básico

Probar respuestas de error

Simular fallos de red

Fakes de eventos, correos y notificaciones

Event::fake()

También puedes falsear solo algunos eventos y dejar que los demás se procesen normalmente.

Mail::fake()

Notification::fake()

Pruebas de comandos Artisan

Comandos interactivos

RefreshDatabase y LazilyRefreshDatabase

RefreshDatabase

Hace rollback de la BD tras cada test para mantenerla limpia. Ejecuta las migraciones al inicio del test suite.

LazilyRefreshDatabase

RefreshDatabase comprueba migraciones en todos los tests, pero LazilyRefreshDatabase las difiere hasta que un test toca de verdad la BD. Acelera los suites con muchos tests que no usan BD.
Para la mayoría de proyectos, RefreshDatabase es la opción segura. Considera LazilyRefreshDatabase cuando el suite es grande y muchos tests no tocan la BD.

Medición de cobertura de código

Requiere Xdebug o PCOV.
La medición de cobertura aumenta mucho el tiempo de ejecución. En CI, es recomendable separarla en un job específico o ejecutarla solo en las pull requests.

Páginas relacionadas

Introducción a los tests

Consulta la forma estándar de escribir tests en Laravel y el uso de php artisan test.
Última modificación el 13 de julio de 2026