Testing software: Importanza di utilizzare gli Unit Test dopo lo sviluppo software

Testing software: Importanza di utilizzare gli Unit Test dopo lo sviluppo software

Terminata la fase di analisi e sviluppo del software si passa al testing ed in particolare ai test di unità (Unit Test). Lo unit testing è una procedura usata per verificare singole parti di un codice sorgente. Lo scopo dello unit testing è quello di verificare il corretto funzionamento di parti di programma permettendo così una precoce individuazione dei bug e degli errori. Uno unit testing accurato può dare una prova certa se un pezzo di codice funziona correttamente, con importanti vantaggi.

Testing software: Importanza di utilizzare gli Unit Test dopo lo sviluppo software

Vantaggi dello Unit test

Semplifica le modifiche

Lo unit testing facilita la modifica del codice del modulo in momenti successivi (“refactoring”) con la sicurezza che il modulo continuerà a funzionare correttamente. Il procedimento consiste nello scrivere test case per tutte le funzioni e i metodi, in modo che se una modifica produce un fallimento del test, si possa facilmente individuare la modifica responsabile.
Unit test già predisposti semplificano la vita al programmatore nel controllare che una porzione di codice stia ancora funzionando correttamente. Un buon unit testing produce test case che coprono tutti i percorsi del codice dell’unità, con particolare attenzione alle condizioni nei cicli (test sugli “if”, “while”, “for”).
In sistemi con unit testing continuo, tali test sono in grado di garantire l’automatica integrità del codice ad ogni modifica.

Semplifica l’integrazione

Lo unit testing semplifica l’integrazione di moduli diversi perché limita i malfunzionamenti dovuti a problemi nell’interazione tra i moduli e non nei moduli stessi, rendendo i test di integrazione più semplici.
Un argomento molto dibattuto è quello della non necessità di test di integrazione manuali, in caso si sia organizzata una procedura di unit testing sufficientemente completa. In realtà spesso un elaborato sistema di unit testing fornisce una falsa sicurezza e un test di integrazione gestito da esseri umani è in genere ugualmente necessario. Probabilmente la reale necessità del fattore umano nella procedura di test dipende dalle caratteristiche del sistema nel quale si sviluppa e soprattutto dalla disponibilità di risorse.

Supporta la documentazione

Lo unit testing fornisce una documentazione “viva” del codice, perché è intrinsecamente un esempio di utilizzo dell’API del modulo.
I test case incorporano le caratteristiche critiche per il successo di un’unità di codice. Tali caratteristiche indicano l’uso appropriato dell’unità e i comportamenti errati che devono essere identificati nel suo funzionamento. Pertanto lo unit testing documenta tali caratteristiche, sebbene in molti ambienti questi non possono costituire la sola documentazione necessaria. In compenso, la tradizionale documentazione diventa spesso obsoleta a causa di successive modifiche del codice non documentate.

Separazione dell’interfaccia dall’implementazione

Poiché alcune classi possono far riferimento ad altre, il test di una classe spesso si propaga alle altre. Un esempio è una classe che interagisce con un database: testare la classe spesso implica la scrittura del codice che interagisce con il database. Questo è un problema perché lo unit test non dovrebbe mai varcare i confini della classe. La conseguenza è che il programmatore, nel progettare lo unit testing, impara ad isolare la classe da analizzare, individuando l’interfaccia con il database ed implementandola con un “mock object”, una simulazione dell’oggetto reale che può essere effettuata in condizioni controllate. L’effetto è un test più approfondito e quindi uno unit testing di qualità più elevata.

Limitazioni dello unit testing

In generale il testing non riesce ad identificare tutti gli errori in un programma e lo stesso vale per lo unit testing che, analizzando per definizione le singole unità, non può identificare gli errori di integrazione, problemi legati alla performance e altri problemi legati al sistema in generale. Lo unit testing è più efficace se utilizzato in congiunzione con altre tecniche di testing del software.
Come ogni forma di testing, anche lo unit testing non può individuare l’assenza di errori ma può solo evidenziarne la presenza.

Il testing del software è un problema di matematica combinatoria. Per esempio, ogni test booleano richiede almeno due test, uno per la condizione di “true” e uno per quella di “false”. Si può dimostrare che, per ogni linea di codice funzionale, siano necessarie dalla 3 alle 5 linee di codice per il test. È quindi irrealistico testare tutte le possibili combinazioni di input di qualsiasi codice non banale senza un tool apposito di generazione di casi di test.

Per ottenere gli sperati benefici dallo unit test, è richiesto un rigoroso senso di disciplina durante tutto il processo di sviluppo. È essenziale mantenere traccia non solo dei test che sono stati sviluppati ed eseguiti, ma anche di tutte le modifiche effettuate al codice funzionale dell’unità in esame e di tutte le altre. L’uso di un sistema di controllo di versione è essenziale. Se una versione successiva di una unità fallisce un test che aveva passato in precedenza, il sistema di controllo di versione permette di evidenziare le modifiche al codice intervenute nel frattempo.

Pubblicato da Vito Lavecchia

Lavecchia Vito Ingegnere Informatico (Politecnico di Bari) Email: [email protected] Sito Web: www.vitolavecchia.altervista.org

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *