Skip to main content

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
warning

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