Verifica
Consiste nello stabilire/controllare se un software esegue le funzioni per le quali è stato realizzato in maniera corretta, senza malfunzionamenti.
Validazione
Consiste nel valutare se il software soddisfa i requisiti e le specifiche per esso stabilite;
Rientra nella validazione anche la valutazione del soddisfacimento dei requisiti di qualità.
Il Testing (collaudo) è un processo di esecuzione del software allo scopo di scoprirne i malfunzionamenti;
Osservando i malfunzionamenti possiamo dedurre la presenza di difetti.
Il Debugging è il processo di scoperta dei difetti a partire dai malfunzionamenti rilevati.
L’Ispezione è un processo di analisi del software per scoprirne i difetti.
Un test t rileva un malfunzionamento se il programma P non è corretto per t, ovvero se produce risultati diversi da quelli attesi.
Un insieme di test T è inadeguato se esistono dei malfunzionamenti in P che il test T non è in grado di rilevare.
Il testing non può dimostrare l’assenza di difetti (e dunque la correttezza del programma), ma può solo dimostrare la presenza di difetti.
La correttezza di un programma è un problema indecidibile!
Un processo di testing deve consentire di acquistare fiducia nel software, mostrando che esso è pronto per l’uso operativo!
Un test è ideale se l’insuccesso del test implica la correttezza del programma.
Un test esaustivo è un test che contiene tutti le combinazioni dei dati di ingresso al programma
Obiettivo realistico: selezionare casi di test che approssimano un test ideale.
Condizione necessaria per effettuare un test:
conoscere il comportamento atteso per poterlo confrontare con quello osservato.
L’oracolo conosce il comportamento atteso per ogni caso di prova.
Dal momento che il testing esaustivo è, in generale, irraggiungibile, altri criteri sono proposti per valutare quando il testing possa essere terminato.
Posto che non esiste (e non sapremmo riconoscere) l’insieme ideale di casi di test, la loro bontà si può misurare in termini di:
Efficacia
Numero di malfunzionamenti trovati / numero di malfunzionamenti da trovare.
Efficienza
Numero di test in grado di scoprire malfunzionamenti / numero di test totali.
Per massimizzare entrambe, contemporaneamente, bisognerebbe trovare il massimo numero possibile di malfunzionamenti con il minimo numero possibile di casi di test.
In realtà l’efficacia in generale non è calcolabile perchè non conosciamo il numero totale di malfunzionamenti.
Molte strategie di testing riescono ad aumentare una delle due diminuendo l’altra.
L’efficacia va privilegiata quando si vuole un software affidabile.
L’efficienza va privilegiata se si vuole un testing meno costoso (in particolare se non può essere eseguito automaticamente).
Ogni caso di test, indipendentemente dalla sua tipologia, dovrebbe essere descritto quanto meno dai seguenti campi:
All’atto dell’esecuzione del test, verranno aggiunti i seguenti campi:
Un test case dovrebbe sempre essere:
Nella descrizione di un test case devono quindi esserci tutte le informazioni necessarie ad un tester (umano o automatico) per rieseguire identicamente il caso di test potendone valutare l’esito in maniera non ambigua.
Il testing dei componenti (o test di unità) consiste nel testare i singoli componenti del sistema in isolamento.
É un processo di testing dei difetti.
Le unità da testare possono essere:
I casi di test (test suite) devono essere selezionati in modo da ottimizzare il più possibile efficacia ed efficienza.
Le due tipologie fondamentali di criteri di selezione sono:
1. Introduzione
4. Casi d'uso
6. Class Diagram – parte prima
7. Class diagram – parte seconda
8. Class diagram – parte terza
9. Modellazione architetturale
10. Sequence Diagram
14. Progettazione Architetturale
15. Design Patterns – Parte prima
16. Design Patterns – Parte seconda
17. Progettazione dell'interfaccia utente
Sommerville, Ingegneria del Software, 8° edizione, Capitoli 22-23-24.