Quasi tutti i team che decidono di "prendere sul serio i test" iniziano nel posto sbagliato: scegliendo lo strumento. Si parla di framework, plugin, runner, e solo dopo qualcuno si accorge che nessuno ha definito cosa, in fondo, verrà testato e come.
Lo strumento è l’ultima decisione, non la prima. Prima di ciò arrivano le scelte strutturali che determinano se la tua suite sarà una risorsa o un peso morto. Chi definisce queste scelte nel giusto ordine crea una base che dura negli anni. Chi improvvisa mette insieme una suite che verrà riscritta in sei mesi.
Questo testo è una sceneggiatura. Non si tratta di un elenco di "buone pratiche" vaghe, ma piuttosto della sequenza di passaggi che seguo quando devo strutturare da zero l'architettura di test di un prodotto.
Passaggio 1: definire cos'è il rischio prima di definire cosa testare
Testare tutto è impossibile e inutile. La prima decisione è capire dove risiede il rischio reale del prodotto.
In un sistema di pagamento il rischio sta nel calcolo dei valori e nell’idempotenza delle transazioni. In un portale di servizi pubblici, è nell'ammissibilità e nel controllo dell'accesso ai dati personali. Nell'e-commerce, è nel carrello e alla cassa. Mappalo prima.
Questa mappa dei rischi definisce dove vale la pena investire in test approfonditi e dove è sufficiente un controllo leggero. Senza di esso, il team spreca energie testando il banale e lascia scoperto il critico, il peggiore di tutti i mondi.
Passaggio 2: stabilisci i livelli e i relativi confini
Il secondo passo è decidere i livelli del test e cosa copre ciascuno. La classica piramide funge da guida: molti unit test, qualche integrazione, pochi end-to-end.
Più importante del formato è il confine di ogni livello. Il test unitario verifica una regola in isolamento, senza infrastruttura. Il test di integrazione verifica che i componenti o i servizi comunichino correttamente. I test end-to-end esercitano l'intero flusso di utenti.
La definizione di questi confini evita chiaramente l’errore più costoso: la sovrapposizione dei test. Quando lo stesso comportamento viene controllato a tre livelli, qualsiasi modifica interrompe tre test e la suite diventa fragile senza acquisire sicurezza.
Step 3: garantire l'isolamento fin dal primo test
L'isolamento è la proprietà che più decide la salute futura della suite e quella che viene maggiormente trascurata all'inizio.
Ogni test deve impostare il proprio scenario e ripulirlo alla fine. Nessun test può dipendere da ciò che un altro test ha lasciato nella banca, nella memoria o nel file system. Nell'istante in cui un test presuppone che "l'utente X esista già", hai piazzato una bomba a orologeria.
La conseguenza pratica è impegnativa: i test unitari non toccano la banca, la rete o l’orologio. Se la tua funzione può essere testata solo aggiungendo metà dell'applicazione, il problema è l'accoppiamento del codice. Il test ti fornisce una diagnosi architettonica gratuita.
Passaggio 4: decidi come gestire le dipendenze esterne
Database, API di terze parti, gateway di pagamento, servizi di posta elettronica. Ogni applicazione reale dipende da cose al di fuori di essa. Come trattarli nei test è una decisione strutturale.
Ci sono due estremi negativi. Deridere tutto rende la suite veloce ma falsa: metti alla prova la tua ipotesi sulla dipendenza, non la dipendenza. L'utilizzo di tutto ciò che è reale lascia la suite fedele ma lenta e instabile.
L’equilibrio che difendo: raddoppiamento nelle dipendenze interne e periferiche, integrazione reale nei confini critici. Il payment gateway e il livello di persistenza meritano di essere testati rispetto a implementazioni reali, in un ambiente controllato. Il servizio di posta elettronica, nella maggior parte dei casi, può essere simulato.
Passaggio 5: tratta i dati di test come parte dell'architettura
I dati sono la parte invisibile che affonda le suite. Gli scenari assemblati a mano, sparsi, duplicati, diventano un incubo di manutenzione quando il modello dei dati cambia.
Centralizza la creazione degli scenari in builder riutilizzabili. Invece di assemblare ogni test da zero un ordine completo, richiede "un ordine valido" e aggiusta solo ciò che conta per il caso. Ciò riduce il rumore, rende il test leggibile e protegge la suite dalle modifiche del modello.
Nei prodotti che trattano dati personali esiste una precauzione in più che molti dimenticano: non utilizzare mai dati di produzione reali in un ambiente di test. Oltre al rischio di perdite, ciò contraddice direttamente la LGPD. I dati del test devono essere sintetici.
Passaggio 6: integrazione con il tapis roulant dall'inizio
Una suite che gira solo sulla macchina di chi l'ha scritta non protegge nessuno. Il sesto passo consiste nell’integrare i test nell’IC fin dall’inizio, non come un retrofit.
Struttura in più fasi: guida prima, fallisci velocemente; integrazione e successivamente end-to-end. Definire che una richiesta pull non entri nella suite rossa. Questa semplice regola cambia la cultura perché trasforma il test da un "attività facoltativa" a parte del flusso di consegna.
E misurare in anticipo i tempi di esecuzione. Una suite che cresce senza controllo del tempo diventa, prima o poi, qualcosa su cui il team impara ad aggirare.
Il passaggio che nessuno formalizza: la manutenzione
C'è un passaggio finale che raramente entra nelle sceneggiature: decidere chi si prenderà cura della suite nel tempo. Il codice di test invecchia, accumula duplicazioni e ottiene test intermittenti come qualsiasi sistema.
La decisione strutturale in questo caso è quella di considerare i test come parte della definizione di "fatto" e di "integrità della suite" come una metrica ingegneristica. Senza un proprietario e senza parametri, la migliore architettura iniziale si degrada in un anno o due.
Impostare l'architettura di test nel giusto ordine, rischio, livelli, isolamento, dipendenze, dati, nastro trasportatore, manutenzione, non è burocrazia. È ciò che fa la differenza tra una suite che ti dà il coraggio di evolvere il sistema e una che ti fa paura di toccarla.
Se stai strutturando test su un nuovo prodotto o cercando di salvare una suite che è diventata un peso, vale la pena iniziare con questi passaggi prima di aprire l'editor. Ho altri articoli sul blog su qualità e ingegneria e se questo è un problema concreto per il tuo team, è una buona conversazione.
Leggi anche
- Architettura di test automatizzata: una guida rapida per i team che necessitano di velocità
- Test di regressione: assicurazione contro la rottura di ciò che già funzionava
- Test automatizzati: perché il codice non testato è debito
- Ciclo di test del software: tendenze e una guida rapida per i leader
- Prestazioni del software: cosa insegnano i casi reali sulla qualità
- Test automatizzati: architettura e fondamenti