Test automatici
I test automatici sono obbligatori per tutti i servizi e le facades di alto e medio livello che:
- Vengono invocati direttamente da controller, listeners o jobs
- Orchestrano altri servizi più atomici
- Implementano logiche di business complesse
Non è necessario scrivere test per servizi molto atomici e semplici che:
- Eseguono operazioni elementari
- Non contengono logiche di business significative
Unit tests
Gli unit test servono per quegli elementi che possono essere testati in isolamento, ovvero senza interazioni con:
- Database
- Request HTTP
- Response HTTP
- File system
- Servizi esterni
L'obiettivo è garantire che le componenti principali dell'applicazione mantengano il comportamento atteso nel tempo attraverso test isolati e veloci, concentrando lo sforzo di testing dove porta maggior valore.
Feature tests
I feature test servono per quegli elementi che non possono essere testati in isolamento e che hanno interazioni con Requests, Responses, Filesystem e Database.
Questi test verificano il comportamento dell'applicazione da un punto di vista più ampio, testando:
- Il corretto funzionamento dell'intero flusso HTTP
- La persistenza e l'integrità dei dati nel database
- Le autorizzazioni e i middleware
- L'integrazione tra diversi servizi e componenti
- Le operazioni sul filesystem
- Le interazioni con servizi esterni
- La gestione delle transazioni e del rollback
- Le response HTTP attese
L'obiettivo è garantire che le funzionalità principali dell'applicazione rimangano operative anche dopo modifiche significative al codice, simulando scenari reali di utilizzo e verificando l'intero stack applicativo, incluse tutte le dipendenze esterne e le interazioni con risorse di sistema.
Utilizzo dei gruppi
I test possono essere organizzati in gruppi logici utilizzando l'attributo #[Group]. Questo permette di eseguire selettivamente solo i test appartenenti a determinati gruppi.
Definizione dei gruppi
Per assegnare un test a uno o più gruppi, utilizzare l'attributo #[Group] sulla classe o sul singolo metodo di test:
<?php
use PHPUnit\Framework\TestCase;
#[Group('user-management')]
class UserServiceTest extends TestCase
{
#[Group('authentication')]
public function test_user_can_login_with_valid_credentials()
{
// Test implementation
}
#[Group('registration')]
public function test_user_can_register_with_valid_data()
{
// Test implementation
}
#[Group('security')]
#[Group('authentication')]
public function test_invalid_login_attempts_are_blocked()
{
// Test implementation
}
}
Esecuzione selettiva dei gruppi
È possibile eseguire solo i test appartenenti a specifici gruppi utilizzando il comando --group:
# Esegue solo i test del gruppo 'authentication'
php artisan test --group=authentication
# Esegue i test di più gruppi
php artisan test --group=authentication --group=security
# Esegue tutti i test tranne quelli del gruppo 'slow'
php artisan test --exclude-group=slow