Ingegneria del Software Testing - Tecniche di Collaudo del Software Collaudabilità Un attributo di qualità del software E il grado di semplicità con cui il software può essere collaudato Si compone di Operabilità E legato al livello di correttezza del software Meglio funziona -> è più collaudabile
Si compone di Collaudabilità () Osservabilità E la capacità del sistema a produrre risultati facilmente osservabili Controllabilità E il grado di automazione che si può ottenere per il testing Scomponibilità E il livello di grana che si può ottenere rispetto alle unità di testing atomiche Si compone di Collaudabilità (3) Semplicità (!complessità) E il livello di complessità del sistema Stabilità E il grado di stabilità del codice sorgente (rispetto alle modifiche che si devono apportare) Comprensibilità E il livello di comprensione che si ha del sistema
Caratteristiche di un Collaudo Valido Un collaudo è valido quando: Ha un elevata probabilità di trovare gli errori Non è ridondante E il migliore nella sua categoria Non è né troppo semplice né troppo complesso Tecniche di Collaudo Due tecniche di testing white-box methods black-box methods Methods Strategies 3
White-Box Testing L obiettivo è quello di assicurare che tutti gli statements e le condizioni siano eseguiti almeno una volta Black-Box Testing requirements output input events
White-Box Testing Obiettivi Progettazione dei Test Cases Scoprire malfunzionamenti Criterio In maniera completa Vincoli Con il minimo costo 5
Testing Esaustivo loop < 0 X Semplice programma C di 00 linee di codice Due cicli annidati con costrutti if 0 possibili path! Se se ne eseguissero uno ogni millisecondi ci vorrebbero 370 anni Testing Selettivo Selected path loop < 0 X 6
Path Indipendenti Un path P si dice indipendente rispetto ad un insieme di path {P, P, Pn} se introduce almeno un nuovo insieme di istruzioni o una condizione Complessità Ciclomatica V(G) = numero di decisioni semplici + E il numero di cammini indipendenti di una base E il numero max di collaudi indipendenti 7
Complessità Ciclomatica () E una valutazione quantitativa della complessità logica di un programma Da indicazioni sull attitudine di un modulo a contenere errori modules V(G) modules in this range are more error prone Testing di una Base di Cammini Indipendenti Paths indipendenti: V(G) = Ci sono paths indipendenti 3 5 6 7 8 Path :,,3,6,7,8 Path :,,3,5,7,8 Path 3:,,,7,8 Path :,,,7,,,...7,8 Ora è necessario progettare i test cases che esercitano i path individuati 8
Un Esempio di Path Testing public void calcola(int A, int B, boolean found){ C = A*B/; System.out.println("A = "+A); System.out.println("B = "+B); System.out.println("C = "+C); if(found && C>0){ D = A; E = B/; if (D > E) F = D + E; else F = D-E; } else{ D = A; E = B/; if (D > E) F = D + *E; else F = D-*E; } } } Derivazione dei Casi di Prova. Tracciare il grafo di flusso. Calcolare la complessità ciclomatica 3. Determinare i path indipendenti. Individuare dei casi di prova per i path indipendenti 9
Grafo di Flusso Un nodo per ogni blocco di istruzioni C = A*B/; System.out.println("A = "+A); System.out.println("B = "+B); System.out.println("C = "+C); if if (D > E) F = D + *E; else F = D-*E; 3 3 Grafo di Flusso () Un nodo per ogni condizione semplice Uno per ogni predicato Predicato if(found && C>0) Predicato if(found && C>0) { B; } else { B; } B 3 found C>0 B 5 0
Costrutto ciclico While Grafo di Flusso (3) while(a) i++; 3 3 public void calcola(int A, int B, boolean found){ C = A*B/; System.out.println("A = "+A); System.out.println("B = "+B); System.out.println("C = "+C); } } if(found){ D = A; E = B/; if (D > E) F = D + E; else F = D-E; } else{ D = A; 3 E = B/; } 8 5 if (D > E) F = D + *E; else F = D-*E; 6 7 3 Grafo di Flusso 3 5 D>E 9 9 0 0 8 D>E 6 3 found 7
Complessità Ciclomatica found V(G) = numero di decisioni semplici + = D>E 9 3 5 8 D>E 6 7 0 3 Path Indipendenti P =,,3,8,9,,3 P =,,3,8,0,,3 P3 =,,,5,6,,3 P =,,,5,7,,3 3 5 D>E found 8 6 7 9 0 3 D>E
Casi di Prova Consideriamo il path P =,,,9,0,3, (found) = false (A>B/) (D>E) Test Case Found = false A = B = 0 Strumento per il calcolo automatico dei cammini indipendenti Matrici di Grafi 5 e g f a 3 b c d Connesso al nodo Nodo 3 5 a 3 5 d c g e b f 3
Altre Tecniche di Collaudo Strutturale Collaudo per condizioni Collaudo per flusso dati Collaudo per cicli Cicli semplici Cicli annidati Cicli concatenati Cicli non strutturati Loop Testing Simple loop Nested Loops Concatenated Loops Unstructured Loops
Collaudo per Cicli Test dei cicli semplici Saltare completamente il ciclo Eseguire una sola volta il ciclo Eseguire volte il ciclo Eseguire n-, n ed n+ volte il ciclo, essendo n il numero di iterazioni max Test dei cicli annidati Testare il ciclo più interno come un ciclo semplice e mantenere i cicli esterni ai valori minimi Testare i cicli più esterni come cicli semplici e mantenere quelli interni a valori tipici Test di cicli concatenati Problema dell indipendenza Test di cicli non strutturati? Black-Box Testing 5
Caratteristiche Non è un approccio alternativo alle tecniche white-box, piuttosto è complementare Evidenzia Errori nei requisiti Funzionalità errate o mancanti Errori nei meccanismi di interfacciamento Limiti di performance Limiti di carico massimo Black-Box Testing requirements output input events 6
Metodi di Collaudo Black-Box Metodi basati su grafi Es. grafo degli stati così come percepiti dall esterno Utilizzo delle classi di equivalenza object # Undirected link Directed link (link weight) object # 3 Parallel links object # Node weight (value ) Metodi basati sugli scenari new file is represented as (a) menu select generates (generation time <.0 sec) allows editing of document tex t (b) contains document window Attributes: background color: white text color: default color or preferences Testing delle Applicazioni a Componenti 7
Applicazioni con Componenti Sviluppati Ad-Hoc Si effettuano i livelli di testing tradizionale Identificazione delle unità di testing con i componenti Collaudo Componente Collaudo di Sistema Collaudo di Convalida Collaudo di Integrazione Collaudo Componente Collaudo Componente Applicazioni con Componenti COTS Si effettuano i livelli di testing tradizionale Identificazione delle unità di testing con i componenti Collaudo di Sistema Collaudo di Convalida Collaudo di Integrazione Collaudo Componente Componente COTS Componente COTS Nessun collaudo di unità 8
Applicazioni con Componenti COTS () Tendenza (errata) di presumere che i componenti COTS siano corretti e non debbano essere testati Gli sviluppatori avranno sicuramente fatto molto testing prima di immetterlo sul mercato Il componente COTS è in commercio da anni perciò ho ampie garanzie che sia corretto Un componente COTS viene sviluppato per un sistema generico Le esigenze di un sistema specifico possono evidenziare criticità del componente Applicazioni con Componenti COTS (3) Il caso del razzo Arianne 5, esploso in volo a causa di un errore software Un elemento software ampiamente testato ed utilizzato per il razzo Arianne fallì per un errore di conversione dovuto alla differente piattaforma Esperienza: Mai dare per scontato che un componente COTS, per quanto testato, in un nuovo sistema funzioni correttamente La correttezza di un sistema software può essere minata dall ambiente 9
Applicazioni BB (Web Services) Enterprise Enterprise Virtual Market Enterprise Enterprise Applicazioni BB () Quale testing? Si integrano sistemi e processi esterni Posso fare testing di integrazione? Non è quasi mai possibile perché sollecito funzionalità di sistemi di altre enterprise Si possono costruire in house dei Web Services (fittizzi) che emulano quelli reali esterni e procedere al testing di integrazione Ha senso? E comunque limitato dalle stesse problematiche dell approccio top-down 0
Pressman, cap. Riferimenti Bibliografici Paragrafi [.,.5] U {.6.} http://www.sei.cmu.edu/str/descriptions/cyclomatic_bo dy.html Slides