Cos’è il testing
Il testing è il meccanismo che verifica automaticamente che il codice funzioni come previsto. Scrivere test ti permette di verificare rapidamente che aggiungere o modificare funzionalità non rompa il comportamento esistente. Nello sviluppo in team i test danno sicurezza nel modificare il codice e nelle code review. Laravel supporta il testing fin dall’inizio: puoi usare sia Pest sia PHPUnit. Alla creazione del progetto trovi automaticamente il filephpunit.xml e la directory tests/.
Struttura della directory tests/
Feature/— Feature test: test di grande granularità che includono richieste HTTP. Verificano il funzionamento di più oggetti insieme o endpoint API, quindi test più vicini all’applicazione completa. La maggior parte dei test starà qui.Unit/— Unit test: test di piccola granularità per singola classe o metodo. L’applicazione Laravel non viene avviata, quindi non puoi usare database o altre funzionalità del framework.
Creazione di un test
Con il comando Artisanmake:test generi una nuova classe di test.
tests/Feature/TodoTest.php.
Esecuzione dei test
Esegui i test con il comandophp artisan test.
vendor/bin/pest o vendor/bin/phpunit per lo stesso risultato, ma php artisan test mostra un output più leggibile ed è consigliato.
Per eseguire solo una suite:
Come scrivere test base
Esempio di asserzioni semplici.Asserzioni più comuni
| Pest | PHPUnit | Descrizione |
|---|---|---|
expect($x)->toBe($y) | $this->assertSame($y, $x) | Uguali in senso stretto |
expect($x)->toEqual($y) | $this->assertEquals($y, $x) | Uguali (ignora il tipo) |
expect($x)->toBeTrue() | $this->assertTrue($x) | È true |
expect($x)->toBeFalse() | $this->assertFalse($x) | È false |
expect($x)->toBeNull() | $this->assertNull($x) | È null |
expect($x)->toContain($y) | $this->assertStringContainsString($y, $x) | Contiene la stringa |
expect($x)->toHaveCount($n) | $this->assertCount($n, $x) | Numero di elementi corretto |
Test HTTP
Con i test HTTP di Laravel puoi simulare richieste alle route senza avviare un vero server HTTP. È una funzionalità potente delle classi di test nella directoryFeature/.
Verifica della visualizzazione di una pagina
Conget() invii una richiesta GET e verifichi la response.
Esempio di test HTTP di un’app ToDo
Con un’app che ha il modelloTodo, testiamo le operazioni CRUD.
Asserzioni comuni sulle response
| Metodo | Descrizione |
|---|---|
assertStatus(200) | Verifica il codice HTTP della response |
assertOk() | Verifica che il codice sia 200 |
assertRedirect('/path') | Verifica il redirect all’URL |
assertSee('testo') | Verifica che il corpo della response contenga il testo |
assertDontSee('testo') | Verifica che il corpo non contenga il testo |
assertJson([...]) | Verifica i dati della response JSON |
assertDatabaseHas('table', [...]) | Verifica che il record esista nel DB |
assertDatabaseMissing('table', [...]) | Verifica che il record non esista nel DB |
Con il trait
RefreshDatabase il database viene resettato dopo ogni test. Serve a evitare che i dati interferiscano tra i test.Ambiente di test
Configurazione di phpunit.xml
Configura l’ambiente di test nel file phpunit.xml nella root del progetto.
Di default sessione e cache usano il driver array, così i dati non permangono tra i test.
File .env.testing
Creando .env.testing nella root del progetto, verrà usato al posto di .env durante i test.
Utile se vuoi separare connessioni al database o servizi esterni dedicati ai test.
Esecuzione parallela dei test
Con l’aumentare del numero di test cresce anche il tempo di esecuzione. Con l’opzione--parallel esegui i test su più processi contemporaneamente per ridurre i tempi.
Installa prima il pacchetto brianium/paratest.
--parallel.
--processes.
Prossimi passi
Test HTTP
Approfondisci simulazione delle richieste, test autenticati, asserzioni JSON e altri aspetti.