Szoftver tesztelés a gyakorlatban 2 Struktúrális tesztelés
2
Struktúrális tesztelés ! Implementációs
részletek figyelembevétele ! Tesztelési célok -> lefedettség ! Implicit hibamodell A hibák a vezérlési szerkezeteket érintik ! Vezérlési folyam követése !
! Kimerít!
út tesztelés nem végezhet! ! Metrika alapú teszt tervezés
3
Tesztesetek
Specifikált m!ködés
Tesztesetek 2 Program m!ködése Tesztesetek 1
Struktúrális tesztelés alkalmazása ! Vezérlés-intenzív
alkalmazások ! Tervezési hibák felderítése ! Szabványok szerinti tesztelés
4
5
Vezérlés-folyam alapú tesztelés ! vezérlés-folyam
gráf
irányított gráf ! csomópontok: utasítások ! élek: egymást követ! utasítások között !
! többféle
granuláltságú vezérlés-folyam
gráf ! visszavezethet!k egyedi DD-út gráffá
6
Vezérlés-folyam gráf (pl.) 4
5
6
7
8
9
1ö
11
12
13
21
14
15
16
17
18
19
20 22
23
7
Vezérlés-folyam gráf (pl.) ! struktúrálatlan
program ! lehetetlen a kimerít! tesztelés first
A
B
C
D
E
F
G
last
8
DD-út ! Döntés-döntés
út
csomópont indeg=0 ! csomópont outdeg=0 ! csomópont indeg"2 vagy outdeg"2 ! csomópont indeg=1 és outdeg=1 ! maximális lánchossz"1 !
9
DD-út gráf példa first
A
B
C
D
E
F
G
H
I
J
K
L
M
N O
last
10
Teszt lefedettségi metrikák C0
minden utasítás
C1
minden DD-út
C1p
minden pred. összes kimenetel
C2
+ciklusok
Cd
+függ! DD-út párok
CMCC többszörös feltétel C# minden lehetséges út
11
Ciklusok kezelése ! Önálló
ciklus (max n futás)
egyszer ! kétszer ! m(
! Egymásba !
ágyazott ciklusok
belülr!l kifelé haladva, küls!k min., tesztelés alatt álló végig, már teszteltek fix értéken
12
Ciklusok kezelése (folyt.) first
first
first
A
A
A
B
B
B
C
C
C
D
D
D
last
last
last
13
Független utak ! legalább
egy élben eltérnek egymástól ! minimális cél a független utak egy maximális halmazának lefedése tesztekkel ! a maximális úthalmaz nem egyedi ! a ciklomatikus komplexitás használható a független utak számának meghatározására
14
Ciklomatikus komplexitás ! 1976
Thomas McCabe ! statikus szoftver metrika ! lineárisan független utak száma egy program modulban ! egész szám ! programnyelv független
15
Ciklomatikus komplexitás ! gráfok
cikomatikus száma
V(G)=e-n+p ! e élek ! n csomópontok ! p komponensek !
A
A 1
2
5
6
B
B
D
3
7
E
4
D
E
8 C
C
F 9
F
10 G
G
16 A
Független utak (pl.)
1
2
5
6
B
D
3
7
E
4
8 C
F 9
Utak\Élek
1 2
3
4
5 6
7
8
9 10
A,B,C,G
1 0
0
1
0 0
0
0
1 0
A,B,C,B,C,G
1 0
1
2
0 0
0
0
1 0
A,B,E,F,G
1 0
0
0
1 0
0
1
0 1
A,D,E,F,G
0 1
0
0
0 1
0
1
0 1
A,D,F,G
0 1
0
0
0 0
1
0
0 1
A,B,C,B,E,F,G
1 0
1
1
1 0
0
1
0 1
A,B,C,B,C,B,C,G
1 0
2
3
0 0
0
0
1 0
10 G
17
Alapvet! komplexitás ! kondenzációs
gráf komplexitása ! struktúrált programozás szekvencia ! if-then ! if-then-else ! case ! el!l tesztel! ciklus ! hátul tesztel! ciklus !
18
Alapvet! komplexitás (pl.) first
A
A
B
a
C
first
first
first
tsrif
A
A
A
a
a
a
first
D
E
G
G
H
I
K
I
G
H
J
K
L
e
G
H
J
F
F
F
F
I
c
b
L
M
M
last N
N O
O
last
last
N d
O
O
last
last
tsal
19
A metrika felhasználása ! er!s
korreláció a metrika és a hibák gyakorisága között !
kockázat (risk) becslés
! program !
érthet!sége
karbantartás, módosítás
! tesztelhet!ség
20
Kockázat becslés Ciklomatikus komplexitás
Kockázat
1-10
Egyszer$ program
11-20 21-50 50-
Komplex program, mérsékelt kockázat Komplex, magas kockázat Tesztelhetetlen program
21
Komplexitás példa ! RPC
csomagfeldolgozó rutin ! tevékenységek a csomagban érkez! üzenet mez!i és beállítási adatok alapján ! 160 sor (121 kódsor) ! 15 % megjegyzés
22
Komplexitás példa (folyt.) ! Egyszer$sített
vezérlés-folyam gráf
23
Egyéb tesztelési metrikák ! függvény
lefedettség ! hívás/visszatérés lefedettség ! ciklus lefedettség ! mutációs lefedettség
24
Adatfolyam alapú tesztelés ! változók !
értékadásai és felhasználásuk
definiálás/hivatkozás hibák ! ! !
never used never defined define more times before used
! DF-utak
(definíció/felhasználás)
DEF(v,m) ! USE(v,n), p-use, c-use ! definition-clear path !
Adatfolyam alapú tesztelés (folyt.) ! Rapps-Weyuker
25
adatfolyam lefedési
metrikák All-DU paths ! All-Uses ! All C-uses/some P-uses ! All P-uses/some C-uses ! All-Defs !
26
Struktúrális tesztelési példák Állítsa el! az alábbi programrészlet vezérlésfolyam gráfját! A gráf alapján határozza meg a teljes független út lefedéshez szükséges tesztek számát! 1 int testfloat(char s[]){ 2 int i=0; 3 int f=0; 4 while(isspace(s[i])) 5 i++; 6 if(s[i]=='+'||s[i]=='-') 7 i++; 8 f=i; 9 while(isdigit(s[i])) 10 i++; 11 if(s[i]=='.'){ 12 i++; 13 f=i; 14 while(isdigit(s[i])) 15 i++; 16 if(f==i) 17 return 0; 18 }
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 }
if(f==i) return 0; if(s[i]=='e'||s[i]=='E'){ i++; if(s[i]=='+'||s[i]=='-') i++; f=i; while(isdigit(s[i])) i++; if(f==i) return 0; } if(s[i]) return 0; else return 1;
Struktúrális tesztelési példák
27
! V(G)=e-n+2=45-34+2=13 ! V(G)=D+1=12+1=13
Struktúrális tesztelési példák (folyt.) Hány teszteset kellene teljes logikai kifejezés (boole, CMCC) lefedés eléréséhez? Predikátum csomópontok összetett logikai kifejezéseinek összes részkifejezését a lehetséges kimenetekbe kell vinni. (N rész kifejezésre ez 2N.)
Pl.: ... if(s[i]=='+'||s[i]=='-')...
A két rész kifejezés nem fügettlen! s[i]=’+’ s[i]=’-’ s[i]=’a’ lehetetlen
s[i]==’+’ true false false true
s[i]==’-’ false true false true
teljes kif. true true false true
28
Struktúrális tesztelési példák (folyt.)
29
Amikor a CMCC elérése fontos lehet: if ( feltétel1 && ( feltétel2 || függvény1() ) ) utasítás1; else utasítás2; Tesztesetek: 1. feltétel1 hamis 2. feltétel1 igaz, feltétel2 igaz Teljes C1 lefedés, de függvény1() nem került meghívásra.
Struktúrális tesztelési példák (folyt.) Mit tudunk mondani a függvény alapvet! (esszenciális) komplexitásáról? A kondenzációs gráf ciklomatikus komplexitása 1-e? Sérülnek-e struktúrált programozási elvek? •belépés ciklusba nem a ciklus fejben •kilépés ciklusból nem a feltétel vizsgálatkor •kilépés szelekciós szerkezetb!l •belépés szelekciós szerkezetbe nem a szelekciónál
30
Struktúrális tesztelési példák (f.)
31
Mit tudunk mondani a függvény alapvet! (esszenciális) komplexitásáról? összetett szelekciós blokkban, nem a függvény végén lév! return utasítás => struktúrálatlanság
Struktúrális tesztelési példák (folyt.) A programkódból adjon meg legalább három DF-utat (DefinícióFelhasználás, DEF-USE), adja meg, hogy ezek az utak definition clear utak-e, illetve hogy C (computation), vagy P (predicate) felhasználásról van-e szó.
du-path1: DEF(i,2)..C-USE(i,8) nem definíció mentes pl. DEF(i,5) du-path2: DEF(f,3)..P-USE(f,16) nem definíció mentes pl. DEF(f,8) du-path3: DEF(f,25)..P-USE(f,28) definíció mentes
32
Struktúrális tesztelési példák (folyt.)
33
C for ciklusok kezelése
for(kifejezés1;kifejezés2;kifejezés3) utasítás; kifejezés1; /*def */ while(kifejezés2){ /*p-use */ utasítás; kifejezés3; /*def */ }
Struktúrális tesztelési példák (folyt.) ! Relációs
operátorok helyességének tesztelése !
rendezési relációk ! ! !
3 lehetséges eset a!b, a"#$!% => 3 teszteset
34
Funkcionális és struktúrális tesztelés ! önmagában
35
egyik módszer sem
kielégít! ! nincs szignifikáns különbség a hatékonyságban ! kiegészítik egymást ! végrehajtási sorrend: funkcionális tesztek ! struktúrális tesztek !
Funkcionális és struktúrális tesztelés (folyt.) ! McCabe
a ciklomatikus komplexitásról és az útalapú tesztelésr!l !
csak tesztelési min!ségi kritérium, nem módszer a tesztesetek azonosítására
! Ciklomatikus !
komplexitás, DD-utak
topológiailag lehetséges utak
36
37
Struktúrális tesztelés Specifikált viselkedés
Programozott viselkedés (Megvalósulható utak)
Topológiailag lehetséges utak
38
Tesztelési stratégiák ! Egységek
(modulok) tesztelése
Izolációs tesztelés ! Inkrementális tesztelés (hibrid techn.) !
! Integrációs
tesztelés
Inkrementális tesztelés ! Big bang tesztelés !
39
Az egységtesztelés szerepe ! moduláris
fejlesztés -> moduláris tesztelhet!ség ! white box jelleg ! fejlesztés közbeni tesztelés ! tesztelési komplexitás csökkentés ! hatékonyabb integrációs fázis
Az egység tesztelés szükségessége input
modul
integrált rendszer output
input modul output
40
41
Az izolációs tesztelés el!nyei ! kisebb
tesztelési komplexitás ! könnyebb strukturális lefedettséget elérni ! egyszer$bb tesztvégrehajtó egységek és csonk modulok ! modul változtatása csak a hozzátartozó tesztek módosításával jár ! tiszta egységtesztek
Az izolációs tesztelés hátrányai ! nem
biztosít korai integrációt ! tesztvégrehajtó (driver) és csonk (stub) modulok szükségesek a hierarchia minden szintjén
42
43
Az egységtesztelés el!nyei ! könnyebb
teszt generálás és karbantartás ! alacsonyabb relatív id!igény ! hibák pontos azonosítása ! párhuzamosíthatóság
44
Integrációs tesztelés ! Mars
Climate Orbiter
Lockheed Martin - pounds ! Jet Propulsion Laboratory - newton !
! Együttm$ködés
tesztelése ! Interfészek tesztelése ! Módszerek funkcionális dekompozíció alapú ! hívási gráf alapú ! big bang !
45
Dekompozíciós int. tesztelés ! Funkcionális
dekompozíció -> modul fa ! Korábban tesztelt modulok ! Modulok integrálása top-down ! bottom-up ! szendvics !
! Meghajtó
modulok és modul-csonkok
46
Top-down tesztelés
47
A top-down tesztelés el!nyei ! korai
integráció ! top-down tervezés esetén id! hatékony ! er!sen követelmény orientált egység tesztelés ! alsóbb szinteken megvalósított redundáns funkcionalitás kisz$rhet!
A top-down tesztelés hátrányai ! csonkok
szükségesek ! egyre komplikáltabb tesztek ! egyre nehezebben elérhet! struktúrális lefedettség ! modul módosítása más modulok tesztjeinek módosítását igényli
48
49
Bottom-up tesztelés
50
A bottom-up tesztelés el!nyei ! korai
integráció ! nincs szükség csonkokra ! alsó szint$ modulok könny$ tesztelhet!sége ! jól használható objektumok tesztelésére
A bottom-up tesztelés hátrányai
51
! egyre
komplikáltabb tesztek ! egyre nehezebben elérhet! struktúrális lefedettség ! meg kell várni az alacsonyabb szint$ modulok tesztelését
52
Szendvics integrálás ! Big
bang integráció részfákon
Integrálás a hívási gráf alapján ! Funkcionális
53
dekompozíció <-> hívási
gráf !
elmozdulás struktúrális irányba
! Páronkénti
integrálás ! Szomszédos integrálás
54
Páronkénti integrálás ! csonk/meghajtó
fejlesztés csökkentése ! hívási gráf szomszédos párjainak integrálása !
hívási gráf élenkénti tesztek
55
Páronkénti integrálás 2
1 11
3
13
4 5
6 12
7 8
14
9
10
15 16
17
18
56
Szomszédos integrálás ! integrálás
egy gráf csomópont szomszédságán a csomóponttól egy él távolságokra lév! csomópontok halmazával ! pred. és succ. csomópontok irányított gráfnál, vagyis meghajtó és csonkok !
! szomszédságok
száma
!
Sz=Nbels!+Nforrás
!
Nbels!=N-(Nforrás+Nnyel!)
57
Szomszédos integrálás 2
1 11
3
13
4 5
6 12
7 8
14
9
10
15 16
17
18
58
Út alapú integrálás ! Viselkedési
szálak ! Interfészek tesztelése vs. interakciók tesztelése ! Végrehajtás (vezérlés folyam) modulok között ! Kiterjesztett vezérlés folyam gráf modul forrás csomópontok (kezdet, folytatás) ! modul nyel!k (vég, vezérlés átadás) !
59
Út alapú integrálás ! Modul !
végrehajtási út (MEP)
kiterjesztett forrástól nyel!ig
! Üzenetek !
(modulok között)
vezérlés átadás !
adat átadás
! MM-út !
utasítás végrehajtási utak és üzenetek szekvenciája
60
MM-út gráf ! Adott
modulra (egységre)
csomópontok: MEP-ek ! élek: modulok közötti üzenetek !
! Integrációs
tesztelés az MM-út gráf
alapján ! MM-utak mélysége üzenet tétlenség ! adatfolyam tétlenség !
61
MM-utak A
B
C 1
1
1 MEP(A,2) 2
2
3
2
MEP(B,1)
3 MEP(A,1)
4
MEP(C,1)
4
3
MEP(B,2) MEP(C,2)
5 MEP(A,3) 5 4
6
MM-út
MM-út gráf
62
Adatfolyam tétlenség ! Adattárolásra !
vezet! feldolgozás
adatfolyam diagram A F1
F2
Közvetlen adatfolyam kapcsolat
F1
F2
A
Közvetett adatfolyam kapcsolat
63
MM-út komplexitás ! Egyszer$sített
MM-út gráf ! UML szekvencia diagramok ! ciklomatikus komplexitás A
B
C
64
MM-út alapú tesztelés ! Funkcionális !
ki- és bemenetek
! Struktúrális !
azonosítás, meghatározás
! Mindenféle
életciklus modellhez ! Meghajtó és csonk fejlesztés eliminálása