Full Stack

Test del Codice: quali sono e quando usarli

Autore

Manuel Ricci

Quando si parla di code testing ogni team ha un suo gergo personale e non sempre molto comprensibile, sopratutto ai neofiti. In soldoni, il code testing è quell'attività che mira a testare, per l'appunto, il proprio codice, evitando di smazzarsi tutte le varie casistiche a manina, ma non solo.

Agli inizi della mia carriera non testavo minimamente la mia code base. Scrivevo, funzionava e lo buttavo in produzione (in realtà lo scrivevo direttamente in produzione). Con il tempo però, si matura e quindi mi sono inoltrato sempre più nel mondo dei test. Per molti una perdita di tempo, per tanti altri una grandissima risorsa per poter consegnare al cliente qualcosa di qualitativamente migliore. Come al solito vige la regola del punto di vista, ma per me vale, chiaramente, il secondo.

Detto questo quindi, come vengono "classificati" questi test? Per rispondere a questa domanda, dobbiamo in realtà porci altre 3 domande:

  1. Cosa fanno questi test?
  2. Quando vengono scritti ed eseguiti?
  3. Quali informazioni fornisce il fallimento del test?

Prima di procedere oltre è oltremodo giusto sottolineare il fatto che i test non debbano essere eseguiti per tutti i tipi di applicativo, se mi stai scrivendo una calcolatrice in JavaScript con quattro funzioni in croce, trovo abbastanza superfluo la scrittura di una serie di test, tieni sempre a mente:

  • La complessità della tua applicazione
  • Il livello di traffico che la tua applicazione potrebbe dover supportare
  • La grandezza del tuo team

Detto questo possiamo procedere con la scoperta dei vari test, cercando di rispondere nella maniera più esaustiva possibile alle tre domande poste pochi paragrafi più in su.

Unit Test

Cosa testano?

Gli Unit Test valutano che ogni unità atomica del codice funzioni come dovrebbe. Solitamente, quando si pianifica un test unit, bisognerebbe isolare le funzionalità che non possono essere ulteriormente scomposte.

Gli Unit Test non dovrebbero testare dipendenze esterne o interazioni. Per questo motivo è consigliato sostituire le chiamate API e le chiamate al database assicurandoti che il tuo codice funzioni correttamente fornendogli solo input corretti da una sorgente esterna.

Quando bisogna eseguirli?

I test di unità bisogna scriverli ed eseguirli in parallelo con il codice. Quando si parla di Test Driven Development, si fa riferimento proprio agli Unit Test. I test vengono quindi utilizzati come specifica per cosa il codice dovrebbe fare.

Cosa succede se falliscono?

Un test unit con esito negativo ti fa capire che una specifica porzione di codice non funziona. Se i test che hai condotto sono sufficientemente atomici, il malfunzionamento dovrebbe essere abbastanza chiaro e specifico.

Gli esiti negativi ti possono aiutare ad identificare e risolvere i problemi rapidamente e comprendere quando le specifiche devono essere aggiornate. Probabilmente sono un'ottima guida anche per aggiornare la documentazione.

Integration Test

Cosa testano?

Gli integration test controllano l'interazione tra due o più unità di codice. La tua applicazione è composta da unità individuali che eseguono specifiche funzioni e ognuna di queste funzioni può lavorare correttamente in isolamento (durante gli unit test), ma non funzionare quando interagisce con le altre.

I test d'integrazione testano anche l'integrazione delle tua codebase con le dipendenze esterne, come connessione al database e API di terze parti.

Quando bisogna eseguirli?

Subito dopo gli unit test.

Cosa succede se falliscono?

Quando un test d'integrazione fallisce significa che due o più funzioni della tua applicazione non funzionano bene insieme. Questo potrebbe voler significare che ci sono due moduli in conflitto, la struttura della riposta di una API di terze parti che è cambiata. Inoltre è un ottimo modo per fare un check sul come stai gestendo gli errori, come ad esempio la mancata connessione al database.

Il fine ultimo degli integration test è sicuramente quello di migliorare le funzionalità di logging e di gestione degli errori.

Regression testing

Cosa testano?

I test di regressione controllano una serie di scenari che funzionavano in passato e che dovrebbero essere relativamente stabili.

Quando bisogna eseguirli?

Il regression testing dovrebbe essere svolto dopo che il test d'integrazione viene passato con successo. In pratica serve a controllare che non si sia rotto niente nel frattempo che implementavi le nuove funzionalità.

Cosa succede se falliscono?

Se un test di regressione fallisce significa che le nuove funzionalità hanno rotto qualcosa di esistente, causando, per l'appunto, una regressione.

Il mancato successo del test dovrebbe farti capire quale vecchia funzionalità ha smesso di funzionare e indica che dovrai scrivere dei nuovi test d'integrazione tra la nuova funzionalità e quella alla quale sta creando problemi.

Il fallimento di un regression test indica inoltre che potresti aver reintrodotto inavvertitamente un bug che è stato sistemato nelle release precedenti.

Smoke Testing

Cosa testano?

Il test del fumo sono un set di test automatizzati finemente curati e di alto livello che possiamo collocare tra i test di integrazione e i test di regressione. Sono un controllo generale delle funzionalità core, per verificare che non ci siano "guasti" in giro per l'applicativo.

Il nome abbastanza particolare del test deriva dall'idraulica dove se vedi del fumo o vapore uscire da un tubo, significa che perde e che bisogna metterlo a posto.

Quando bisogna eseguirli?

Gli smoke test sono dei test che mettono sotto esame l'intero sistema, assicurando che tutte le funzionalità cardine siano intatte. Non devono essere super comprensibili, ma sono il tuo no-go test (sarò più chiaro nel paragrafo successivo). I test del fumo dovrebbero essere eseguiti molto spesso, anche giornalmente, sia in staging che in produzione per verificare che tutto sia ok.

Cosa succede se falliscono?

Se il test fallisce c'è qualcosa di significativamente importante da sistemare. Non devi fare il deploy delle nuove funzionalità, finché il test non viene passato con successo. Se il problema viene riscontrato in produzione, allora è sicuramente un qualcosa che bisogna mettere a posto con la massima priorità.

Acceptance testing (AKA QA)

Cosa testano?

I test di accettazione sono una serie di test manuali dove le varie feature che sono state scritte vengono testate con l'obiettivo di controllare se vengono soddisfatti le specifiche iniziali e i criteri di accettazione.

Quando bisogna eseguirli?

Subito dopo che lo sviluppo è stato completato. Ha senso effettuarli subito dopo i test unit e d'integrazione, così che se ci fossero problemi non bisognerebbe ripetere l'intero ciclo di test.

Ovviamente bisogna definire un set di criteri di accettazione e aggiornarli qualora vi fossero delle modifiche durante la fase di sviluppo. Quei criteri serviranno poi a chi svolgerà il QA per capire se ciò che è stato fatto corrisponde a quanto stabilito.

Cosa succede se falliscono?

Semplicemente significa che hai dimenticato di implementare qualche funzionalità, quindi mano al codice e si mette a posto.

Performance testing

Cosa testano?

I test delle performance controllano la stabilità, scalabilità e usabilità del prodotto e dell'infrastruttura. Qui bisogna prendere in considerazione il numero di errori al secondo e quanto tempo impiega una pagina a caricare.

In questo caso non ci sono veri e propri criteri di successo/fallimento. Questo tipo di test è più un accumulo di dati per definire quali sono le aree che necessitano di un miglioramento.

Quando bisogna eseguirli?

Sarebbe opportuno testare le performance ad ogni major release o refactoring.

Cosa succede se falliscono?

I test delle performance, come detto in precedenza, non hanno dei veri propri criteri per decretarne il fallimento. Si collezionano una serie di dati e si confrontano con quelle che sono le metriche di riferimento. Qualora i dati prodotti sono molto al di là delle metriche di riferimento (es. performance budget) probabilmente bisognerà prestare maggior attenzione all'infrastruttura, al database, risorse impiegate, ecc.

Load testing

Cosa testano?

I test di caricamento sono un test facente parte dei test delle performance, ma verticalizzato su come l'applicativo performa sotto determinate circostanze per un periodo di tempo.

Quando bisogna eseguirli?

Non sono di primaria importanza se il tuo applicativo è nelle sue prime fasi, ma, mano a mano che diventa più grande forse è il caso di eseguire qualche test di caricamento così da controllare se le nuove features influiscono nelle performance generali del sito e capire se c'è un margine di miglioramento.

Cosa succede se falliscono?

I load test ti permettono di capire quanto sei pronto ad un significativo aumento di traffico. Se il test fallisce, non vuol dire che il tuo sito non funziona, ma significa che il tuo sito non è pronto ad un aumento vertiginoso delle visite o ad un attacco DDOS.

Se l'applicativo è piccolo non c'è bisogno di preoccuparsi, ma potrebbe diventarlo se la base utenti comincia a rimpolparsi.

Spero di aver diradato un po' di dubbi e non mi resta che ringraziarti per aver letto

Caricamento...

Diventiamo amici di penna? ✒️

Iscriviti alla newsletter per ricevere una mail ogni paio di settimane con le ultime novità, gli ultimi approfondimenti e gli ultimi corsi gratuiti puubblicati. Ogni tanto potrei scrivere qualcosa di commerciale, ma solo se mi autorizzi, altrimenti non ti disturberò oltre.

Se non ti piace la newsletter ti ricordo la community su Discord, dove puoi chiedere aiuto, fare domande e condividere le tue esperienze (ma soprattutto scambiare due meme con me). Ti aspetto!

Ho in previsione di mandarti una newsletter ogni due settimane e una commerciale quando capita.