1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il...

43
1 Defect testing L’obiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la presenza (non l’assenza) di errori: solo un testing esaustivo proverebbe l’assenza di difetti.

Transcript of 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il...

Page 1: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

1

Defect testing L’obiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a

comportarsi in modo anomalo I test provano la presenza (non l’assenza) di

errori: solo un testing esaustivo proverebbe l’assenza di difetti.

Page 2: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

2

I test devono sondare le caratteristiche globali del sistema nel suo insieme più che le singole componenti

Se il sistema è una nuova versionedi un sistema esistente, è più importante testare le vecchie caratteristiche che testare le nuove caratteristiche

Testare le situazioni tipiche è più importante che testare i valori alla frontiera

Priorità nel testing

Page 3: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

3

Dati di test L’insieme di input che devono essere costruiti per testare il sistema

Casi di test L’insieme di input per testare il sistema e gli output previsti in corrispondenza di questi input se il sistema soddisfa la sua specifica

Dati di test e casi di test

Page 4: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

4

Terminologia

Per definire i Casi di Test devo adottare un criterio:

Criterio C affidabile tutti i test selezionati da C hanno successo o

nessuno lo ha

Criterio C valido qualora P non sia corretto, un T selezionato C che

ha successo

Page 5: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

5

Esempio

Se C seleziona solo {0,2} è affidabile, non valido

Se C seleziona tutti i sottoinsiemi di {0,1,2,3,4} è valido, non affidabile

Se C seleziona insiemi che contengono tutti almeno un elemento < 3 è valido e affidabile

program RADDOPPIA .......read (x);y = x*x;write (y);...

Page 6: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

6

Elementi di teoria dei test

Teorema di Goodenough e Gerhart

Se

Esiste un C affidabile e valido per P

e

T è selezionato da C

e

T non ha successo su P

allora

P è corretto

Page 7: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

7

Elementi di teoria dei test

Teorema di Howden

Non si può costruire meccanicamente (mediante un programma) un test finito che soddisfi un criterio affidabile e valido

Page 8: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

8

Il processo di defect testing

Design testcases

Prepare testdata

Run programwith test data

Compare resultsto test cases

Testcases

Testdata

Testresults

Testreports

Page 9: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

9

Approcci al defect testing

Interfacetesting

Functionaltesting

Structuraltesting

Sub-systemSystemUnit andmodule

Testingteam

Developmentteam

Page 10: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

10

Black-box testing Approccio al testing in cui il sistema è visto come

una “scatola nera” I casi di test sono basati sulla specifica del

sistema La pianificazione può iniziare molto presto nel

processo software

Page 11: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

11

Black-box testingIe

Input test data

OeOutput test results

System

Inputs causinganomalousbehaviour

Outputs which revealthe presence ofdefects

Page 12: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

12

Equivalence partitioning

System

Outputs

Invalid inputs Valid inputs

Page 13: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

13

Partiziona gli input e gli output del sistema in “insiemi equivalenti” Se l’input è un intero di 5 digits tra 10,000 e 99,999,

le classi di equivalenza sono: < 10.000 da 10.000 a 99.999 (compresi) >= 100.000

Scegli i casi di test ai confini di questi insiemi 0, 9.999, 10000, 99.999, 100.000, 150.000

Equivalence partitioning

Page 14: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

14

Partizioni

Between 10000 and 99999Less than 10000 More than 99999

999910000 50000

10000099999

Input values

Between 4 and 10Less than 4 More than 10

34 7

1110

Number of input values

Page 15: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

15

Specifica di una routine di ricercaprocedure Search (Key : ELEM ; T: ELEM_ARRAY; Found : in out BOOLEAN; L: in out ELEM_INDEX) ;

Pre-condition-- the array has at least one elementT’FIRST <= T’LAST

Post-condition-- the element is found and is referenced by L( Found and T (L) = Key)

or -- the element is not in the array( not Found and

not (exists i, T’FIRST >= i <= T’LAST, T (i) = Key ))

Page 16: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

16

Input che soddisfano le precondizioni Input dove una precondizione non vale Input dove l’elemento chiave è un membro

dell’array Input dove l’elemento chiave non è un membro

dell’array

Partizioni di input

Page 17: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

17

Linee guida sul testing (arrays) Testare il programma con array che hanno solo

un singolo elemento Usa array di dimensioni diverse nei diversi test Costruisci i test in modo che gli elementi primo,

mediano e ultimo dell’array vengano visitati Testare il programma con array di lunghezza

zero (se consentito dal linguaggio di programmazione)

Page 18: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

18

Routine di ricerca: partizioni di input

Array ElementSingle value In arraySingle value Not in arrayMore than 1 value First element in arrayMore than 1 value Last element in arrayMore than 1 value Middle element in arrayMore than 1 value Not in array

Page 19: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

19

Routine di ricerca: casi di test

Input array (T) Key (Key) Output ( Found, L)17 17 true, 117 0 false, ??17, 29, 21, 23 17 true, 141, 18, 9, 31, 30, 16, 45 45 true, 717, 18, 21, 23, 29, 41, 38 23 true, 421, 23, 29, 33, 38 25 false, ??

Page 20: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

20

Chiamato talvolta white-box testing I casi di test sono ottenuti a partire dalla

struttura del programma. La conoscenza del programma viene utilzzata per identificare altri ulteriori casi di test

Obiettivo: vagliare tutti i comandi del programma (non tutti i cammini di computazione)

Testing strutturale

Page 21: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

21

Criteri White-box

Sono criteri di selezione dei casi di test basati su concetti di “copertura” della struttura interna del programma

Congettura: se un programma è stato poco sollecitato dai dati di test, potenzialmente contiene anomalie

Definito il livello desiderato di “copertura” è possibile valutare quanto progressivamente ci si avvicina all’obiettivo

Page 22: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

22

White-box testing

Componentcode

Testoutputs

Test data

DerivesTests

Page 23: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

23

1. Copertura delle istruzioni

Obiettivo: esercitare almeno una volta ogni istruzione durante il test Motivazione: se no, ci possono essere computazioni scorrette o

computazioni mai osservate

Copertura

Page 24: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

24

1 Program statement (input, output);2 var3 x,y : real;4 begin5 read(x);6 read(y);7 if x > 0 then x:=x+10;8 y:=y/x;9 write(x);10 write(y);11 end.

5

6

78

9

10

read(x)

read(y)

x:=x+10x>0

not(x>0)

y:=y/x

write(x)

write(y)S = {(x = 20, y = 30)} soddisfa il criterio

Esempio

Page 25: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

25

2. Copertura delle decisioni

Ogni arco del flusso di controllo deve venire percorso

S = {(x = 20, y = 30), (x = -3, y = 100} soddisfa il criterioMa continua a non scoprire il malfunzionamento!

Copertura

Page 26: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

26

Utilizzare valori “ai limiti” dei campi di variabilità delle decisioni, oltre a valori “all’interno”

Esempiose deve essere x 0,

provare con x = 0, oltre che con x > 0

Attitudine “fare l’avvocato del diavolo”

Arricchimento del criterio

Page 27: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

27

1 read (x,y);2 if x = 10 then3 x := x - 104 else x := |x| +1;5 if y <= 0 then6 y := (y+1)/x7 else y := x/y;8 ...

T = {(10, 5), (0, -3)} copre tutte le decisioniCosì facendo si coprono i cammini “then...else” e “else...then”, non il cammino “then...then” che genera un malfunzionamento.

Esempio

Page 28: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

28

3. Copertura dei cammini

Test strutturale esaustivo: tutti i cammini… ma il numero di cammini è infinito!

Occorre limitare il numero: quali? Criteri empirici per limitare il numero delle iterazioni Il numero dei dati di test tende comunque a crescere in maniera

non controllabile.....

Copertura

Page 29: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

29

Ricerca binaria (Ada)procedure Binary_search (Key: ELEM ; T: ELEM_ARRAY ; Found: in out BOOLEAN ; L: in out ELEM_INDEX ) is

- Preconditions-- T’FIRST < =T’LAST and-- forall i: T’FIRST..T’LAST-1, T (i) <= T(i+1)

Bott : ELEM_INDEX := T’FIRST ; Top : ELEM_INDEX := T’LAST ; Mid : ELEM_INDEX;begin L := (T’FIRST + T’LAST ) / 2; Found := T( L ) = Key; while Bott <= Top and not Found loop Mid := (Top + Bott) mod 2; if T( Mid ) = Key then Found := true; L := Mid; elsif T( Mid ) < Key then Bott := Mid + 1; else Top := Mid - 1; end if ;

end loop ;end Binary_search;

Page 30: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

30

Chiave nell’array Chiave non nell’array

Array di input con un solo elemento Array di input con numero pari di elementi Array di input con numero dispari di elementi

Ricerca binaria: partizioni di input

Page 31: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

31

Mid-point

Elements < Mid Elements > Mid

Equivalence class boundaries

Ricerca binaria: partizioni di input

Page 32: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

32

Ricerca binaria: casi di test

Input array (T) Key (Key) Output (Found, L)17 17 true, 117 0 false, ??17, 21, 23, 29 17 true, 19, 16, 18, 30, 31, 41, 45 45 true, 717, 18, 21, 23, 29, 38, 41 23 true, 417, 18, 21, 23, 29, 33, 38 21 true, 312, 18, 21, 23, 32 23 true, 421, 23, 29, 33, 38 25 false, ??

Page 33: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

33

Descrivono il flusso di controllo nel programma usati per calcolare la complessità ciclomatica

Complessità = Numero di archi - Numero di nodi +2

Grafi di flusso del programma

Page 34: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

34

Rappresentazione di un grafo di flusso di un programma

if-then-else loop-while case-of

Page 35: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

35

1

2

3

54

76

98

10

1112

13

(if not Found then...)

(while Bott <= Top loop)

(If T (mid) = Key then...)

(if T (mid) < Key then...)

Page 36: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

36

1, 2, 3, 4, 12, 13 1, 2,3, 5, 6, 11, 2, 12, 13 1, 2, 3, 5, 7, 8, 10, 11, 2, 12, 13 1, 2, 3, 5, 7, 9, 10, 11, 2, 12, 13 1, 2, 3, 5, 7, 9, 10, 11, 2, 3, 4, 12, 13 Bisogna costruire dei casi di test in modo che tutti

questi cammini siano percorsi Si può utilizzare un analizzatore dinamico per

verificare che i cammini siano stati eseguiti

Cammini indipendenti

Page 37: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

37

Il numero di test per controllare tutti i comandi di controllo è uguale alla complessità ciclomatica

La complessità ciclomatica è uguale al numero di condizioni booleane nel programma

E’ utile se usata con attenzione. Non è sempre adeguata come test e non può essere usata per programmi data-driven

Complessità ciclomatica

Page 38: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

38

Controllo e programmi data-drivencase A is when “One” => i := 1 ; when “Two” => i := 2 ; when “Three” => i := 3 ; when “Four” => i := 4 ; when “Five” => i := 5 ; end case ;

Strings: array (1..4) of STRING := (“One”, “Two”, “Three”, “Four”, “Five”); i := 1 ; loop exit when Strings (i) = A ; i := i + 1 ;end loop ;

Page 39: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

39

Questo tipo di testing va fatto quando vengono integrati moduli o sottosistemi per creare sistemi più grandi

L’obiettivo in questo caso è trovare errori dovuti alle interfacce o ad assunzioni sulle interfacce che non sono valide

È particolarmente importante nello sviluppo object-oriented, in quanto gli oggetti sono definiti a partire dalle loro interfacce

Testare le interfacce

Page 40: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

40

Tipi di interfacce Interfacce realizzate con parametri

I dati sono trasmessi da una procedura all’altra

Interfacce a memoria condivisa Due o più procedure condividono la stessa memoria

Interfacce procedurali Sottosistemi incapsulano un insieme di procedure

che devono essere chiamate da altri sottosistemi

Interfacce a passaggio di messaggi I sottosistemi richiedono servizi da altri sottosistemi

Page 41: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

41

Testare le interfacceTestcases

BA

C

Page 42: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

42

Errori nelle interfacce Cattivo uso delle interfacce

Una componente chiamante chiama un’altra componente e commette un errore nell’uso dell’interfaccia di quest’ultima, ad esempio chiamando i parametri nell’ordine sbagliato

Incomprensione di interfacce Una componente chiamante fa delle assunzioni sul

comportamento della componente chiamata che non sono valide

Errori di temporizzazione La componente chiamante e la componente chiamata operano a

velocità diversa e ciò impedisce di utilizzare informazione aggiornata

Page 43: 1 Defect testing Lobiettivo: scoprire difetti in un programma Un test ha successo se forza il programma a comportarsi in modo anomalo I test provano la.

43

Linee guida per testare interfacce Progetta i test in modo che i parametri attuali delle

procedure siano agli estremi del loro rango Testa sempre parametri di tipo riferimento con valore

NIL Progetta test che causano il fallimento della

componente Usa uno stress testing nel sistema di scambio di

messaggi Nei sistemi a memoria condivisa, cambia l’ordine in cui

le componenti sono attivate