Il software testing verifica la funzionalità e la bontà di un programma software. Si tratta di un processo fondamentale, che va gestito in maniera attenta e che prevede diversi aspetti.


Il software testing valuta e verifica che un prodotto software o un’applicazione funzioni come previsto e non contenga errori. È un elemento fondamentale su cui occorre rivolgere l’attenzione che merita. Non tenerne conto può avere effetti collaterali anche molto seri. Ancora oggi fa scuola l’esempio di quanto accaduto alla società statunitense Knight Capital Group. Nel 2012 un problema tecnico all’interno del software di trading da poco installato causò un’oscillazione di alcuni titoli di oltre il 10% nelle prime negoziazioni. Come riporta il New York Times, il problema tecnico del software portò la società a inviare sul mercato numerosi ordini errati di titoli quotati al NYSE. Il guaio costò caro a Knight: quasi 10 milioni di dollari al minuto. La stessa società dichiarò di aver perso 440 milioni di dollari nella vendita di tutte le azioni acquistate accidentalmente “a causa di un problema tecnico del computer”.

Lo scorso aprile, nel Regno Unito, milioni di persone non sono riuscite a ricevere un avviso di emergenza dal governo a causa di un sospetto problema tecnico del software sulla rete mobile di Three.

Questi due esempi spiegano quanto sia importante curare ogni fase nel processo realizzativo del software, in cui la fase di testing assume un valore cruciale. I vantaggi sono numerosi, come vedremo, ma anche gli aspetti da considerare.

Cos’è il software testing?

Il software testing è il processo di verifica della qualità di un programma software prima del lancio. Serve a valutare la funzionalità del prodotto e a verificare la presenza di errori e lacune e se il risultato dell’applicazione corrisponde alle aspettative desiderate prima che il software venga installato e attivato.

Il test del software si è sviluppato a partire dagli anni Novanta del secolo scorso, ma ha radici più profonde, che partono dal 1948 quando il matematico e informatico Tom Kilburn ha posto le basi della nascita del software, realizzando “Manchester Baby”, o Small-Scale Experimental Machine (SSEM), il primo computer elettronico a programma memorizzato. Il debugging è stato il principale metodo di test ed è rimasto tale per molto tempo: negli anni Ottanta, i team di sviluppo hanno iniziato a incorporare un processo più completo per isolare e correggere i bug ed eseguire test di carico in ambienti reali. Ciò ha portato in primo piano i test del software. Nel decennio successivo è nato il processo di Quality Assurance e il test è diventato parte integrante del ciclo di vita dello sviluppo del software.

Così, il software testing così è divenuto il culmine dello sviluppo di applicazioni attraverso il quale i tester del software valutano il codice mettendolo in discussione. Questa valutazione può essere breve o procedere finché tutte le parti interessate non sono soddisfatte.

Le diverse tipologie di test

Di software test non n’è solo uno. Nel tempo, infatti, ha conosciuto una significativa evoluzione, che ha permesso di adottare strategie di test più rapide e collaborative.

Prima di descrivere le varie tipologie, è bene illustrare le due modalità di esecuzione del test software: manuale e automatizzato. Il test manuale viene eseguito da una persona, operando sull’applicazione o interagendo con il software e le API usando gli strumenti appropriati. È un metodo molto costoso poiché richiede che qualcuno configuri un ambiente ed esegua i test da solo e può essere soggetto a errori umani poiché il tester potrebbe commettere errori di battitura o omettere passaggi nello script di test.

Il test automatizzato viene eseguito da una macchina che esegue uno script di test scritto in anticipo. può variare in complessità, dal controllo di un singolo metodo in una classe alla conferma che l’esecuzione di una sequenza di azioni complesse nell’interfaccia utente porti agli stessi risultati. È molto più robusto e affidabile dei test manuali, ma la qualità dei test automatizzati dipende da quanto bene sono stati eseguiti gl script.

Detto questo, vediamo ora le principali tipologie di test:

Dynamic testing

È il principale tipo di software testing, insieme al test statico. Il termine è usato nell’ingegneria del software per descrivere il test del comportamento dinamico del codice.

Dynamic testing si riferisce all’analisi del comportamento dinamico del codice nel software. In questo tipo di test, occorre fornire input e ottenere output attraverso l’esecuzione di un test case. Si può eseguire i casi di test manualmente o mediante un processo di automazione e il codice software deve essere compilato ed eseguito per questo.

Lo scopo principale del test dinamico è convalidare il software e garantire che funzioni correttamente senza errori dopo l’installazione. In altre parole, esso assicura la funzionalità e le prestazioni complessive dell’applicazione.

Static testing

È una tipologia di test del software che esamina un programma, lo analizza insieme a tutti i documenti associati, ma non richiede la sua esecuzione, diversamente dal test dinamico.

Durante i test, viene esaminato e convalidato il prodotto e i relativi documenti di supporto.

Unit testing

Il test unitario è utile per testare ogni singolo modulo di un prodotto software in modo indipendente prima che i moduli vengano combinati in un insieme e testati utilizzando tecniche di “test di integrazione”.

In genere condotto durante la fase di sviluppo dell’applicazione, lo scopo del test unitario è garantire che ogni singola unità o componente funzioni come previsto.

Integration testing

Verifica che diversi moduli o servizi utilizzati dalla tua applicazione funzionino bene insieme. Per esempio, può testare l’interazione con il database o assicurarsi che i micro servizi funzionino insieme come previsto. Il test d’integrazione raggruppa insieme due o più moduli di un’applicazione per garantire che funzionino collettivamente. Questo tipo di test rivela anche difetti di interfaccia, comunicazione e flusso di dati tra i moduli. È più costoso da eseguire in quanto richiede che più parti dell’applicazione siano attive e funzionanti.

Acceptance testing

Il test di accettazione valuta l’intero sistema rispetto ai requisiti desiderati e garantisce che il progetto sia completo. È progettato per replicare l’uso reale del prodotto, verificando che sia funzionale e conforme alle specifiche concordate con il cliente.

Richiede che l’intera applicazione sia in esecuzione durante il test e si concentra sulla replica dei comportamenti degli utenti. Ma può anche andare oltre e misurare le prestazioni del sistema e rifiutare le modifiche se determinati obiettivi non vengono raggiunti.

Functional testing

Il collaudo funzionale comporta il controllo delle funzioni rispetto ai requisiti funzionali. Un modo comune per condurre test funzionali è utilizzare il test della scatola nera.

Smoke testing

Si tratta di un test basilare che verifica la funzionalità di base di un’applicazione. Lo smoke test è pensato per essere veloce da eseguire e il suo obiettivo è confermare che le principali funzionalità del sistema vadano come previsto.

Performance testing

Il test delle prestazioni, come chiarisce il nome, verifica le prestazioni e la velocità di un’applicazione con un determinato carico di lavoro. Il performance testing aiuta a misurare l’affidabilità, la velocità, la scalabilità e la reattività di un’applicazione. Per esempio, può osservare i tempi di risposta durante l’esecuzione di un numero elevato di richieste o determinare come si comporta un sistema con una quantità significativa di dati. Inoltre, può determinare se un’applicazione soddisfa i requisiti prestazionali, individuare i colli di bottiglia, misurare la stabilità durante i picchi di traffico e altro ancora.

Regression testing

Il test di regressione verifica se l’aggiunta di nuove funzionalità provoca un calo della funzionalità di un’applicazione. Viene eseguito dopo ogni modifica per garantire che la modifica non introduca interruzioni indesiderate. Affronta un problema comune per gli sviluppatori: l’emergere di vecchi bug con l’introduzione di nuove modifiche.

Security testing

Questo tipo di test garantisce che il software sia privo di potenziali vulnerabilità, difetti noti e falle di sicurezza che potrebbero influire sul sistema e sui dati dell’utente. Il test di sicurezza viene condotto generalmente tramite test di penetrazione.

Stress testing

Questo test valuta la robustezza del software, testando quanto carico può sopportare prima di raggiungere un punto di rottura. Questo è un tipo di test non funzionale.

Perché la fase di testing del software è importante

Il test del software non è importante: è fondamentale. Esso identifica eventuali problemi e difetti nel codice in modo che possano essere risolti prima della consegna del prodotto software.

I test del software identificano bug e problemi nel processo di sviluppo in modo che vengano risolti prima del lancio del prodotto.

Perché si debbano svolgere i software testing è ormai chiaro. Andiamo però a evidenziare i benefici che può generare. Il software testing permette di identificare i difetti in anticipo. Lo sviluppo di applicazioni complesse può lasciare spazio a errori. Il test del software è fondamentale perché coglie eventuali problemi e difetti nel codice e permette di risolverli prima della consegna del prodotto.

Abbiamo visto nell’esempio della disavventura della Knight, che contare su un software opportunamente testato garantisce risparmi di denaro. I problemi di sviluppo del software che passano inosservati a causa della mancanza di test del software possono creare pesanti perdite alle aziende e spese elevate per ripristinarne la funzionalità del software.

Inoltre, il test del software permette di migliorare la qualità del prodotto. Un software eccellente può essere rilasciato solo se testato in modo efficace prima del lancio. I test aiutano il prodotto a superare il controllo qualità, soddisfacendo i criteri e le specifiche definiti dagli utenti.

Testare un software durante tutto il suo ciclo di vita di sviluppo aumenta la fiducia e la soddisfazione dei clienti, che saranno di certo più contenti se il software è stato testato più volte e offre qualità.

Il software testing rileva vulnerabilità di sicurezza. Il codice dell’applicazione non sicuro può lasciare vulnerabilità che gli aggressori possono sfruttare. Poiché la maggior parte delle applicazioni è online, possono essere un vettore principale per gli attacchi informatici e devono essere testate a fondo durante le varie fasi dello sviluppo dell’applicazione.

Alcune Best Practice

Il test è una parte fondamentale dello sviluppo del software. Tuttavia, può essere difficile sapere da dove iniziare. Conoscere le best practice di test del software, quindi, è essenziale per evitare problemi.

Definire gli obiettivi

Gli obiettivi del processo di software testing sono almeno due: identificare e verificare la funzionalità di un prodotto software. Il processo dovrebbe essere progettato per identificare potenziali problemi e correggerli prima del rilascio. I test dovrebbero essere svolti durante tutto il ciclo di sviluppo, non solo alla fine.

Valutare i rischi

Il test è una parte essenziale di qualsiasi progetto software, ma non è sempre facile o economico da eseguire. Inoltre, ci sono molti rischi legati ai test ed è necessario valutarli prima di iniziare il progetto.

Stabilire un test plan

Un test plan è un documento che delinea i passaggi intrapresi per testare un prodotto o un sistema. Dovrebbe avere obiettivi misurabili da valutare e perfezionare. È essenziale disporre di un test plan per organizzare e rendere coerente il processo di test. Esso dovrebbe includere anche una sequenza temporale in modo che il test possa essere condotto in tempo.

Dialogare con gli utenti finali

I tester dovrebbero incontrare gli utenti finali, per individuare i problemi che potrebbero incontrare nell’utilizzo del software e comprendere con loro le funzionalità che vorrebbero vedere aggiunte. Ciò aiuterà il team a condurre i test dal punto di vista dell’utente finale.

Fissare condizioni e procedure di prova

Questa procedura comprende la configurazione dell’ambiente e del software per rappresentare l’ambiente effettivo e l’utilizzo dello stesso software e delle stesse versioni del sistema di produzione. Inoltre occorre utilizzare software e versioni diverse per simulare le condizioni del mondo reale. Ciò permetterà di identificare eventuali problemi con il software che potrebbero non essere evidenti quando si utilizza una singola prestazione o ambiente.

In questa fase è importante testare più scenari e utilizzare diversi dati di input. Ciò aiuterà a identificare eventuali problemi con il software che potrebbero non essere evidenti quando si utilizza un singolo sistema o dati di input.

Infine è bene utilizzare strumenti di test automatizzati per accelerare il processo di test. Questi strumenti possono aiutare a identificare i problemi con il software più velocemente e fornire risultati più accurati.

Simulare l’ambiente dello sviluppatore

Per evitare che gli sviluppatori e i team di controllo qualità riscontrino risultati delle prestazioni dell’applicazione diversi, è bene assicurarsi che l’ambiente di controllo qualità imiti quello di sviluppo.

Concentrarsi sulle modifiche significative al codice

Dato che non è possibile testare tutto, occorre assegnare la priorità in base a dove sono state apportate modifiche significative al codice, in particolare per correggere bug e in parti dell’applicazione che vengono utilizzate pesantemente. È consigliabile prendere in considerazione l’utilizzo di software test automatizzati per tutte le parti che funzionavano nell’ultima versione.

Utilizzare un approccio di automazione del test a due livelli

Innanzitutto, bisogna eseguire rapidi controlli di integrità su ogni parte nel codice sorgente per convalidare rapidamente le modifiche. È possibile eseguire test di regressione più estesi durante la notte. In questo modo, puoi fornire un feedback immediato agli sviluppatori mentre sono ancora concentrati su quella parte del codice.

Eseguire test di regressione

Il test di regressione è uno dei passaggi più importanti da eseguire prima che un’applicazione possa finalmente passare alla fase di produzione e non dovrebbe essere saltato. Poiché la maggior parte dei test è stata eseguita prima del test di regressione, incoraggia la convalida dell’intera applicazione.

Affiancare fasi di sviluppo al testing

Il development testing (DevTest) è un approccio nello sviluppo del software finalizzato ad avvicinare le fasi di sviluppo e test. Nello sviluppo software tradizionale, lo sviluppo e il test sono due funzioni separate. La sfida con questo approccio è che introduce un ritardo tra la scrittura del codice e il test dello stesso codice.

In DevTest, queste fasi sono maggiormente integrate in modo che il codice scritto e archiviato venga testato automaticamente. In questo modo, i problemi possono essere scoperti e risolti più rapidamente.