¿Por qué Pest pasó a ser el valor por defecto en Laravel?
Desde Laravel 11, al crear un proyecto conlaravel new, Pest se selecciona como framework de testing por defecto. PHPUnit se ha usado durante años como herramienta de testing estándar de PHP, pero Pest se apoya en PHPUnit y ofrece una notación de tests más concisa y legible.
Como Pest se ejecuta sobre PHPUnit, los tests PHPUnit existentes pueden ejecutarse tal cual. La migración se puede hacer de forma progresiva.
Diferencias principales con PHPUnit
Notación de los tests
La diferencia más evidente es la forma de escribir los tests.- Pest
- PHPUnit
test() de Pest recibe un closure. Al no necesitar definir clase ni método, la intención del test queda clara desde la primera línea. it() se puede usar de la misma manera. Cuando se escribe en inglés, se lee como una frase natural: it('can login', ...).
API expect()
La mayor característica de Pest es la aserción en formato encadenado con expect().
expect($value)->toBe(), ->toBeNull(), ->toContain(), ->toHaveCount(), etc. También puedes agrupar varias aserciones con encadenamiento de métodos.
Setup y teardown
El equivalente asetUp() de PHPUnit es beforeEach(), y el de tearDown() es afterEach().
Datasets — tests table-driven
Para ejecutar la misma lógica de test con varios datos, se usadataset.
'sin email', etc.) se añade al nombre del test, sabes de un vistazo con qué patrón ha fallado.
Tests arch() — Comprobación automática de la arquitectura
arch() de Pest son tests que verifican la estructura del código base. Puedes verificar automáticamente reglas de arquitectura como “los controladores no dependen directamente de los modelos” o “los modelos heredan de Eloquent”.
laravel() verifica en bloque reglas alineadas con las convenciones habituales de Laravel: nombrado de modelos, herencia de controladores, estructura de middleware, etc.
Ejemplos prácticos en un proyecto Laravel
Crear tests
Usar los helpers de test de Laravel tal cual
Como Pest hereda delTestCase de Laravel, puedes usar tal cual todos los helpers de test de Laravel: actingAs(), assertDatabaseHas(), los helpers de tests HTTP, etc.
Factories y transacciones de base de datos
También puedes aplicar fácilmente los traitsRefreshDatabase o DatabaseTransactions con uses(). Si lo pones al principio del archivo, se aplica a todo el archivo.
tests/Pest.php, RefreshDatabase se activa automáticamente en todos los tests Feature. También se puede sobrescribir en archivos de test individuales.
Cómo convivir con tests PHPUnit existentes
Pest y PHPUnit pueden convivir en el mismo proyecto. No es necesario reescribir los tests PHPUnit existentes; basta con empezar a escribir los tests nuevos en formato Pest.Desde Laravel 11, si Pest está instalado,
php artisan test ejecuta automáticamente con Pest.Cómo abordar la migración
- Primero añade la configuración de
uses()entests/Pest.php - Escribe los nuevos tests en formato Pest
- Ve migrando los tests PHPUnit existentes poco a poco, comprobando su funcionamiento
Conclusión
Pest no es un reemplazo de PHPUnit, sino una capa superior que envuelve a PHPUnit. La integración con Laravel también es profunda, hasta el punto de que se selecciona por defecto al generar los starter kits. El coste de introducción en proyectos existentes es bajo, y solo con probar a escribir los nuevos tests con Pest ya obtienes beneficios.
Cuando aumenta la cantidad de tests escritos, se detectan antes los bugs y baja la barrera psicológica para refactorizar. Pest es una herramienta para reducir “la fricción de escribir tests” en sí.
Documentación oficial de Pest
Para todas las funciones de Pest (datasets, cobertura, ejecución en paralelo, etc.), consulta la documentación oficial.