Skip to main content

Cos’è Pest

Pest è un framework di test costruito sopra PHPUnit; nei nuovi progetti Laravel 11 e successivi è adottato per default. Puoi riutilizzare tutte le assertion di PHPUnit scrivendo però test con una sintassi concisa basata su closure. Differenze principali con PHPUnit:
I test Pest vengono eseguiti da PHPUnit, quindi coesistono con i test PHPUnit esistenti. Esegui con php artisan test o vendor/bin/pest.

Quando usare describe / it / test

test()

Definizione più semplice. Il nome del test è la sua descrizione.

it()

Sintassi “it should…” in stile inglese, più vicina al linguaggio naturale.

describe()

Raggruppa test correlati. Utile per condividere beforeEach() e organizzare logicamente il file.
describe() può essere annidato, ma nesting troppo profondi rendono i test difficili da leggere. Rimani su un massimo di 2 livelli.

Expectation API

expect() è la sintassi di assertion specifica di Pest. Puoi concatenare le condizioni.

Assertion di base

Assertion su modelli

Chain and()

each() per validare ogni elemento di un array

Test parametrici con i dataset

Per testare la stessa logica con più input usa dataset() o l’inline with().

Dataset inline

Dataset con nome

Definisci i dataset nella directory tests/Datasets.

Dataset dinamico con closure

Test unitari con Mockery

Mock di un servizio

Spy

Uno spy, a differenza di un mock, chiama l’implementazione reale registrando comunque le chiamate.

Mock parziale

Mocka solo alcuni metodi, gli altri usano l’implementazione reale.

Test di chiamate API esterne con HTTP fake

Con Http::fake() stubbi le risposte senza inviare richieste HTTP reali.

Fake di base

Test di risposte di errore

Simulazione di errori di rete

Fake di eventi, email e notifiche

Event::fake()

Puoi fakeare solo eventi specifici lasciando gli altri normali.

Mail::fake()

Notification::fake()

Test dei comandi Artisan

Test di comandi interattivi

RefreshDatabase e LazilyRefreshDatabase

RefreshDatabase

Dopo ogni test fa rollback del database, mantenendolo pulito. All’avvio della test suite esegue la migrazione.

LazilyRefreshDatabase

Con RefreshDatabase la migrazione viene verificata in tutti i test; con LazilyRefreshDatabase viene rimandata finché un test non modifica effettivamente il DB. Se hai molti test che non toccano il DB, velocizza la suite.
Per la maggior parte dei progetti, RefreshDatabase è la scelta sicura. Valuta LazilyRefreshDatabase se la test suite è grande e molti test non usano il DB.

Misurare la code coverage

Servono Xdebug o PCOV.
La misurazione della code coverage aumenta molto il tempo di esecuzione dei test. In CI consigliamo di separarla in un job dedicato o di eseguirla solo sulle pull request.

Pagine correlate

Introduzione ai test

Rivedi le basi dei test in Laravel e l’uso di php artisan test.
Ultima modifica il 13 luglio 2026