Perché Pest è diventato il default di Laravel
Da Laravel 11 in poi, quando crei un progetto conlaravel new, Pest viene selezionato come framework di test predefinito. PHPUnit è stato per anni lo strumento standard per i test PHP, ma Pest si basa su PHPUnit offrendo una scrittura di test più concisa e leggibile.
Pest funziona sopra PHPUnit, quindi i test PHPUnit esistenti si eseguono così come sono. La migrazione può procedere gradualmente.
Differenze principali rispetto a PHPUnit
Scrittura del test
La differenza più evidente è il modo in cui si scrivono i test.- Pest
- PHPUnit
test() di Pest riceve una closure. Non serve definire classi o metodi e l’intento del test è chiaro fin dalla prima riga. Si può usare anche it(). In inglese si legge come una frase naturale: it('can login', ...).
API expect()
Il tratto distintivo di Pest sono le asserzioni in stile chain con expect().
expect($value)->toBe(), ->toBeNull(), ->toContain(), ->toHaveCount() e simili permettono di scrivere asserzioni che si leggono in modo naturale. Puoi anche concatenare più asserzioni.
Setup e teardown
Il corrispondente disetUp() di PHPUnit è beforeEach(), quello di tearDown() è afterEach().
Dataset — test table-driven
Se vuoi eseguire la stessa logica di test su più dati, usadataset.
'nessuna email', ecc.) vengono aggiunte al nome del test, così vedi a colpo d’occhio quale caso è fallito.
Test arch() — verifica automatica dell’architettura
arch() di Pest è un test che verifica la struttura della codebase. Puoi verificare automaticamente regole architetturali come “il controller non dipende direttamente dal modello” o “il modello estende Eloquent”.
laravel() verifica insieme regole conformi alle convenzioni tipiche di Laravel come naming dei modelli, ereditarietà dei controller e struttura dei middleware.
Esempi pratici in un progetto Laravel
Creazione del test
Usare gli helper di test di Laravel senza modifiche
Pest eredita ilTestCase di Laravel, quindi puoi usare così come sono tutti gli helper di test di Laravel come actingAs(), assertDatabaseHas() e gli helper di test HTTP.
Factory e transazioni database
Anche i traitRefreshDatabase o DatabaseTransactions si applicano facilmente con uses(). Scritto in cima al file si applica all’intero file.
tests/Pest.php, RefreshDatabase viene abilitato automaticamente per tutti i test Feature. Puoi anche sovrascriverlo nel singolo file di test.
Come convivere con i test PHPUnit esistenti
Pest e PHPUnit possono convivere nello stesso progetto. Non è necessario riscrivere i test PHPUnit esistenti: basta iniziare a scrivere i nuovi test in stile Pest.Da Laravel 11 in poi,
php artisan test usa automaticamente Pest se installato.Come procedere con la migrazione
- Aggiungi prima la configurazione di
uses()intests/Pest.php - Scrivi i nuovi test in stile Pest
- Migra gradualmente i test PHPUnit esistenti verificando il funzionamento
Conclusioni
Pest non è una sostituzione di PHPUnit, ma un layer superiore che lo avvolge. Ha un’integrazione profonda con Laravel, al punto da essere selezionato di default dallo starter kit. Il costo di introduzione nei progetti esistenti è basso e basta iniziare dai nuovi test per beneficiarne.
Aumentando la quantità di test scritti, si scoprono prima i bug e cala la barriera psicologica verso il refactoring. Pest è lo strumento che riduce “l’attrito stesso dello scrivere test”.
Documentazione ufficiale di Pest
Per tutte le funzionalità di Pest come dataset, coverage ed esecuzione parallela, consulta la documentazione ufficiale.