Cos’è e come funziona lo unit testing che garantisce software di qualità
In termini di tempo e di denaro, una delle principali seccature per uno sviluppatore software e per il cliente sta nell’incappare in fastidiosi bug che rallentano la release del prodotto finito. In effetti, i tradizionali test che vengono svolti sui software, pur essendo in grado di evidenziare bug ed errori, non permettono di individuarne la causa in modo veloce.
Lo unit testing è una tecnica di testing del software che permette di individuare per tempo eventuali errori nell’applicazione grazie ad analisi frequenti sulle singole unità del codice durante le fasi di programmazione stesse, così da rendere possibile eliminare l’errore sin dalle fasi iniziali.
Se ti interessa capire meglio che cos’è lo unit testing, a cosa serve e come si fa, questo è l’articolo che fa per te.
Cos’è lo unit testing
Lo unit testing, spesso chiamato anche testing di unità o testing unitari, è un metodo di test del codice che prevedere di testare i singoli componenti di un programma, ovvero le singole unità di codice, per verificare se il risultato ottenuto rispetta e corrisponde ai risultati previsti.
Questa tecnica di testing del software durante le fasi di sviluppo permette quindi di verificare che ogni parte del codice funzioni correttamente così da garantire un risultato finale dell’applicazione ottimale.
Il soggetto dello unit testing sono perciò le unità, le più piccole parti di codice che possono essere logicamente isolate all’interno di un sistema. Che si tratti di una funzione, un sottoprogramma, una classe o una proprietà, ciò che più conta è che l’elemento su cui i test vengono svolti sia il più piccolo possibile. In questo modo, infatti, sarà possibile ottenere una panoramica granulare sul funzionamento del codice oltre che rendere i test estremamente veloci e pratici.
Svolto generalmente dagli sviluppatori durante le fasi di sviluppo del software per effettuare test costanti dei vari componenti, lo unit testing può essere in realtà realizzato anche dai responsabili del Software Qualità Assurance.
Unit testing vs testing tradizionale: quali sono i vantaggi?
Quella dello unit testing può considerarsi a tutti gli effetti una vera e propria best practice nell’ambito dello sviluppo di soluzioni software.
I vantaggi rispetto ai test tradizionali, d’altronde, che provano e valutano il funzionamento di un’applicazione nel suo insieme, sono evidenti.
Attraverso i test tradizionali infatti, non solo è impossibile rilevare rapidamente gli errori sui singoli componenti durante il loro sviluppo, ma diventa complesso anche isolare la causa dello specifico bug all’interno del codice.
Insomma, verificando individualmente ogni componente del codice, lo unit testing è una tecnica che permette agli sviluppatori di coprire in modo capillare e preciso tutto il codice scritto così da rilevare in modo rapido ed efficace i bug, individuarne l’origine e procedere con le correzioni degli errori sin dalle prime fasi di codifica. Il risultato? Un software che rispecchia le previsioni e che non richiede perciò eccessivi e complessi (oltre che costosi) interventi nelle fasi successive.
Rendendo possibile cogliere eventuali difetti del codice sin dalle fasi iniziali, lo unit testing garantisce perciò una riduzione dei cost del testing, dei difetti nelle funzionalità appena sviluppate e anche dei bug nel corso delle modifiche delle funzionalità esistenti. Senza dimenticare, naturalmente, che testare in modo così capillare il codice permette di migliorarne la leggibilità fino ad ottenere un codice pulito e di qualità.
Come funziona?
Un buon unit testing viene strutturato in tre momenti:
- Arrange: con la definizione di ciò che ci si aspetta venga realizzato dal codice;
- Act: con l’avvio del test vero e proprio
- Assert: con l’analisi dei risultati ottenuti e l’eventuale individuazione e correzione dell’errore individuato.
Come abbiamo visto, infatti, lo unit testing isola un modulo per valutarne la correttezza e lavora quindi su singole sezioni di codice scelte dagli sviluppatori per testare una specifica funzione del software. Ricordiamo che il test esegue solo una funzione concreta e lascia perciò fuori da questa prima fase di analisi tutte le interazioni con altri componenti e, in generale, con fattori esterni. Solo isolando così il modulo il test riesce a coglie eventuali errori.
Quindi, il codice sorgente da testare viene diviso in piccole sezioni unitarie e testabili autonomamente su cui viene poi avviato il test vero e proprio all’interno di un ambiente autonomo realistico.
Una volta completati i test case, eventuali vulnerabilità e malfunzionamenti verranno messi in luce. In caso contrario, nel caso in cui cioè il test certifichi il corretto funzionamento della specifica porzione di codice, l’unità viene contrassegnata per segnalare che la sua forma corrente è libera da bug. Soltanto più tardi, quando cioè più unità sono state validate come funzionanti, sarà possibile procedere a test applicati su componenti più grandi (Integration testing).
Gli strumenti
Per quanto possa essere eseguito manualmente, lo unit testing è tipicamente svolto in modo automatico grazie ai framework di unit testing.
In questo secondo caso, l’ambiente di testing di cui abbiamo scritto sopra viene creato automaticamente dalla piattaforma così da permettere agli sviluppatori di dedicare la propria attenzione unicamente alla realizzazione dei diversi casi di test.
Questa seconda soluzione è ideale per riuscire ad eseguire continui test durante l’intero periodo di sviluppo.
Per eseguire automaticamente unit testing la disponibilità di strumenti è vastissima e strettamente correlata al linguaggio di programmazione utilizzato. Per fare degli esempi:
- xUnit: è lo strumento gratuito e open-source per il debug di applicazioni basate sul framework .NET
- jUnit: uno dei framework più conosciuti per lo unit testing gratuito valido per il linguaggio di programmazione Java
- PHPUnit: è il tool gratuito per testare applicazioni realizzate in PHP
- Embunit: uno degli strumenti più famosi per lo unit testing che si applica ai linguaggi di sviluppo C e C++.