Il collaudo del software (o testing) è il procedimento utilizzato per individuare le carenze di correttezza, completezza e affidabilità del software. L'importanza del collaudo è progressivamente cresciuta insieme allo sviluppo del software e già a partire dai primi anni '90, in contrapposizione al tradizionale modello di sviluppo a cascata, si è andata affermando una tendenza di sviluppo test driven (o guidata dal collaudo). Il concetto alla base è che le attività di collaudo devono procedere parallelamente allo sviluppo del software in modo che:
Parlando di test del software occorre far distinzione tra malfunzionamenti e difetti. Un malfunzionamento indica un comportamento del software difforme dai requisiti e si verifica quando il sistema, in determinate condizioni, non si comporta come atteso. Il difetto, viceversa, è individuabile in una porzione di codice che, quando eseguita con particolari input, genera malfunzionamento. In altri termini, si ha malfunzionamento quando viene eseguito il codice che contiene il difetto con dei dati di input tali da evidenziare l'errore. Lo scopo principale del collaudo è di rilevare, partendo dall'osservazione dei malfunzionamenti, il maggior numero di difetti in modo da poterli poi correggere. Per rilevare il maggior numero possibile di difetti durante il collaudo occorre sollecitare il software in modo tale da eseguire la maggior quantità possibile di codice con differenti combinazioni di input. Può verificarsi che un errore nel codice sorgente si manifesti solo se si utilizza un particolare compilatore o interprete, oppure solo se il codice è eseguito su una particolare piattaforma. Per avere maggiori garanzie sulla bontà del collaudo pertanto può essere necessario collaudare il software in vari ambienti di sviluppo e con varie piattaforme di utilizzo. Nei progetti di sviluppo industriale nessun collaudo può garantire l'individuazione di tutti i possibili difetti, le combinazioni di input validi possono essere moltissime è non possibile o ragionevole pensare di riprodurle tutte, un buon collaudo però può rendere la probabilità di malfunzionamenti sufficientemente bassa e tale da essere accettabile in termini di qualità. La soglia di errore tollerabile dipende dal tipo di applicazione, per esempio, in software di tipo life-critical, cioè nei casi in cui un malfunzionamento può mettere a rischio la vita umana, come per esempio il software per apparecchiature biomedicali o aeronautiche, è accettabile solo con una probabilità di malfunzionamento molto bassa; in questi casi il collaudo deve essere particolarmente approfondito e rigoroso. Invece, per il software per cui non è necessariamente richiesta un'altissima qualità, come videogiochi o programmi di produttività personale, può essere sufficiente superare un collaudo meno approfondito. Nel processo industriale di realizzazione di software si assiste normalmente a due successive fasi di collaudo:
Escludendo il caso delle piccole realtà, dove il collaudo è affidato in modo informale ad altre funzioni aziendali, normalmente il collaudo formale costituisce una fase importante dello sviluppo software e richiede un'adeguata pianificazione attraverso un apposito piano di collaudo. Il piano di collaudo prevede tipicamente due elementi fondamentali:
Normalmente i test si distinguono fra due tipologie principali: test funzionali e test prestazionali.
Come suggerisce il titolo, queste tipologie di test, che sono quelli più diffusi, tendono a indagare su eventuali difetti o regressioni funzionali dell'applicativo in reali condizioni di utilizzo.
In quest'ambito si distingue spesso fra due tipologie di test:
In ogni caso il test funzionale, indipendentemente dal fatto di essere automatico o manuale, dovrà essere di crescente granularità. Il test dovrà prendere in esame prima i singoli moduli software, singole routine o limitati insiemi di routine, in questo caso si parla di test di modulo e vengono preferibilmente utilizzati i test di tipo white-box.Poi si passa alla progressiva aggregazione dei moduli fino a costituire l'intero sistema, in questo caso si parla di test di sistema e vengono preferibilmente usati i test di tipo black-box.
I test prestazionali hanno lo scopo di verificare che l'applicazione soddisfi certi requisiti in termini di prestazioni. Vi sono varie tipologie di test di questo tipo tra cui i più frequenti sono i seguenti: