Prologo
Primi Passi
Architettura
Le Basi
- Routing
- Middleware
- Protezione da CSRF
- Controller
- Richieste
- Risposte
- Views
- Blade
- Vite
- URL
- Sessioni
- Validazione
- Errori
- Logging
Approfondimenti
- Artisan
- Broadcasting
- Cache
- Collezioni
- Concorrenza
- Contesto
- Contratti
- Eventi
- File System
- Helpers
- Client HTTP
- Localizzazione
- Notifiche
- Sviluppo di Package
- Processi
- Code
- Rate-limiting
- Stringhe
- Scheduling di Task
Sicurezza
Database
Eloquent ORM
Testing
Package
Testing
Introduzione
Laravel è costruito pensando ai test. Infatti, il supporto per i test con Pest e PHPUnit è incluso di serie e un file phpunit.xml
è già configurato per la tua applicazione. Il framework include anche metodi helper utili che ti permettono di testare in modo chiaro le tue applicazioni.
Per impostazione predefinita, la directory tests
della tua applicazione contiene due cartelle: Feature
e Unit
. I test unitari si concentrano su una porzione molto piccola e isolata del tuo codice. In effetti, la maggior parte dei test unitari probabilmente si focalizza su un singolo metodo. I test nella cartella "Unit" non avviano l’applicazione Laravel e quindi non possono accedere al database della tua applicazione o ad altri servizi del framework.
I test di funzionalità possono verificare una porzione più ampia del tuo codice, inclusa l’interazione di diversi oggetti tra loro o anche una richiesta HTTP completa a un endpoint JSON. In generale, la maggior parte dei tuoi test dovrebbe essere di tipo feature. Questi tipi di test offrono la maggiore certezza che il tuo sistema nel suo complesso funzioni come previsto.
Un file ExampleTest.php
è fornito sia nelle cartelle Feature
che Unit
dei test. Dopo aver installato una nuova applicazione Laravel, esegui i comandi vendor/bin/pest
, vendor/bin/phpunit
o php artisan test
per eseguire i tuoi test.
Environment
Durante l’esecuzione dei test, Laravel imposterà automaticamente l’ambiente di configurazione su testing
grazie alle variabili d’ambiente definite nel file phpunit.xml
. Laravel configura inoltre automaticamente la sessione e la cache sul driver array
in modo che nessun dato di sessione o cache venga salvato durante i test.
Puoi definire altri valori di configurazione per l’ambiente di testing secondo necessità. Le variabili d’ambiente testing
possono essere configurate nel file phpunit.xml
della tua applicazione, ma assicurati di svuotare la cache di configurazione usando il comando Artisan config:clear
prima di eseguire i tuoi test!
Il file di ambiente .env.testing
Inoltre, puoi creare un file .env.testing
nella radice del tuo progetto. Questo file sarà usato al posto del file .env
quando esegui test con Pest e PHPUnit o comandi Artisan con l’opzione --env=testing
.
Creare i Test
Per creare un nuovo caso di test, usa il comando Artisan make:test
. Di default, i test saranno posizionati nella directory tests/Feature
:
php artisan make:test UserTest
Se vuoi creare un test all’interno della directory tests/Unit
, puoi usare l’opzione --unit
quando esegui il comando make:test
:
php artisan make:test UserTest --unit
Gli stub dei test possono essere personalizzati usando la pubblicazione degli stub.
Una volta che il test è stato generato, puoi definire i test come fai normalmente usando Pest o PHPUnit. Per eseguire i test, esegui i comandi vendor/bin/pest
, vendor/bin/phpunit
o php artisan test
dal tuo terminale:
<?php
test('basic', function () {
expect(true)->toBeTrue();
});
<?php
namespace Tests\Unit;
use PHPUnit\Framework\TestCase;
class ExampleTest extends TestCase
{
/**
* Un esempio di test di base.
*/
public function test_basic_test(): void
{
$this->assertTrue(true);
}
}
Se definisci i tuoi metodi
setUp
/tearDown
all’interno di una classe di test, assicurati di chiamare i metodiparent::setUp()
/parent::tearDown()
della classe genitore. Generalmente, dovresti invocareparent::setUp()
all’inizio del tuo metodosetUp
eparent::tearDown()
alla fine del tuo metodotearDown
.
Eseguire i Test
Come menzionato in precedenza, una volta scritti i test, puoi eseguirli usando pest
o phpunit
:
./vendor/bin/pest
./vendor/bin/phpunit
Oltre ai comandi pest
o phpunit
, puoi usare il comando Artisan test
per eseguire i tuoi test. Il test runner di Artisan fornisce report dettagliati per facilitare lo sviluppo e il debug:
php artisan test
Qualsiasi argomento che può essere passato ai comandi pest
o phpunit
può essere passato anche al comando Artisan test
:
php artisan test --testsuite=Feature --stop-on-failure
Eseguire i Test in Parallelo
Per impostazione predefinita, Laravel e Pest / PHPUnit eseguono i tuoi test in sequenza all’interno di un singolo processo. Tuttavia, puoi ridurre notevolmente il tempo necessario per eseguire i test eseguendoli simultaneamente su più processi. Per iniziare, dovresti installare il pacchetto brianium/paratest
come dipendenza "dev" tramite Composer. Poi, includi l’opzione --parallel
quando esegui il comando test
di Artisan:
composer require brianium/paratest --dev
php artisan test --parallel
Per impostazione predefinita, Laravel creerà un numero di processi pari ai core CPU disponibili sulla tua macchina. Tuttavia, puoi modificare il numero di processi usando l’opzione --processes
:
php artisan test --parallel --processes=4
Quando esegui i test in parallelo, alcune opzioni di Pest / PHPUnit (come
--do-not-cache-result
) potrebbero non essere disponibili.
Test paralleli e database
Finché hai configurato una connessione al database principale, Laravel gestisce automaticamente la creazione e la migrazione di un database di test per ogni processo parallelo che esegue i tuoi test. I database di test avranno un suffisso con un token di processo unico per ogni processo. Ad esempio, se hai due processi di test paralleli, Laravel creerà e utilizzerà i database di test your_db_test_1
e your_db_test_2
.
Per impostazione predefinita, i database di test persistono tra le chiamate al comando Artisan test
in modo che possano essere riutilizzati dalle successive invocazioni di test
. Tuttavia, puoi ricrearli usando l’opzione --recreate-databases
:
php artisan test --parallel --recreate-databases
Parallel Testing Hooks
Occasionalmente, potrebbe essere necessario preparare determinate risorse utilizzate dai test della tua applicazione in modo che possano essere utilizzate in sicurezza da più processi di test.
Usando la facade ParallelTesting
, puoi specificare del codice da eseguire durante il setUp
e tearDown
di un processo o di un caso di test. Le chiusure fornite ricevono le variabili $token
e $testCase
che contengono rispettivamente il token del processo e il caso di test corrente:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\ParallelTesting;
use Illuminate\Support\ServiceProvider;
use PHPUnit\Framework\TestCase;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*/
public function boot(): void
{
ParallelTesting::setUpProcess(function (int $token) {
// ...
});
ParallelTesting::setUpTestCase(function (int $token, TestCase $testCase) {
// ...
});
// Executed when a test database is created...
ParallelTesting::setUpTestDatabase(function (string $database, int $token) {
Artisan::call('db:seed');
});
ParallelTesting::tearDownTestCase(function (int $token, TestCase $testCase) {
// ...
});
ParallelTesting::tearDownProcess(function (int $token) {
// ...
});
}
}
Accesso al Token per i Test Paralleli
Se desideri accedere al "token" del processo parallelo corrente da qualsiasi altra parte nel codice dei test della tua applicazione, puoi usare il metodo token
. Questo token è un identificatore univoco, di tipo stringa, per un singolo processo di test e può essere utilizzato per suddividere le risorse tra i processi di test paralleli. Ad esempio, Laravel aggiunge automaticamente questo token alla fine dei database di test creati da ogni processo di test parallelo:
$token = ParallelTesting::token();
Reporting della Copertura dei Test
Quando esegui i test della tua applicazione, potresti voler determinare se i tuoi casi di test stanno effettivamente coprendo il codice dell’applicazione e quanto codice viene utilizzato durante l’esecuzione dei test. Per fare ciò, puoi fornire l’opzione --coverage
quando esegui il comando test
:
php artisan test --coverage
Applicare una Soglia Minima di Copertura
Puoi usare l’opzione --min
per definire una soglia minima di copertura dei test per la tua applicazione. La suite di test fallirà se questa soglia non viene raggiunta:
php artisan test --coverage --min=80.3
Profilazione dei Test
Il test runner di Artisan offre anche un meccanismo comodo per elencare i test più lenti della tua applicazione. Esegui il comando test
con l’opzione --profile
per ottenere una lista dei dieci test più lenti, permettendoti di individuare facilmente quali test possono essere migliorati per velocizzare la tua suite di test:
php artisan test --profile