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 4! Vezérlés-intenzív alkalmazások! Tervezési hibák felderítése! Szabványok szerinti tesztelés
Vezérlés-folyam alapú tesztelés 5! 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 C 0 C 1 C 1 p minden utasítás minden DD-út minden pred. összes kimenetel C 2 +ciklusok C d +függ! DD-út párok C MCC 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(<n)-szer! n-1, n, n+1 menet! 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 B D B D 5 6 3 4 E 7 8 E C F C F 9 10 G G Független utak (pl.) A 1 2 B D 5 6 3 4 E 7 8 C F 16 9 10 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 G
last d a A first 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 first first first A A A A B a a a first C D E F F F F e G H G H G H G c I J I J I b K L K L N M N M N last O O O O last last last last
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.) 25! Rapps-Weyuker 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 if(f==i) 20 return 0; 21 if(s[i]=='e' s[i]=='e'){ 22 i++; 23 if(s[i]=='+' s[i]=='-') 24 i++; 25 f=i; 26 while(isdigit(s[i])) 27 i++; 28 if(f==i) 29 return 0; 30 } 31 if(s[i]) 32 return 0; 33 else return 1; 34 }
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.) 28 Hány teszteset kellene teljes logikai kifejezés (boole, C MCC ) 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 2 N.) Pl.:... if(s[i]=='+' s[i]=='-')... A két rész kifejezés nem fügettlen! s[i]== + s[i]== - teljes kif. s[i]= + true false true s[i]= - false true true s[i]= a false false false lehetetlen true true true
Struktúrális tesztelési példák (folyt.) 29 Amikor a C MCC 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 C 1 lefedés, de függvény1() nem került meghívásra. Struktúrális tesztelési példák (folyt.) 30 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
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.) 32 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
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.) 34! Relációs operátorok helyességének tesztelése! rendezési relációk! 3 lehetséges eset! a! "#$!%&#! => 3 teszteset
Funkcionális és struktúrális tesztelés 35! önmagában 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.) 36! 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
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 40 input modul integrált rendszer output input modul output
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 42! nem biztosít korai integrációt! tesztvégrehajtó (driver) és csonk (stub) modulok szükségesek a hierarchia minden szintjén
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 48! 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
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 53! Funkcionális 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 3 11 4 13 5 6 12 7 14 8 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=N bels! +N forrás! N bels! =N-(N forrás +N nyel! )
57 Szomszédos integrálás 2 1 3 11 4 13 5 6 12 7 14 8 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! MM-út! adat átadás! 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 2 3 MEP(B,1) 3 4 MEP(A,1) MEP(C,1) 3 4 MEP(B,2) 5 MEP(A,3) MEP(C,2) 6 4 5 MM-út MM-út gráf 62 Adatfolyam tétlenség! Adattárolásra vezet! feldolgozás! adatfolyam diagram F1 A 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