Verifica e Validazione del Software Argomenti trattati

Transcript

Verifica e Validazione del Software Argomenti trattati
Verifica e Validazione del Software
Tecniche avanzate di Software Testing
Ingegneria del Software 2
Software Testing
1
Argomenti trattati
• Le attività di Verifica e Validazione del Software
– Le differenze fra l’approccio statico e dinamico
– L’approccio del Testing Dinamico
•
•
•
•
Richiami di concetti di base
Livelli di Testing
Tecniche di Testing Black-box e White-Box
Testing di Sistemi Object Oriented
Ingegneria del Software 2
Software Testing
2
1
Verifica e Validazione del Software
• La Verifica e Validazione (V & V) punta a
mostrare che il software è conforme alle sue
specifiche (Verifica) e soddisfa le aspettative del
cliente (Validazione).
– Verifica: Are we making the right product?
– Validazione: Are we making the product right?
• Due approcci complementari alla verifica:
– Approccio sperimentale (test, o analisi dinamica,
del prodotto)
– Approccio analitico (analisi statica del prodotto e
della sua documentazione)
Ingegneria del Software 2
Software Testing
3
Gli approcci per le attività di Verifica e Validazione
• Analisi dinamica: processo di valutazione di un sistema
software o di un suo componente basato sulla osservazione
del suo comportamento in esecuzione.
– Di solito solo queste tecniche si identificano come testing.
• Analisi statica: processo di valutazione di un sistema o di
un suo componente basato sulla sua forma, struttura,
contenuto, documentazione senza che esso sia eseguito.
Esempi sono: revisioni, ispezioni, recensioni, analisi data flow
• Analisi formale: uso di rigorose tecniche matematiche per
l’analisi di algoritmi.
– E’ usata soprattutto per la verifica del codice e dei
requisiti, specie quando questi sono specificati con
linguaggi formali (es. Z, VDM).
Ingegneria del Software 2
Software Testing
4
2
• Richiami sul Software Testing
Ingegneria del Software 2
Software Testing
5
Definizioni IEEE per il Testing
Standard IEEE 610.12-1990 :
• (1) The process of operating a system or component under
specified conditions, observing or recording the results, and
making an evaluation of some aspect of the system or component.
IEEE Std.729-1983
• (2) The process of analyzing a software item to detect the
differences between existing and required conditions (that is,
bugs) and to evaluate the features of the software item.
• See also: acceptance testing; benchmark; checkout; component
testing; development testing; dynamic analysis; formal testing;
functional testing; informal testing; integration testing; interface
testing; loopback testing; mutation testing; operational testing;
performance testing; qualification testing; regression testing;
stress testing; structural testing; system testing; unit testing.
Ingegneria del Software 2
Software Testing
6
3
Alcune definizioni
• Un programma è esercitato da un caso di test
(sottoinsieme dei dati di input)
• Un test è formato da un insieme di casi di test
• L’esecuzione del test consiste nell’esecuzione del
programma per tutti i casi di test
Ingegneria del Software 2
Software Testing
7
Scopi del Testing
•
Il testing può avere diversi obiettivi:
•
Dimostrare al cliente e allo sviluppatore che il software
soddisfa i suoi requisiti
– Si parla di Test di Convalida
– Verifica che il software si comporti adeguatamente
usando un insieme di casi di test che riflette l’uso
previsto
– Tale test ha successo se tutto funziona come ci si
aspetta
•
Scoprire gli errori o difetti del software
– Si parla di Test dei Difetti
Ingegneria del Software 2
Software Testing
8
4
Definizioni
• Errore (umano)
– incomprensione umana nel tentativo di comprendere o
risolvere un problema, o nell’uso di strumenti
• Difetto (fault o bug)
– Manifestazione nel software di un errore umano, e causa del
fallimento del sistema nell’eseguire la funzione richiesta
• Malfunzionamento (failure)
– incapacità del software di comportarsi secondo le aspettative o
le specifiche
– un malfunzionamento ha una natura dinamica: accade in un
certo istante di tempo e può essere osservato solo mediante
esecuzione
Ingegneria del Software 2
Software Testing
9
Un esempio
ERRORE di editing/digitazione
Function
RADDOPPIA ( )
....
read (x);
y := x*x;
write (y)
...
DIFETTO
=> “*” invece di “+”
DIFETTO causato da un errore
MALFUNZIONAMENTO
=> il valore visualizzato è errato
Possibile MALFUNZIONAMENTO in
esecuzione…
(può verificarsi o meno: dipende
dall’input)
Ingegneria del Software 2
Software Testing
10
5
Relazione fra Errore, Difetto e
Malfunzionamento
causa
errore
1..*
Ingegneria del Software 2
causa
Difetto
1..*
1..*
Malfunzionamento
*
Software Testing
11
Test dei Difetti
•
•
•
•
Ha lo scopo di scoprire I difetti di un programma.
Approccio usato: scoprire la presenza di difetti
osservando I malfunzionamenti!
Un test dei difetti ha successo se porta il programma a
comportarsi in maniera scorretta (cioè esibisce
malfunzionamenti)
Il testing può sono dimostrare la presenza dei difetti,
ma non la loro assenza!! (Tesi di Dijkstra)
Ingegneria del Software 2
Software Testing
12
6
Problemi e Limitazioni
•
La correttezza di un programma è un problema
indecidibile!
•
Problemi:
–
–
non vi è garanzia che se alla n-esima prova un modulo od
un sistema abbia risposto correttamente (ovvero non sono
stati più riscontrati difetti), altrettanto possa fare alla (n+1)esima
Impossibilità di produrre tutte le possibili configurazioni di
valori di input (test case) in corrispondenza di tutti i possibili
stati interni di un sistema software
Ingegneria del Software 2
Software Testing
13
Ulteriori Problemi
• In molti campi dell’ingegneria, il testing è semplificato
dall’esistenza di proprietà di continuità
– Se un ponte resiste ad un carico di 1000 tonnellate, allora
resisterà anche a carichi più leggeri
• Nel campo del software si ha a che fare con sistemi discreti,
per i quali piccole variazioni nei valori d’ingresso possono
portare a risultati scorretti
– Il testing esaustivo (ideale) è condizione necessaria per
poter valutare la correttezza di un programma a partire dal
testing
Ingegneria del Software 2
Software Testing
14
7
Software Testing
Ingegneria del Software 2
Software Testing
15
L’impossibilità del Testing Esaustivo!
Se il ciclo fosse eseguito al più 20
volte, ci possono essere oltre
100.000 miliardi di possibili
esecuzioni diverse!!!
Se ogni test fosse elaborato in 1 ms,
sarebbero necessari 3170 anni!!!
Ingegneria del Software 2
Software Testing
16
8
Il processo di Software Testing
• Un processo di testing non può dimostrare la
correttezza, ma …
• può consentire di acquistare fiducia nel software,
mostrando che esso è pronto per l’uso operativo!
• … Grande esigenza di approcci ingegneristici per ridurre
lo sforzo (inteso come impiego di risorse umane,
tecnologiche e di tempo) per poter individuare il
massimo numero possibile di difetti (con il minimo
numero di test case possibile) prima che il prodottto sia
rilasciato!
Ingegneria del Software 2
17
Software Testing
Il Processo di Software Testing
Test
cases
Design test
cases
Ingegneria del Software 2
Test
data
Prepar e test
data
Test
results
Run pr ogram
with test da ta
Software Testing
Test
repor ts
Compar e results
to test cases
18
9
La qualità di un Processo di Testing
• Il Testing deve essere:
– Efficace
• Condotto attraverso strategie che consentano la scoperta di quanti più
difetti possibili;
– Efficiente
• In grado di trovare difetti provando il minor numero possibile di casi di
test
• circa il 40% dei costi di produzione del software per il raggiungimento di
ragionevoli livelli di qualità sono richiesti dal testing
– Ripetibile
• Potrebbe non essere possibile se l’esecuzione del caso di test
influenza l’ambiente di esecuzione senza la possibilità di
ripristinarlo
• Potrebbe non essere possibile se nel software ci sono degli
elementi indeterministici
– Ovvero dipendenti da input non controllabili
Ingegneria del Software 2
Software Testing
19
Software Testing
20
• Livelli di Testing
Ingegneria del Software 2
10
Diversi Livelli di Testing
• Livello Produttore:
– Testing di Unità (o di Componente)
– Testing di Integrazione
– Testing di Sistema
• Livello Cooperativo Produttore-Utente Privilegiato:
– Alpha testing
– Beta testing
• Livello Utente:
– Testing di Accettazione
Ingegneria del Software 2
21
Software Testing
Fasi del Testing (a livello Produttore)
Component
testing
Software developer
Ingegneria del Software 2
System
testing
Independent testing team
Software Testing
22
11
Livello Produttore
•
Test dei Componenti (o di Unità)
–
•
–
Testing di singole unità di codice (funzioni, oggetti, componenti
riusabili);
É responsabilità di chi sviluppa il componente;
–
I test sono derivati in base all’esperienza dello sviluppatore.
Test di Sistema
–
–
–
Testing di gruppi di componenti integrati per formare il sistema o
un sotto-sistema;
É responsabilità di un team indipendente per il testing;
I test sono definiti in base alla specifica del sistema.
Ingegneria del Software 2
Software Testing
23
Livello Produttore
• Test di Integrazione
– Richiede la costruzione del sistema a partire dai suoi
componenti ed il testing del sistema risultante per scoprire
problemi che nascono dall’interazione fra I vari componenti.
– Richiede l’identificazione di gruppi di componenti che realizzano
le varie funzionalità del sistema e la loro integrazione mediante
componenti che li fanno lavorare insieme.
– Partendo da una architettura organizzata gerarchicamente, le
integrazioni possono essere realizzate con approccio top-down
o bottom-up o misto.
Ingegneria del Software 2
Software Testing
24
12
Strategie per il Testing di Integrazione
Top-down testing
Bottom-up testing
Sandwich testing
driver driver driver
UI Layer
UI Layer
stub stub stub
Database Network
layer
layer
UI Layer
driver driver driver
driver driver driver
Functional layer
Functional layer
Database Network
layer
layer
stub stub stub
Database Network
layer
layer
stub stub stub
UI Layer
Fully Functional layer
integrated
Network
system Database
layer
layer
Ingegneria del Software 2
25
Software Testing
Esecuzione del testing di integrazione
• Costruzione di Moduli guida (driver)
– invocano l’unità sotto test, inviandole opportuni
valori, relativi al test case
Modulo
guida
Unità
sotto test
• Moduli fittizi (stub)
– sono invocati dall’unità sotto test;
– emulano il funzionamento della funzione chiamata
rispetto al caso di test richiesto (tenendo conto delle
specifiche della funzione chiamata)
Modulo
fittizio
• Quando la funzione chiamata viene realizzata e
testata, si sostituisce lo stub con la funzione stessa
Ingegneria del Software 2
Software Testing
26
13
Livello produttore-utente privilegiato
• Alpha testing:
– uso del sistema da parte di utenti reali ma nell'ambiente di
produzione e prima della immissione sul mercato.
• Beta Testing:
– installazione ed uso del sistema in ambiente reale prima
della immissione sul mercato.
• tipicamente adottati dai produttori di packages
per mercato di massa!
Ingegneria del Software 2
Software Testing
27
Testing di Accettazione
• Testing effettuato sull’intero sistema sulla base di un piano e
di procedure approvate dal cliente (o utente);
• l’obiettivo é quello di mettere il cliente, l'utente o altri a ciò
preposti (collaudatori o enti ad hoc) in condizione di decidere
se accettare il prodotto;
• Occorre provare che il software fornisce tutte le funzionalità,
le prestazioni, l’affidabilità, etc. richieste, e che non fallisca.
• É in genere un testing black-box (a scatola nera):
– Basato solo sulle specifiche del software;
– I Tester non accedono al suo codice.
• è a carico del committente;
• .. è più 'una dimostrazione che un test'
Ingegneria del Software 2
Software Testing
28
14
• Il Testing dei Requisiti Non Funzionali
Ingegneria del Software 2
Software Testing
29
Performance testing
•
•
•
Dopo che il sistema è stato completamente integrato, è
possibile testarne le proprietà emergenti, come le
prestazioni ed affidabilità.
I test di prestazione in genere riguardano il carico e si
pianificano test in cui il carico viene incrementato
progressivamente finché le prestazioni diventano
inaccettabili.
Il carico deve essere progettato in modo da
rispecchiare le normali condizioni di utilizzo.
Ingegneria del Software 2
Software Testing
30
15
Stress testing
•
•
•
•
Nello stress testing si sollecita il sistema con un carico
superiore a quello massimo previsto: in queste
condizioni in genere I difetti vengono alla luce.
Stressando il sistema si può testare il comportamento
in caso di fallimento.
L’eventuale fallimento dovrebbe essere ‘leggero’ e non
produrre effetti catastrofici. Si deve controllare che non
ci siano perdite inaccettabili di servizio e di dati.
Lo Stress testing è particolarmente rilevante per
sistemi distribuiti che possono mostrare severe
degradazioni delle prestazioni quando la rete è
sommersa di richieste.
Ingegneria del Software 2
Software Testing
31
Altri tipi di Testing (di requisiti Non-Funzionali)
• Testing di Compatibilità
– will have to uncover failures due to the usage of different
platforms or different releases or configurations of them. The
large variety of possible combinations of all the components
involved in the execution of an application does not make it
feasible to test all of them, so that usually only most common
combinations are considered. As a consequence, just a subset of
possible compatibility failures might be uncovered.
• Testing di Accessibilità
– Aims to verify that access to the content of the application is
allowed even in presence of reduced hardware/ software
configurations on the client side of the application (such as
browser configurations disabling graphical visualization, or
scripting execution), or of users with physical disabilities (such as
blind people).
Ingegneria del Software 2
Software Testing
32
16
Altri tipi di Testing
• Testing di Sicurezza
– Aims to verify the effectiveness of the overall system
defenses against undesired access of unauthorized
users, as well as their capability to preserve system
resources from improper uses, and to grant the
access to authorized users to authorized services and
resources.
• Testing di Usabilità
– aims to verify to what extent an application is easy
to use
Ingegneria del Software 2
Software Testing
33
• Problemi dei Processi di testing
Ingegneria del Software 2
Software Testing
34
17
Problemi chiave di un processo di testing
•
•
•
Selezione dei Casi di Test
Valutazione dei risultati del Test
Terminazione del Testing
Test
cases
Design test
cases
Test
data
Prepar e test
data
Ingegneria del Software 2
Test
results
Run pr ogram
with test da ta
Test
repor ts
Compar e results
to test cases
Software Testing
35
1. Valutazione dei risultati del test
• 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. Due tipi di Oracolo:
• Oracolo umano
– si basa sulle specifiche o sul giudizio
• Oracolo automatico
– generato dalle specifiche (formali)
– stesso software ma sviluppato da altri
– versione precedente (test di regressione)
Ingegneria del Software 2
Software Testing
36
18
Il ruolo dell’Oracolo
Casi di test
Software
da
testare
Oracolo
Comparatore
Risultati del test
Ingegneria del Software 2
Software Testing
37
2. Terminazione del testing
• Dal momento che il testing esaustivo è, in generale,
irraggiungibile, altri criteri sono proposti per valutare
quando il testing possa essere terminato:
– Criterio temporale: periodo di tempo predefinito
– Criterio di costo: sforzo allocato predefinito
– Criterio di copertura:
• percentuale predefinita degli elementi di un modello di programma
• legato ad un criterio di selezione dei casi di test
– Criterio statistico
• MTBF (mean time between failures) predefinito e confronto con un
modello di affidabilità esistente
Ingegneria del Software 2
Software Testing
38
19
3. Problema della selezione dei casi di test
• Premesso che:
• Un programma è esercitato da un caso di test
(sottoinsieme dei dati di input)
• Un test è formato da un insieme di casi di test
• L’esecuzione del test consiste nell’esecuzione
del programma per tutti i casi di test
• Un test ha successo se rileva uno o più
malfunzionamenti del programma
Ingegneria del Software 2
Software Testing
39
Test Ideale ed Esaustivo
• Un test è ideale se l’insuccesso del test implica la
correttezza del programma
• Un test esaustivo è un test che contiene tutti i
dati di ingresso al programma
– un test esaustivo è un test ideale
– un test esaustivo non è pratico e quasi sempre non è
fattibile
• Obiettivo realistico: selezionare casi di test che
approssimano un test ideale
Ingegneria del Software 2
Software Testing
40
20
Criterio di Selezione dei Test
• Specifica le condizioni che devono essere soddisfatte da un test
e consente di selezionare più test per uno stesso programma.
• Un criterio di selezione di test C è affidabile per un programma
se per ogni coppia di test selezionati da C, T1 e T2, se il test T1
ha successo, allora anche T2 ha successo e viceversa.
– Quindi tutti i possibili esemplari di test generati dal criterio C hanno la
stessa capacità di ricerca di un malfunzionamento
• Un criterio di selezione di test C è valido per un programma se,
qualora il programma non è corretto, esiste almeno un test
selezionato da C che ha successo.
• Se un criterio è affidabile e valido, allora qualsiasi test T generato
da C per un programma non corretto avrà successo.
Ingegneria del Software 2
Software Testing
41
Esempio
• Program
raddoppia
• (input, output);
• var x, y: integer;
• begin
•
read(x);
•
y:= x*x;
•
write(y);
• end
Ingegneria del Software 2
• Criterio affidabile ma non valido:
• T deve contenere sottoinsiemi di
{0, 2}
• Criterio valido ma non affidabile :
• T deve contenere sottoinsiemi di
{0,1, 2, 3, 4}
• Criterio valido e affidabile:
• T deve contenere almeno un
valore maggiore di 3
Software Testing
42
21
Selezione dei casi di test
•
•
Teorema di Goodenough e Gerhart
Il fallimento di un test T per un programma P, selezionato da
un criterio C affidabile e valido, permette di dedurre la
correttezza del programma P
•
Teorema di Howden
– Non esiste un algoritmo che, dato un programma arbitrario P, generi
un test ideale finito, e cioè un test definito da un criterio affidabile e
valido
Al di là di casi banali, non è possibile costruire un criterio di
selezione generale di test valido e affidabile che non sia il test
esaustivo
•
•
Obiettivi pratici
– massimizzare il numero di malfunzionamenti scoperti (richiede molti
casi di test)
– minimizzare il numero di casi di test (e quindi il costo del testing)
•
E’ preferibile usare più di un criterio di selezione dei test !
Ingegneria del Software 2
Software Testing
43
Software Testing
44
• Tecniche di Testing
Ingegneria del Software 2
22
Due principali Tecniche di Testing
•
Testing funzionale (o Black Box):
–
–
–
–
–
•
Richiede l’analisi degli output generati dal sistema (o da suoi
componenti) in risposta ad input (test cases) definiti sulla
base della sola conoscenza dei requisiti del sistema (o di
suoi componenti).
Testing basato sui requisiti;
Testing delle partizioni;
Test basato su Tabelle di Decisione;
Test basato su Grafi Causa-Effetto.
Testing strutturale (o White Box).
–
fondato sulla conoscenza della struttura del software, ed in
particolare del codice, degli input associati e dell’oracolo, per
la definizione dei casi di prova.
Ingegneria del Software 2
Software Testing
45
1- Testing basato sui requisiti
•
Il principio della verificabilità dei requisiti afferma
che i requisiti dovrebbero essere testabili, cioè
scritti in modo da poter progettare test che
dimostrino che il requisito è stato soddisfatto.
•
Il testing basato sui requisiti è una tecnica di
convalida dove vengono progettati vari test per
ogni requisito .
Ingegneria del Software 2
Software Testing
46
23
Un esempio: I Requisiti di LIBSYS
L’utente deve poter eseguire ricerche o in tutti i database o
in un sotto-insieme di essi.
Il sistema dovrebbe fornire appropriati visualizzatori per
leggere i vari documenti offerti.
Ad ogni ordine dovrebbe essere associato un identificatore
(ORDER_ID) che l’utente deve poter copiare nella sua
area di memoria buffer.
Ingegneria del Software 2
Software Testing
47
Testing di LIBSYS
• Inizializzare le ricerche utente di elementi che sono sia presenti che
non presenti, con l’insieme dei database fatto da un solo database.
•Inizializzare le ricerche utente di elementi che sono sia presenti che
non presenti, con l’insieme di database fatto da 2 database.
•Inizializzare le ricerche utente di elementi che sono sia presenti che
non presenti, con l’insieme di database fatto da più di 2 database.
•Selezionare un database e inizializzare ricerche di articoli presenti e
non presenti.
•Selezionare più di un database e inizializzare ricerche di articoli
presenti e non presenti
Ingegneria del Software 2
Software Testing
48
24
2- Testing delle Partizioni (o delle Classi di
Equivalenza)
•
I dati di input ed output possono essere in genere
suddivisi in classi dove tutti I membri di una stessa
classe sono in qualche modo correlati.
•
Ognuna delle classi costituisce una classe di equivalenza
(una partizione) ed il programma si comporterà
(verosimilmente) nello stesso modo per ciascun membro
della classe.
•
I casi di Test dovrebbero essere scelti all’interno di
ciascuna partizione.
Ingegneria del Software 2
Software Testing
49
Equivalence partitioning
Invalid inputs
Valid inputs
System
Outputs
Ingegneria del Software 2
Software Testing
50
25
Suddivisione in classi di equivalenza
• Le partizioni sono identificate usando le specifiche
del programma o altra documentazione.
• Una possibile suddivisione è quella in cui la classe di
equivalenza rappresenta un insieme di stati validi o non
validi per una condizione sulle variabili d’ingresso.
Ingegneria del Software 2
Software Testing
51
Esempio
•
Una condizione di validità per un input password
è che la password sia una stringa alfanumerica
di lunghezza compresa fra 6 e 10 caratteri.
•
Una classe valida CV1 è quella composta dalle
stringhe di lunghezza fra 6 e 10 caratteri.
•
•
•
Due classi non valide sono:
CNV2 che include le stringhe di lunghezza <6
CNV3 che include le stringhe di lunghezza >10
Ingegneria del Software 2
Software Testing
52
26
Generalizzando…
• Se la condizione sulle variabili d’ingresso specifica:
– intervallo di valori
• una classe valida per valori interni all’intervallo, una non valida
per valori inferiori al minimo, e una non valida per valori superiori
al massimo
– valore specifico
• una classe valida per il valore specificato, una non valida per
valori inferiori, e una non valida per valori superiori
– elemento di un insieme discreto
• una classe valida per ogni elemento dell’insieme, una non valida
per un elemento non appartenente
– valore booleano
• una classe valida per il valore TRUE, una classe non valida per
il valore FALSE
Ingegneria del Software 2
Software Testing
53
Selezione dei casi di test dalle classi di equivalenza
• Ogni classe di equivalenza deve essere coperta da
almeno un caso di test
– Un caso di test per ogni classe non valida
– Ciascun caso di test per le classi valide deve comprendere il
maggior numero di classi valide ancora scoperte.
Ingegneria del Software 2
Software Testing
54
27
Esercizio
• In un modulo Web bisogna inserire la propria
data di nascita, composta di giorno (numerico),
mese (stringa che può valere gennaio …
dicembre), anno (numerico, compreso tra 1900 e
2000)
• Selezionare i casi di test mediante
partizionamento in classi di equivalenza
Ingegneria del Software 2
Software Testing
55
Le condizioni sull’input ‘giorno’
•Condizioni d’ingresso:
• Il giorno può essere compreso tra 1 e 31
•Classi di equivalenza :
• Valida
CE1 : 1 ? GIORNO ? 31
• Non valide
CE2 : GIORNO < 1
CE3 : GIORNO > 31
CE4 : GIORNO non è un numero intero
Ingegneria del Software 2
Software Testing
56
28
Le condizioni sull’input ‘mese’
•Condizioni di ingresso:
– Il mese deve essere nell’insieme M=(gennaio, febbraio, marzo,
aprile, maggio, giugno, luglio, agosto, settembre, ottobre,
novembre, dicembre)
•Classi di equivalenza
– Valide
CE51: MESE = gennaio, CE52: MESE = febbraio, CE53: MESE = marzo,
…. (Tot. 12 classi di equivalenza)
- Non valida
CE6: MESE ? M
Ingegneria del Software 2
Software Testing
57
Le condizioni sull’input ‘anno’
•Condizioni di ingresso:
– Deve essere compreso tra 1900 e 2000
•Classi di equivalenza
•
Valida
CE7: 1900<= ANNO<=2000
•
Non valide
CE8: ANNO< 1900
CE9: ANNO> 2000
CE10: ANNO non è un numero intero
Ingegneria del Software 2
Software Testing
58
29
Scelta dei casi di test ...
Test case
TC1
TC2
TC3
TC4
Giorno
1
1
1
1
Mese
gennaio
febbraio
marzo
aprile
Anno
1980
1492
2018
duemila
Classi coperte
CE1, CE51, CE7
CE1, CE52, CE8
CE1, CE53, CE9
CE1, CE54, CE10
Test case
TC5
TC6
TC7
TC8
Giorno
1
0
35
primo
Mese
brumaio
maggio
giugno
luglio
Anno
1980
1980
1980
1980
Classi coperte
CE1, CE6, CE7
CE2, CE55, CE7
CE3, CE56, CE7
CE4, CE57, CE7
Ogni TC copre al più una CE non valida!
Ingegneria del Software 2
59
Software Testing
Scelta dei casi di test
Test case
TC9
TC10
T11
TC12
Giorno
1
1
1
1
Mese
agosto
settembre
ottobre
novembre
Anno
1980
1980
1980
1980
Classi coperte
CE1, CE58, CE7
CE1, CE59, CE7
CE1, CE510, CE7
CE1, CE511, CE7
Test case
TC13
Giorno
1
Mese
dicembre
Anno
1980
Classi coperte
CE1, CE512, CE7
Ingegneria del Software 2
Software Testing
60
30
Problemi
• A volte é necessario tenere conto delle pre-condizioni e postcondizioni di una funzione nella scelta delle classi di equivalenza.
• Ad esempio la ricerca di un elemento in un vettore darà esito
diverso a seconda delle precondizioni:
– Pre-condizione 1: elemento presente nel vettore
– Pre-condizione 2: elemento non presente
• Potrò definire ulteriori classi di equivalenza :
– CE1: gli input validi che sono contenuti nel vettore
– CE2: gli input validi che non appartengono al vettore.
Ingegneria del Software 2
Software Testing
61
Problemi
• L’appartenenza ad una classe di equivalenza può
dipendere dallo stato dell’applicazione (es. Lo stato del
vettore dell’esempio precedente)
•
– Non sempre è possibile determinare lo stato nè settare
precondizioni e postcondizioni.
– Comunque, questo problema deve essere affrontato al
momento di eseguire il test, non quando si progettano I test!
Ingegneria del Software 2
Software Testing
62
31
3-Testing basato su Tabelle di Decisione
• Le tabelle di Decisione sono uno strumento per la
specifica black-box di componenti in cui:
– A diverse combinazioni degli ingressi corrispondono
uscite/azioni diverse;
– Le varie combinazioni possono essere rappresentate come
espressioni booleane mutuamente esclusive;
– Il risultato non deve dipendere da precedenti input o output,
né dall’ordine con cui vengono forniti gli input.
Ingegneria del Software 2
Software Testing
63
Costruzione della Tabella di Decisione
• Le colonne della Tabella rappresentano le combinazioni
degli input a cui corrispondono le diverse azioni.
• Le righe della tabella riportano i valori delle variabili di
input (nella Sezione Condizioni) e le azioni eseguibili
(nella Sezione Azioni)
• Ogni distinta combinazione degli input viene chiamata
una Variante.
• Un esempio: la tabella di decisione per la procedura di
rinnovo annuale delle polizze automobilistiche di una
compagnia di assicurazioni…
Ingegneria del Software 2
Software Testing
64
32
Un esempio di Tabella di decisione
Varianti
Con
dizio
ni
1
2
3
4
5
Numero
incidenti
0
0
1
1
Tra 2 e Tra 2 e 5 o più
4
4
Età
assicurato
<=25
>=26
<=25
>=26
<=25
>=26
Qualsias
i
50
25
100
50
400
200
0
Lettera
No
No
Sì
no
Sì
Sì
No
Polizza
Cancellata
No
No
No
No
No
No
Sì
Azion Aumento
i
Premio ($)
Ingegneria del Software 2
6
7
Software Testing
65
Varianti Esplicite ed Implicite
• Nella tabella, l’operatore logico fra le condizioni è di
And;
• Nell’esempio precedente abbiamo 6 condizioni sugli
input e 7 varianti significative, ma in generale esistono
più combinazioni possibili.
• Quante combinazioni di condizioni sono in generale
possibili?
– Per n condizioni, 2n varianti (ma non tutte sono plausibili)- sono
dette varianti implicite.
– Il numero di varianti esplicite (significative) è in genere
minore!
Ingegneria del Software 2
Software Testing
66
33
Generazione dei Test
• Un possibile Criterio di Copertura della Tabella:
– Copertura di tutte le varianti esplicite
– Un Test Case per ogni variante
Ingegneria del Software 2
Software Testing
67
4-Testing basato su Grafi Causa-Effetto
• I Grafi Causa-Effetto sono un modo alternativo per
rappresentare le relazioni fra condizioni ed azioni di una
Tabella di Decisione.
• Il grafo prevede un nodo per ogni causa (variabile di
decisione) e uno per ogni effetto (azione di output).
Cause ed Effetti si dispongono su linee verticali opposte.
• Alcuni effetti derivano da una singola causa (e sono
direttamente collegati alla relativa causa).
• Altri effetti derivano da combinazioni fra cause
esprimibili mediante espressioni booleane (con operatori
AND, OR e NOT).
Ingegneria del Software 2
Software Testing
68
34
Il Grafo Causa-Effetto per l’esempio precedente
Età<=25
?
?
?
?
Età>=26
0 Incidenti
1 Incidenti
$25
?
$50
$100
?
?
Tra 2 e 4 Inc.
$200
$400
?
Lettera di avviso
>=5 Incidenti
?
Cancellazione polizza
= AND, ?
=OR, ~= NOT
Ingegneria del Software 2
69
Software Testing
Varianti
Con
dizio
ni
1
2
3
4
5
6
7
Numero
incidenti
0
0
1
1
Tra 2 e 4
Tra 2 e 4
5o
più
Età
<=25
>=26
<=25
>=26
<=25
>=26
Qual
siasi
Aumento
Premio
($)
50
25
100
50
400
200
0
Lettera
No
No
Sì
no
Sì
Sì
No
Polizza
No
Cancellat
a
No
No
No
No
No
Sì
assicurat
o
Azio
ni
Ingegneria del Software 2
Software Testing
70
35
Grafi Causa- Effetto
• Vantaggi:
– rappresentazione grafica ed intuitiva,
– È conveniente sviluppare tale grafo se non si ha già a
disposizione una tabella di decisione
– È possibile derivare una funzione booleana dal grafo causaeffetto (che consente di esprimere in maniera compatta tutte le
possibili combinazioni di cause)
– Può essere usata facilmente per la verifica del comportamento
del software
• Svantaggi
– al crescere della complessità della specifica, il grafo può
divenire ingestibile
Ingegneria del Software 2
Software Testing
71
Generazione dei Test
• Copertura di tutte le possibili combinazioni d’ingresso
– Può diventare impraticabile, al crescere delle combinazioni
– Una semplificazione: si può partire dagli effetti e percorrere il
grafo all’indietro cercando alcune combinazioni degli ingressi
che rendono vero l’effetto considerato.
– Non tutte le combinazioni possibili saranno considerate, ma
solo alcune che soddisfano alcune specifiche euristiche.
• Es. combinazione di OR di cause che deve essere vera -> si
considera una sola causa vera per volta
• AND di cause che deve essere falsa-> si considerano
combinazioni con una sola causa falsa
Ingegneria del Software 2
Software Testing
72
36
• Macchine a Stati e State-Base Testing
• Ref. R. Binder “Testing Object-Oriented SystemsModels, Patterns and Tools”, Addison Wesley
Ingegneria del Software 2
Software Testing
73
Macchina a Stati (State Machine)
• Macchina a Stati: è un modello (o specifica) del
comportamento dinamico di un sistema, indipendente dalla
sua implementazione.
• Si basa sui seguenti elementi fondamentali:
• stato: situazione astratta nel ciclo di vita di una entità (ad esempio,
lo stato del contenuto di un oggetto)
• evento: un particolare input (es. un messaggio, o chiamata di un
metodo)
• azione: il risultato, l’output o l’operazione che segue un evento
• transizione: una sequenza ammessa fra due stati, ossia un
cambiamento di stato causato da un evento.
• guardia: una espressione predicativa associata ad un evento, che
stabilisce una condizione Booleana che deve essere verificata
affinchè la transizioni scatti
Ingegneria del Software 2
Software Testing
74
37
Le azioni possono essere
associate sia agli stati che
alle transizioni
Ingegneria del Software 2
Software Testing
75
Diversi Tipi di Macchine a Stati
• Automa a Stati Finiti (FSM)
– senza guardie, né azioni associate a stati né a transizioni
• Macchina di Mealy
– le azioni sono associate solo alle transizioni, e non agli stati, che sono
stati passivi
• Macchina di Moore
– azioni associate solo agli stati, non alle transizioni
• Statechart
– Sono possibili Stati gerarchici, o super-stati (ossia aggregati di altri
stati)
• State transition diagram: è una rappresentazione in forma di
grafo di una Macchina a Stati
• State transition table: rappresentazione tabellare della Macchina a
Stati
Ingegneria del Software 2
Software Testing
76
38
Un esempio di Macchina di Mealy
• Per rappresentare la dinamica di un video-gioco (es. ping-pong,
squash, etc.) fra due giocatori.
• Ciascun giocatore ha un bottone di start e uno di reset
• Il giocatore che preme lo start per primo, comincia a servire
• Il giocatore corrente serve e viene eseguito un lancio:
– Se chi ha servito sbaglia il colpo, l’avversario guadagna il
servizio
– Se l’avversario di chi ha servito sbaglia il colpo, il punteggio di
chi ha il servizio viene incrementato e questi continua a servire;
– Se l’avversario di chi ha servito perde la palla ed il punteggio di
chi ha il servizio è a -1 punto dalla vittoria, questi diventa il
vincitore (es. si vince a 21 punti)
Ingegneria del Software 2
Software Testing
77
La Macchina di Mealy corrispondente
Ingegneria del Software 2
Software Testing
78
39
Proprietà Generali delle Macchine a Stati
• Sono tipicamente modelli incompleti (per problemi di scalabilità):
– Solo stati, eventi e transizioni più importanti vengono rappresentate
– In genere solo gli eventi leciti sono associati a transizioni; eventi
illeciti (quali p1_Start dallo stato Player 1 served) non sono specificati
• Può essere Deterministico o Non Deterministico
– Deterministico: ogni tripla stato/evento/guardia innesca una sola
transizione
– Non Deterministico: la stessa tripla stato/evento/guardia può
innescare varie transizioni, a seconda dei casi
• Può avere vari stati finali (o nessuno: computazione infinita)
• Può avere eventi vuoti (transizioni di default )
• Può essere concorrente: la macchina (statechart) può essere in vari
stati contemporaneamente
Ingegneria del Software 2
Software Testing
79
Il ruolo delle Macchine a Stati nel software testing
• Supportano l’esecuzione di attività di model testing, dove un modello
eseguibile (la state machine) del sistema viene eseguito o simulato
con sequenze di eventi che costituiscono i casi di test, ancor prima
dell’implementazione.
• Consentono di eseguire il testing dell’implementazione del sistema
rispetto ad una sua specifica (la state machine)
• Supportano la generazione automatica di test cases a livello del
codice:
– È richiesto un mapping esplicito fra gli elementi della macchina
(states, events, actions, transitions, guards) ed i corrispondenti
elementi dell’implementazione (e.g., classes, objects, attributes,
messages, methods, expressions)
– Lo stato corrente della macchina deve essere verificabile o
dall’ambiente di runtime o dall’implementazione stessa (built-in tests
con asserzioni e invarianti di classe)
Ingegneria del Software 2
Software Testing
80
40
Il problema della Validazione delle Macchine a Stati
• Per eseguire sia il Model Testing o il Testing dell’implementazione
occorre usare delle Checklist per verificare che la macchina a stati sia
completa e consistente:
– deve esserci uno stato iniziale con sole transizioni uscenti;
– deve esserci almeno uno stato finale con sole transizioni entranti;
– non deve presentare stati equivalenti (cioè stati per i quali
qualunque sequenza di eventi produce identiche sequenze di azioni
risultanti)
– Ogni stato deve essere raggiungibile dallo stato iniziale
– Deve esserci almeno uno stato finale raggiungibile da ogni stato
– Ogni evento ed azione devono apparire in almeno una transizione (o
stato)
– Tranne che per gli stati iniziale e finale, ogni stato ha almeno una
transizione entrante ed una uscente
Ingegneria del Software 2
Software Testing
81
… Checklist per la validazione
• for deterministic machines, the events accepted in a particular state are
unique or differentiated by mutually exclusive guard expressions;
• the state machine is completely specified: every state/event pair has at least
one transition, resulting in a defined state; or there is an explicit specification
of an error-handling or exception-handling mechanism for events that are
implicitly rejected (with no specified transition)
• the entire range of truth values (true, false) must be covered by the guard
expressions associated with the same event accepted in a particular state
• the evaluation of a guard expression does not produce any side effects in the
implementation under test
• no action produces side effects that would corrupt or change the resultant
state associated with that action
• a timeout interval (with a recovery mechanism) is specified for each state
• state, event and action names are unambiguous and meaningful in the
context of the application
Ingegneria del Software 2
Software Testing
82
41
Difetti sul Controllo rispetto alle State Machine
• Un difetto sul controllo consente a sequenze scorrette di
eventi di essere accettate, o produce sequenze scorrette di
azioni di output.
• Nell’eseguire il testing basato su macchine a stati, occorre cercare di
verificare la presenza dei seguenti tipi di difetto sul controllo:
–
–
–
–
Transizioni mancanti (non accade nulla a seguito di un evento)
Transizioni scorrette (verso stati scorretti)
Eventi mancanti o scorretti
Azioni mancanti o scorrette (cose scorrette accadono a seguito di una
transizione)
– Uno stato extra, mancante, o corrotto (comportamento impredicibile)
– Uno sneak path (un evento è accettato quando non dovrebbe)
– Una trap door (l’implementazione accetta eventi non previsti)
Ingegneria del Software 2
Software Testing
83
Esempio di Difetto: Transizione Mancante
Ingegneria del Software 2
Software Testing
84
42
Esempio di Difetto: Transizione Scorretta
Ingegneria del Software 2
Software Testing
85
Esempio di Difetto: Azioni Mancanti
Ingegneria del Software 2
Software Testing
86
43
Esempio di Difetto: Azione Scorretta
Ingegneria del Software 2
Software Testing
87
Esempio di Difetto: Sneak Path
Ingegneria del Software 2
Software Testing
88
44
Esempio di Difetto: Trap Door
Ingegneria del Software 2
Software Testing
89
Strategie per il Progetto dei Test
nello State-based testing
• Si usano gli stessi concetti di Copertura visti nel testing
white-box:
• Test Case = sequenza di eventi di input
– all-events coverage: ogni evento della macchina a stati viene
incluso nella test suite (fa parte di almeno un test case)
– all-states coverage: ogni stato della macchina è esercitato almeno
una volta da qualche test della test suite
– all-actions coverage: ogni azione è eseguita almeno una volta
• Questi criteri non definiscono una adeguata copertura in quanto:
– posso riuscire ad esercitare tutti gli eventi, ma non visitare tutti gli
stati o produrre tutte le azioni; posso visitare tutti gli stati, ma
perdere eventi od azioni; posso mancare coppie evento/azione
scorrette.
Ingegneria del Software 2
Software Testing
90
45
Altri Criteri di Copertura
• all-transitions: ogni transizione è esercitata almeno una volta
– implica le coperture all-events, all-states, e all-actions
– Posso rilevare transizioni mancanti, coppie evento/azione scorrette o mancanti (mi
accorgo che l’azione associata ad un evento è scorretta), che lo stato risultante
raggiunto è scorretto (se lo stato è osservabile), o che viene raggiunto un extra
stato
– Se lo stato non è osservabile, non si può provare che viene raggiunto uno stato
scorretto; inoltre, non si rileva la presenza di extra-transizioni.
• all n-transition sequences: ogni sequenza di transizioni di n eventi deve
essere esercitata almeno una volta
– all transitions = all 1-transition sequences
– all n-transition sequences implies (subsumes) all (n-1)-transition sequences
– Si possono scoprire alcuni stati scorretti o corrotti
• all round-trip paths: ogni sequenza di transizioni che parte e termina nello
stato stato viene esercitata almeno una volta
– Può rilevare tutte le coppie evento/azione scorrette o mancanti
• exhaustive: ogni cammino sulla macchina a stati è esercitato almeno una
volta
– In genere impossibile e quasi sempre impraticabile
Ingegneria del Software 2
Software Testing
91
Esempio: All-states Coverage
Ingegneria del Software 2
Software Testing
92
46
All-transitions coverage
Ingegneria del Software 2
Software Testing
93
Applicazioni dello State Based Testing
• Nasce per il testing di Circuiti (Hardware)
• È stato adottato per il testing software fin dagli anni ’70
• Tipicamente usato per il testing di unità per software
Object-Oriented
• Usato anche per il testing di GUI e di Sistema
Ingegneria del Software 2
Software Testing
94
47
• Testing Strutturale (o White Box)
Ingegneria del Software 2
Software Testing
95
Testing Strutturale (White Box)
• Il Testing White Box è un testing strutturale, poichè
utilizza la struttura interna del programma per ricavare i
dati di test.
• Tramite il testing White Box si possono formulare
criteri di copertura più precisi di quelli formulabili
con testing Black Box
– Test White Box che hanno successo possono fornire maggiori
indicazioni al debugger sulla posizione dell’errore
Ingegneria del Software 2
Software Testing
96
48
Criteri di Copertura
• Fondate sull’adozione di metodi di Copertura degli
oggetti che compongono la struttura dei programmi:
• istruzioni – strutture controllo – flusso di controllo -…
• definizione di un insieme di casi di test (input data) in
modo tale che gli oggetti di una definita classe (es.
istruzioni, archi del GFC, predicati, strutture di
controllo, etc.) siano attivati (coperti) almeno una
volta nell'esecuzione dei casi di test
Ingegneria del Software 2
Software Testing
97
Criteri di Copertura e relative Misure di Test
Effectiveness
• Criteri di selezione
• Copertura dei comandi
(statement test)
• Copertura delle decisioni
(branch test)
• Copertura delle condizioni
(condition test)
• Copertura delle decisioni e
delle condizioni
• Copertura dei cammini
(path test)
• Copertura dei cammini
indipendenti
Ingegneria del Software 2
• Criteri di adeguatezza
• n.ro comandi eseguiti/
•
n.ro comandi
eseguibili
• n.ro archi percorsi/
•
n.ro archi percorribili
• n.ro cammini percorsi/
•
n.ro cammini
percorribili
• n.ro cammini indip.
percorsi/n.ro ciclomatico
Software Testing
98
49
UN MODELLO DI RAPPRESENTAZIONE DEI
PROGRAMMI: il Control-Flow Graph
• Il grafo del flusso di controllo (Control-Flow Graph) di un programma P:
• CFG (P) = <N, AC, nI, nF>
dove:
•
<N, AC> è un grafo diretto con archi etichettati,
•
{nI, nF} ? ?N, N- {nI, nF} = Ns? Np
•
Ns e Np sono insiemi disgiunti di nodi istruzione e nodi predicato;
•
AC ? ?N-{nF}? ?N-{nI } ? ?{vero, falso, incond} rappresenta la relazione
flusso di controllo;
•
nI ed nF sono detti rispettivamente nodo iniziale e nodo finale.
•Un nodo n? ?Ns?? ?{nI} ha un solo successore immediato e il suo arco
uscente è etichettato con incond.
•Un nodo n? Np ha due successori immediati e i suoi archi uscenti sono
etichettati rispettivamente con vero e falso.
Ingegneria del Software 2
99
Software Testing
Strutture di controllo di base nel CFG
if
t
f
f
v
f
v
If-then-else
Ingegneria del Software 2
Repeat … until C
Software Testing
While C do
100
50
Esercizio
• int tent=0,x=7,num=0;
•
while ((tent<4)&&(num!=x)) {
•
cout<<"Indovina il numero :";
cin>>num;
•
tent++;
•
if (num>x)
•
cout<<"Un po' di meno\n";
•
else
•
if (num<x)
•
cout<<"Un po' di piu'\n";
•
}
•
if (num==x)
•
cout<<"Bravo";
•
if (tent==4)
•
cout<<“Hai perso!";
•
return 0;
Ingegneria del Software 2
Disegnare il
Control Flow
Graph
101
Software Testing
Un esempio
I
procedure Quadrato;
var x, y, n: integer;
begin
1. read(x);
2. if x > 0
then begin
3.
n := 1;
4.
y := 1;
5.
while x > 1 do
begin
6.
n := n + 2;
7.
y := y + n;
8.
x := x - 1;
end;
9.
write(y);
end;
end;
I
1
1,2
2
true
false
true
3
false
3,4,5
true
4
5
true
6
false
false
6,7,8
7
9
8
F
9
F
Ingegneria del Software 2
Software Testing
102
51
Criteri di copertura
• Copertura dei comandi (statement test)
– Richiede che ogni nodo del CFG venga eseguito
almeno una volta durante il testing;
– è un criterio di copertura debole, che non assicura
la copertura sia del ramo true che false di una
decisione.
– Es. nella Procedura quadrato, la test suite
TS={x=2} garantisce la copertura di tutti i nodi,
ma non dell’arco (1-2, Fine)
Ingegneria del Software 2
Software Testing
103
Criteri di copertura
•
Copertura delle decisioni (branch test)
– Richiede che ciascun arco del CFG sia attraversato
almeno una volta;
• In questo caso ogni decisione è stata sia vera che
falsa in almeno un test case
• Nella procedura Quadrato, la TS={x=2, x=-1}
garantisce la copertura delle decisioni
– un limite è legato alle decisioni in cui più condizioni
(legate da operatori logici AND ed OR) sono
valutate
Ingegneria del Software 2
Software Testing
104
52
Copertura delle condizioni (condition test)
– Ciascuna condizione nei nodi decisione di un CFG
deve essere valutata sia per valori true che false.
– Esempio:
int check (x);// controlla se un intero è fra 0 e
100
int x;
{
if ((x>=0) && (x<= 200))
check= true;
else check = false;
}
TS={x=5, x=-5 } valuta la decisione sia per valori True che False,
ma non le condizioni
TS1={ x= 3, x=-1, x=199, x=210} è una Test suite che copre
tutte le condizioni
Ingegneria del Software 2
Software Testing
105
Copertura delle condizioni e decisioni
•
Occorre combinare la copertura delle condizioni in
modo da coprire anche tutte le decisioni.
–
–
–
Es. If (x>0 && y>0) …
TS1={(x=2, y=-1), (x=-1, y=5)} copre le condizioni ma non
le decisioni!
TS2={(x=2, y=1), (x=-1, y=-55)} copre sia le condizioni
che le decisioni!
Ingegneria del Software 2
Software Testing
106
53
Costi del test per i vari criteri di copertura
• Copertura degli statement :
– Numero di casi di test richiesti =1
• Copertura delle decisioni
– Numero di casi di test richiesti= 2
• Copertura delle condizioni
– Numero di casi di test richiesti= 4
• Copertura delle condizioni e decisioni
– Numero di casi di test richiesti= 4
Ingegneria del Software 2
Software Testing
107
Cammini linearmente indipendenti (McCabe)
• Un cammino è un’esecuzione del modulo dal nodo iniziale
del Cfg al nodo finale
• Un cammino si dice indipendente (rispetto ad un insieme di
cammini) se introduce almeno un nuovo insieme di
istruzioni o una nuova condizione
– in un CfG un cammino è indipendente se attraversa
almeno un arco non ancora percorso
• L’insieme di tutti i cammini linearmente indipendenti di un
programma forma i cammini di base; tutti gli altri cammini
sono generati da una combinazione lineare di quelli di base.
• Dato un programma, l’insieme dei cammini di base non è
unico.
Ingegneria del Software 2
Software Testing
108
54
Numero di cammini linearmente indipendenti
• Il numero dei cammini linearmente indipendenti di un
programma è pari al numero ciclomatico di McCabe:
– V(G) = E - N +2
• Dove E: n.ro di archi in G - N: n.ro di nodi in G
– V(G) = P + 1
• Dove P: n.ro di predicati in G
– V(G) = n.ro di regioni chiuse in G + 1
• Test case esercitanti i cammini di base garantiscono
l’esecuzione di ciascuna istruzione almeno una volta
Ingegneria del Software 2
Software Testing
109
Esempio
0
1
true
false
2
true
false
3
4
5
Complessità ciclomatica
del programma è 3
Ingegneria del Software 2
V(G)= 3 =>3 cammini indipendenti
c1= 0-1-2-4-5
c2= 0-1-2-3-2-4-5
c3= 0-1-5
Software Testing
110
55
Criteri di copertura dei cammini
• Copertura dei cammini (path test)
– spesso gli errori si verificano eseguendo cammini che includono
particolari sequenze di nodi decisione
– non tutti i cammini eseguibili in un CFG possono essere eseguiti
durante il test (un CFG con loop può avere infiniti cammini
eseguibili)
• Copertura dei cammini indipendenti
– ci si limita ad eseguire un insieme di cammini indipendenti di un
CFG, ossia un insieme di cammini in cui nessun cammino è
completamente contenuto in un altro dell’insieme, nè è la
combinazione di altri cammini dell’insieme
– ciascun cammino dell’insieme presenterà almeno un arco non
presente in qualche altro cammino
– il numero di cammini indipendenti coincide con la complessità
ciclomatica del programma
Ingegneria del Software 2
Software Testing
111
Relazioni tra i criteri di copertura
• La copertura delle decisioni implica la copertura dei nodi
• La copertura delle condizioni non sempre implica la
copertura delle decisioni
• La copertura dei cammini linearmente indipendenti
implica la copertura dei nodi e la copertura delle
decisioni
• La copertura dei cammini è un test ideale ed implica
tutti gli altri
Ingegneria del Software 2
Software Testing
112
56
Problemi
• E’ possibile riconoscere automaticamente quale cammino
linearmente indipendente viene coperto dall’esecuzione di
un dato test case
• E’ indecidibile il problema di trovare un test case che va a
coprire un dato cammino
– Alcuni cammini possono risultare non percorribili
(infeasible)
• La copertura dei cammini linearmente indipendenti non
garantisce da errori dovuti, ad esempio, al numero di cicli
eseguiti, per i quali sarebbe necessaria la copertura di tutti I
cammini, che però rappresenta il testing esaustivo!
Ingegneria del Software 2
Software Testing
113
• Testing di Sistemi Object Oriented
Ingegneria del Software 2
Software Testing
114
57
Impatto delle caratteristiche OO sul Testing
• ... astrazione sui dati, ereditarietà, polimorfismo,
binding dinamico, genericità, ... impattano concetti
ed attività del testing
• Nuovi livelli di test
– il concetto di classe, come stato + operazioni, cambia il concetto di
unità
– le modalità di interazione ed integrazione degli oggetti impatta il test
di integrazione
• Nuova infrastruttura
– driver e stub devono considerare lo stato (information hiding)
– lo stato non può essere ispezionato con tecniche tradizionali
Ingegneria del Software 2
Software Testing
115
Impatto delle caratteristiche OO sul Testing
• Nuove tecniche di generazione di casi di test e criteri di
terminazione che tengano conto di:
–
–
–
–
–
Stato
–
Polimorfismo
e binding dinamico
Ereditarietà
Genericità
Eccezioni
Ingegneria del Software 2
Software Testing
116
58
1- Nuovi Livelli di Test
• I livelli di Test tradizionali mal si adattano al caso di
linguaggi OO:
• Da cosa è rappresentata l'unità?
– un oggetto ? una classe ? un’operazione di una classe?
• Cosa è un modulo in un sistema OO?
– Esistono diverse scuole di pensiero
• Una possibile suddivisione:
– Basic unit testing: test di una singola operazione di una classe
– Unit testing: test di una classe nella sua globalità
– Integration testing: test delle interazioni tra più classi
Ingegneria del Software 2
Software Testing
117
2- Stato ed Information Hiding
• Componente base: Classe = struttura dati + insieme di
operazioni
– oggetti sono istanze di classi
– la verifica del risultato del test non è legata solo all’output, ma anche
allo stato,definito dalla struttura dati
• La ‘opacità’ dello stato (v. incapsulamento ed information
hiding) rende più difficile la costruzione di infrastruttura e
oracoli
– è sufficiente osservare le relazioni tra input e output?
– lo stato di un oggetto può essere inaccessibile
– lo stato “privato” può essere osservato solo utilizzando metodi
pubblici della classe (e quindi affidandosi a codice sotto test)
Ingegneria del Software 2
Software Testing
118
59
3- Nuove Tecniche di generazione dei Test
• Test ed Ereditarietà
– l'ereditarietà è una relazione fondamentale tra classi
– nelle relazioni di ereditarietà alcune operazioni restano invariate
nella sotto-classe, altre sono ridefinite, altre aggiunte (o
eliminate)
• Ci si può “fidare” delle proprietà ereditate?
– È necessario identificare le proprietà che devo ri-testare:
operazioni aggiunte, operazioni ridefinite, operazioni invariate
ma influenzate dal nuovo contesto
– Può essere necessario verificare la compatibilità di
comportamento tra metodi omonimi in una relazione classesottoclasse
– Riuso test, e test specifici
– Ereditarietà produce nuova forma di Integrazione/ Interazione
Ingegneria del Software 2
Software Testing
119
4- Test e Genericità
• I moduli generici sono presenti nella maggior parte dei
linguaggi OO
– la genericità è un concetto chiave per la costruzione di librerie
di componenti ri-usabili
• Le classi parametriche devono essere instanziate per
poter essere testate
– Bisognerebbe prevedere test per ogni possibile istanziazione
della classe parametrica (test esaustivo???)
• Quali ipotesi dover fare sui parametri?
– Servono classi “fidate” da utilizzare come parametri
• Quale metodologia seguire quando si testa un
componente generico che è ri-usato?
– Non esistono tecniche o approcci maturi in letteratura
Ingegneria del Software 2
Software Testing
120
60
5- Polimorfismo e Binding Dinamico
• Un riferimento (variabile) può denotare oggetti
appartenenti a diverse classi di una gerarchia di
ereditarietà (polimorfismo), ovvero il tipo dinamico e il
tipo statico dell’oggetto possono essere differenti
– più implementazioni di una stessa operazione
– il codice effettivamente eseguito è identificato a run-time, in
base alla classe di appartenenza dell’oggetto (binding
dinamico)
Ingegneria del Software 2
Software Testing
121
Polimorfismo e problemi per il testing
• Il test strutturale può diventare non praticabile:
• Come definire la copertura in un’invocazione su un
oggetto polimorfico?
• Come creare test per “coprire” tutte le possibili chiamate
di un metodo in presenza di binding dinamico?
• Come gestire i parametri polimorfici?
Ingegneria del Software 2
Software Testing
122
61
Polimorfismo e Binding Dinamico: esempio
Ingegneria del Software 2
Software Testing
123
Esempio
Ingegneria del Software 2
Software Testing
124
62
6- Altri Problemi: Gestione delle Eccezioni
• Le eccezioni modificano il flusso di controllo senza la
presenza di un esplicito costrutto di tipo test and
branch, rendendo inefficace il CFG per modellare il
flusso di controllo.
• E’ necessario introdurre ulteriori metodi per generare
casi di test e ulteriori metriche di copertura per valutare
l’effettiva copertura di tutte le eccezioni
– copertura ottimale: sollevare tutte le possibili eccezioni in tutti i punti
del codice in cui è possibile farlo (può non essere praticabile)
– copertura minima: sollevare almeno una volta ogni eccezione
Ingegneria del Software 2
Software Testing
125
Altri Problemi: Concorrenza
• Problema principale: non-determinismo
– risultati non-deterministici
– esecuzione non-deterministica
• Casi di test composti solo da valori di Input/Output sono poco
significativi
• Casi di test composti da valori di Input/output e da una sequenza
di eventi di sincronizzazione (occorre però forzare lo scheduler a
seguire una data sequenza)
Ingegneria del Software 2
Software Testing
126
63
Approcci per il Testing OO
Berard [93] propose il seguente approccio al
testing OO:
1. Associare ogni test alla classe da testare
2. Specificare lo scopo del Test
3. Specificare una sequenza di passi di test, contenente:
•
•
•
•
•
Elenco di stati per l’oggetto da testare
Elenco di messaggi ed operazioni che saranno eseguite come
conseguenza del test
Elenco di eccezioni che potrebbero verificarsi durante il test
Elenco di condizioni esterne (dell’ambiente esterno) che
devono sussistere per eseguire il test
Ulteriori informazioni per capire ed implementare il test.
Ingegneria del Software 2
Software Testing
127
Metodi per il Testing OO
• Fault-based testing
– Il tester si fa guidare dai possibili difetti presenti nel codic e, e
progetta i casi di test cercando di metterli in evidenza.
Necessità di una classificazione (tassonomia) dei difetti
ricorrenti.
– Es. esistono varie categorie di difetti proposte in letteratura
relativi ai metodi, alle variabili di istanza, ai messaggi, alla
classe, all’ereditarietà, all’astrazione della classe, etc..
– Spesso tali classificazioni si costruiscono a partire dai bug
report di applicazioni esistenti.
Ingegneria del Software 2
Software Testing
128
64
Tipici Difetti in OO code …
• Interazioni scorrette fra metodi (individualmente corretti) di
superclassi e subclassi.
• Mancata nuova specifica di un metodo ereditato (overriding) in
una subclasse, in una profonda gerarchia di ereditarietà.
• La subclasse eredita metodi non appropriati dalle superclassi.
• Fallimenti in chiamate polimorfiche di una subclasse la cui
interfaccia è conforme alle interfacce delle superclassi.
• Mancata o scorretta inizializzazione della superclasse nelle
subclassi
• Scorretto aggiornamento di variabili di istanza di una superclasse
all’interno delle subclassi…
Ingegneria del Software 2
Software Testing
129
Tipici Difetti in OO code
• Polimorfismo ‘a spaghetti’ che produce perdita del
controllo (il problema dello ”yo-yo” causato dal dynamic
binding e oggetti self e super)
• Subclassi violano il modello di stato o l’invariante della
superclasse.
• Istanziazioni di classi generiche con un tipo di
parametro non testato.
• Relazioni di controllo inter-modulo scorrette, a causa
della delocalizzazione di funzionalità in classi piccole e
incapsulate.
Ingegneria del Software 2
Software Testing
130
65
Metodi per il Testing OO
• Scenario-Based Test Design
– È un testing in cui ci si concentra su ciò che fa
l’utente, piuttosto che su ciò che fa il software.
– Richiede che vengano catturati i task eseguibili
dall’utente (es. i casi d’uso), per poi usarli insieme ai
loro scenari alternativi come casi di test.
– In pratica, si andranno a coprire con i casi di test
tutte le varianti di comportamento di un caso d’uso.
Ingegneria del Software 2
Software Testing
131
Esempi di Use Cases e Scenari
Ingegneria del Software 2
Software Testing
132
66
Dai Casi d’uso ai Test Case
Ingegneria del Software 2
Software Testing
133
Specifica delle Varianti per un Caso d’uso
Ingegneria del Software 2
Software Testing
134
67
Progetto dei Test Case
Ingegneria del Software 2
Software Testing
135
Metodi per il Testing OO
• Testing della Classe e della Gerarchia di classi
– La completa copertura di una classe richiede di:
– Testare tutte le operazioni di un oggetto;
– Settare ed interrogare tutti gli attributidi un oggetto;
– Esercitare l’oggetto in tutti I possibili stati.
– L’ereditarietà rende più difficile la scelta dei casi di test degli oggetti
giacchè le informazioni da testare non sono localizzate (ma distribuite
nella gerarchia di ereditarietà).
– L’ereditarietà non permette di risparmiare sul testing delle classi
derivate che, invece, dovranno essere ritestate comunque.
Ingegneria del Software 2
Software Testing
136
68
Testing degli stati di una classe di oggetti
– Il testing white box di una classe deve tenere in
conto di tutti i possibili stati e cambiamenti di stato
degli oggetti di quella classe
•
•
•
•
Uso di State Chart per rappresentare tale evoluzione
Uso di vari Criteri di copertura
Copertura degli Stati, delle Transizioni, ..
Copertura dei cammini tra stato iniziale e stato finale di
un oggetto
• Non basta valutare solo gli output restituiti dai metodi
ma anche lo stato dell’oggetto dopo la chiamata … ma
alcuni attributi potrebbero essere privati o protetti
Ingegneria del Software 2
Software Testing
137
Es.: interfaccia dell’oggetto Weather station (Stazione Meteo)
WeatherStation
identifier
repor tWeather ()
calibrate (instruments)
test ()
star tup (instruments)
shutdown (instruments)
Ingegneria del Software 2
Software Testing
138
69
State diagram della Stazione Meteo
Operation
calibrate ()
Calibrating
calibration OK
test ()
star tup ()
Waiting
Shutdown
Testing
transmission done
shutdown ()
test complete
Transmitting
clock
collection
done
repor tWeather ()
Summarising
weather summary
complete
Collecting
Ingegneria del Software 2
Software Testing
139
Il testing di Weather station
•
Occorre definire test cases per tutti I singoli metodi :
reportWeather, calibrate, test, startup e shutdown.
•
Usando un modello a stati, bisogna identificare le
transizioni di stato da testare e le sequenze di eventi
che causano tali transizioni.
•
Ad esempio:
–
Waiting -> Calibrating -> Testing -> Transmitting ->
Waiting
Ingegneria del Software 2
Software Testing
140
70
Integration Testing- Testing Inter-classi
• Gli oggetti collaborano nella realizzazione di funzionalità
complesse. Occorre testare tali collaborazioni.
• La generazione dei casi di test può essere effettuata a
partire dai diagrammi di interazione UML (tratti dalle
specifiche)
• Opportuno costruire diagrammi di interazione anche dal
codice e verificare la corrispondenza con le specifiche …
• Problemi
– Ereditarietà
– Polimorfismo e binding dinamico
Ingegneria del Software 2
Software Testing
141
Generazione di Casi di Test a partire
dai diagrammi di Interazione
• I diagrammi di interazione (quali i sequenze diagram
UML) indicano possibili sequenze di messaggi
• Dovrebbero indicare i casi frequenti e quelli particolari
• Selezione immediata:
– generare un test per ogni diagramma di interazione
• Selezione più accurata:
– per ogni diagramma individuare possibili alternative e per ogni
alternativa selezionare un ulteriore insieme di casi di test
Ingegneria del Software 2
Software Testing
142
71
Esempio
Ingegneria del Software 2
Software Testing
143
Problemi per l’automazione dell’ OOT
• Scarsa controllabilità, osservabilità e testabilità del sistema, a causa del
numero elevato di piccoli oggetti incapsulati
• Difficoltà nell’analizzare la copertura white-box, a causa di un elevato
numero di complesse dipendenze dinamiche
•
L’allocazione dinamica di oggetti crea delle dipendenze tra classi a tempo di
esecuzione
– Diventa difficile capire quanti e quali stub dover creare per poter testare una
classe indipendentemente dalle altre
– Diventa difficile capire in che ordine svolgere il testing di integrazione
bottom-up
• Difficoltà nel produrre drivers, stubs, e test suites che tengano conto
della struttura di ereditarietà del sistema
• Possibilità di riusare i test case di superclassi nel (regression) testing di
subclasses
• Spesso il codice dell’applicazione non è completamente disponibile (se si
usano ad esempio object-oriented frameworks)
Ingegneria del Software 2
Software Testing
144
72
Ingegneria del Software 2
Software Testing
145
• La Documentazione del Testing
Ingegneria del Software 2
Software Testing
146
73
Specifica dei casi di test
• Ogni caso di test, indipendentemente dalla sua
tipologia, dovrebbe essere descritto quanto meno
dai seguenti campi
– Numero Identificativo
– Descrizione
• Può indicare anche la funzionalità che si va testando
– Precondizioni
• Asserzioni che devono essere verificate affinchè il test possa
essere eseguito
– Valori di Input
– Valori di Output Attesi
• Rappresentano l’oracolo
• In alcune tipologie di test si fornisce una classe di equivalenz a
attesa per gli output anziché un singolo valore
– Postcondizioni Attese
• Asserzioni assimiliabili agli output ma non verificabili
direttamente dall’interfaccia utente
Ingegneria del Software 2
Software Testing
147
Specifica dei casi di test
• All’atto dell’esecuzione del test, verranno aggiunti i
seguenti campi:
– Output riscontrati
– Postcondizioni riscontrate
– Esito
• Positivo (cioè malfunzionamento rilevato) se almeno un valore
di output o una postcondizione riscontrati sono diversi da quelli
attesi
• Negativo altrimenti
Ingegneria del Software 2
Software Testing
148
74
Piano di test
• Documento relativo all’intero progetto
• Struttura
– specifica delle unità di test (per un dato livello di test) Es.
Modulo, gruppi di moduli, programma, sottosistemi, intero
sistema
– Caratteristiche da testare: funzionalità, prestazioni, vincoli di
progetto, sicurezza…
– Approccio: criterio di selezione dei test, criterio di
terminazione, strumenti
– Prodotti del test: es. Casi di test, rapporto finale, diario del
test, statistiche di copertura…
– Schedulazione: quando effettuare il testing e lo sforzo per
attività
– Allocazione del personale
Ingegneria del Software 2
Software Testing
149
Rapporti sul test
• Diario del test
– descrive i dettagli del test per come si è svolto effettivamente
– la specifica dei casi di test può essere completata e usata come
diario
• Riepilogo del test
– Rivolto al management del progetto
• numero totale di casi di test eseguiti
• numero e tipo di malfunzionamenti osservati
• numero e tipo di difetti scoperti
• Sommario dei malfunzionamenti
– Rivolto a chi deve effettuare il debugging o la correzione
Ingegneria del Software 2
Software Testing
150
75