Professional Documents
Culture Documents
Szoftvertesztelés A Gyakorlatban
Szoftvertesztelés A Gyakorlatban
Informatikai Kar
Komputeralgebra Tanszék
Szoftvertesztelés a gyakorlatban
Horváth László
Budapest
2007.
Tartalomjegyzék
Köszönetnyilvánítás....................................................................................................................4
1. Elıszó......................................................................................................................................5
2. Bevezetés, alapfogalmak ........................................................................................................7
2. 1. A hibák típusai: mentális hiba(error), programozói hiba(fault), hibás mőködés(failure) . 8
2. 2. Teszteset ..................................................................................................................................... 9
2. 3. A program megbízhatósága...................................................................................................... 9
2. 4. Tesztelési alapelvek ................................................................................................................. 10
2. 5. Ki teszteljen?............................................................................................................................ 11
2. 6. Hibák típusai............................................................................................................................ 11
2. 7. A tesztek osztályozása ............................................................................................................. 12
2. 8. A tesztelés szintjei, tevékenységek ......................................................................................... 14
3. Funkcionális tesztelés ..........................................................................................................16
3. 1. Példák ....................................................................................................................................... 16
3. 1. 1. Háromszög probléma .......................................................................................................................16
3. 1. 2. A „NextDate” probléma ...................................................................................................................17
3. 2. Ekvivalencia-osztályozás ........................................................................................................ 18
3. 2. 1. Irányvonalak az osztályozáshoz .......................................................................................................18
3. 2. 2. Gyenge ekvivalencia-osztály tesztelés .............................................................................................19
3. 2. 3. Erıs ekvivalencia-osztály tesztelés ..................................................................................................20
3. 2. 4. Gyenge robusztus ekvivalencia-osztály tesztelés .............................................................................21
3. 2. 5. Erıs robusztus ekvivalencia-osztályozás..........................................................................................22
3. 2. 6. Ekvivalencia-osztály tesztesetek a háromszög problémára ..............................................................23
3. 3 Határérték tesztelés.................................................................................................................. 26
3. 3. 1 Határérték analízis.............................................................................................................................26
3. 3. 2. Robusztusság-teszteléss....................................................................................................................29
3. 3. 3. „Legrosszabb eset” tesztelés.............................................................................................................30
3. 3. 4. Tesztelés speciális értékekkel...........................................................................................................31
3. 3. 5. Példák...............................................................................................................................................32
3. 4. Ok-okozat gráfok és a döntési tábla ...................................................................................... 35
3. 4. 1. Ok-okozat gráfok..............................................................................................................................35
3. 4. 2. Döntési tábla.....................................................................................................................................36
3. 4. 3. Példa az ok-okozat gráfok és a döntési táblák együttes használatára ...............................................37
3. 5. A funkcionális tesztelés áttekintése....................................................................................... 39
3. 5. 1. Mit használjunk? ..............................................................................................................................39
4. Strukturális tesztelés ............................................................................................................42
4. 1. Útvonal tesztelés ...................................................................................................................... 42
4. 1. 1. DD - utak..........................................................................................................................................45
4. 2. Lefedettség metrikák............................................................................................................... 46
4. 2. 1. Metrika alapú tesztelés .....................................................................................................................47
4. 2. 2. Teszt lefedettség elemzık.................................................................................................................50
4. 3. Bázis útvonaltesztelés.............................................................................................................. 50
4. 3. 1. McCabe bázis útvonaltesztelése .......................................................................................................51
4. 4. Adatáram alapú tesztelés........................................................................................................ 54
2
4. 5. A strukturális tesztelés áttekintése ........................................................................................ 58
5. A Grafikus felhasználói interfész tesztelése ........................................................................60
5. 1. A grafikus felhasználói interfész (GUI) sajátosságai ........................................................... 60
5. 2. Néhány nehézség a teszteléssel kapcsolatban........................................................................ 61
5. 3. Tesztelési stratégia................................................................................................................... 64
5. 3. 1. Alapelvek .........................................................................................................................................64
5. 3. 2. A hibák típusai .................................................................................................................................65
5. 4. A tesztelés típusai .................................................................................................................... 66
5. 5. A tesztelés automatizálása ...................................................................................................... 69
5. 6. A felhasználói felület tervezése a könnyebb tesztelhetıség érdekében............................... 71
6. Objektumorientált tesztelés ..................................................................................................73
6. 1. Teszttervezés............................................................................................................................ 73
6. 1. 1. Objektumosztály tesztelése ..............................................................................................................74
6. 1. 2. Objektumintegráció ..........................................................................................................................76
7. Tesztelı eszközök..................................................................................................................78
8. Összefoglalás ........................................................................................................................81
Irodalomjegyzék .......................................................................................................................82
3
Köszönetnyilvánítás
4
Horváth László Szoftvertesztelés a gyakorlatban
1. Elıszó
5
Horváth László Szoftvertesztelés a gyakorlatban
6
Horváth László Szoftvertesztelés a gyakorlatban
2. Bevezetés, alapfogalmak
Amint azt késıbb látni fogjuk rengeteg tesztelési stratégia, eljárás létezik, azonban mind
egyetlen célt szolgálnak: növelni a bizalmat a szoftver megfelelı mőködésével kapcsolatban.
Ezen cél érdekében, a szoftver egyes részei különbözı paraméterekkel és objektumokkal
kerülnek végrehajtásra, tovább növelve a bizalmat azáltal, hogy felfedik a felhasználói
követelményektıl való eltérést. Ily módon javítható a biztonság, a teljesítmény, vagyis az
úgynevezett nem funkcionális jellemzık. Ahhoz, hogy minden célt kiszolgáljunk, különbözı
stratégiákat vethetünk be a tesztelés során. Általában a tesztelési stratégiákat két nagy
csoportba szokás sorolni:
1. Statikus elemzés technikája, ahol a statikus szó azt jelzi, hogy ezek a módszerek nem
foglalják magukban a rendszer végrehajtását. A statikus technikák a teljes
életciklusban alkalmazhatóak, különbözı célok érdekében, mint amilyen az
implementáció és a követelmények közötti megfelelés vizsgálata, vagy a kódolási
hibák felderítése.
2. A másik csoport a dinamikus elemzési technikáké, amelyek alkalmazása során a
tesztelı a gyakorlatban használja a szoftvert a hibák felfedése érdekében. Ezen
eljárások segítségével a program viselkedésének, és minıségének jellemzıi szintén
megfigyelhetık.
A statikus és dinamikus technikák egymást kiegészítik. Az elızı szolgáltatja az általános
jellemzıket és eredményeket, amik azonban nem elég pontosak. Dinamikus technikák
alkalmazásával sokkal pontosabb adatokat kaphatunk, de ezek csak a végrehajtásra
korlátozódnak. A dolgozatban általában dinamikus technikákkal foglalkozunk.
Vannak bizonyos matematikai igazságok, amelyeket a tesztelés során szem elıtt kell
tartanunk. A legfontosabb, hogy egy kiterjedt és alapos tesztelés után a szoftver még mindig
tartalmazhat hibákat. Amint azt Dijkstra harminc évvel ezelıtt megállapította, a tesztelés
sosem bizonyítja a hibamentességet, legfeljebb felfedi a hibák jelenlétét, hibás mőködés
elıidézésével. Az elmúlt évtizedekben, vizsgálatok és gyakorlati tapasztalatok sokaságának
köszönhetıen sok új információra tettünk szert a programok futtatásával kapcsolatban, és sok
új eszköz segíti a tesztelést. Egyre világosabban látszik, hogy csak további gyakorlati
megfigyelések növelhetik a tesztelés érettségének szintjét.
7
Horváth László Szoftvertesztelés a gyakorlatban
Éppen ezért a tesztelés egy mőszaki tudományként fogható fel, ami a gyakorlat alapján
von le következtetéseket, jelenlegi adatokból következtet a jövıre vonatkozóan, a tesztelık
korábbi tapasztalatai alapján. A szoftverek tesztelése a program viselkedésének vizsgálatát
jelenti, az elvárt viselkedést szem elıtt tartva, a tesztesetek véges készletén, megfelelıen
kiválasztva ezeket, az általában végtelen végrehajtási tartományból. Ez a rövid meghatározás
magában foglalja a tesztelés egyik legnagyobb problémáját, miszerint a program csak egy
véges, kiválasztott tesztkészleten hajtható végre a tesztelés során. Találnunk kell tehát egy
olyan eljárást, ami megfelelı feltételek mentén ideális teszteseteket választ ki. A tesztelıknek
elıvigyázatosnak kell lenniük a kiválasztási technika meghatározása során, hiszen a
különbözı tesztkészletek nagyon eltérı hatékonysághoz vezethetnek. Az „elvárt” szó mutatja,
hogy a program végrehajtása során tapasztalt mőködés elfogadható, vagy sem.
8
Horváth László Szoftvertesztelés a gyakorlatban
2. 2. Teszteset
2. 3. A program megbízhatósága
9
Horváth László Szoftvertesztelés a gyakorlatban
2. 4. Tesztelési alapelvek
Az elsı és talán legfontosabb alapelv a teszteléssel kapcsolatban a nyomonkövethetıség.
Ez egyrészt fontos a hibák pontos helyének felderítése szempontjából, másrészt pedig a
tesztek késıbbi megismételhetısége miatt. Egy teszt nem tekinthetı elfogadhatónak, ha
késıbb nem ismételhetı meg. Ennek a regressziós tesztelés során van nagy jelentısége, ahol
pont az a cél, hogy a korábban felfedett hibák javítása után meg kell ismételni a teszteket
annak érdekében, hogy kiderítsük, a javítás nem vitt-e újabb hibákat a rendszerbe.
A következı alapelv, hogy a teszteket már jóval a teszt konkrét futtatása elıtt meg kell
tervezni. Ugyanúgy, ahogy elkészítjük a rendszertervet, el kell készíteni egy teszt tervet is,
ami magában foglalja a tesztesetek pontos leírását, és azt, hogy mi az elvárt eredmény a
tesztelés során. Ettıl eltérni csak nagyon kivételes esetben lehet. Ez azért nagyon fontos, mert
így nem a teszt idomul a rendszerhez, hanem kénytelenek vagyunk a rendszert javítani
egészen addig, amíg minden elıre eltervezett teszt hibátlanul le nem fut.
A Pareto-elv kimondja, hogy a hibák 80%-a a kód 20%-ban fordul elı. Ez valószínőleg
azon alapszik, hogy a hibák általában csoportosan, csomósodva fordulnak elı. Ezt minden
programozó tapasztalhatta, aki készített már önállóan programot. Elıfordul, hogy egyetlen
hiba kijavítása tucatnyi egyéb rendellenesség javulásához vezet. Minden cégnél érdemes a
tipikus hibákról adatbázist készíteni, ami nagyban megkönnyítheti a tesztelık és a
programozók munkáját azáltal, hogy a leggyakoribb hibák után kutatnak saját rendszerükben,
lerövidítve így a tesztelés és a javítás idejét.
A tesztelést kezdjük mindig kicsiben és haladjunk a nagyobb részek felé. Elsı lépésben
tehát gyızıdjünk meg az eljárások, függvények helyes mőködésérıl, majd jöhetnek a
modulok, alrendszerek, és végül a teljes rendszer.
Egy korábban említett alapelvet itt is megemlítünk, hiszen így lesz teljes a felsorolás. Ez
az elv nem más, minthogy egyetlen modul vagy rendszer sem tesztelhetı hiánytalanul,
minden részletre kiterjedıen. Ennek két alapvetı oka van. Az elsı egy elméleti korlát, a
bizonytalanság problémája. Senki sem szeret úgy munkát végezni, hogy minden lépésben
ellenırzésnek vetik alá. A második egy sokkal kézzelfoghatóbb korlát, a költség és idıbeli
határok. A tesztelık terhelhetısége is véges.
10
Horváth László Szoftvertesztelés a gyakorlatban
2. 5. Ki teszteljen?
2. 6. Hibák típusai
11
Horváth László Szoftvertesztelés a gyakorlatban
2. 7. A tesztek osztályozása
Ez az egyetlen szó, hogy tesztelés, technikák egész skáláját foglalja magába, amelyek
mind különböznek egymástól, és változatos célokat szolgálnak. Két különbözı osztályozási
szintet különítünk el. Az elsı a rendszer részletessége alapján különbözteti meg a tesztelési
típusokat. Ez alapján megkülönböztetünk egység, integrációs és rendszer tesztet. Ezekrıl
késıbb még ejtünk pár szót. A másik fajta felbontás pedig fıleg a tesztelés módjára
vonatkozik. Itt megkülönböztetünk fekete (funkcionális) és fehér-doboz (strukturális)
tesztelést. Az alapvetı különbség a két módszer között, hogy a fekete-doboz teszt a specifikált
viselkedést vizsgálja a kód ismerete nélkül, míg az utóbbi a programozott viselkedést a kód
ismeretében. A közös ezekben a technikákban, hogy mind a specifikált és a programozott
viselkedés közötti különbségeket keresik. A kettı különbségét szemléletesen mutatja a
következı oldalon látható 2. 1. ábra.
12
Horváth László Szoftvertesztelés a gyakorlatban
Specifikált Programozott
(elvárt) (tapasztalt)
mőködés mőködés
Az ábráról leolvasható a korábban már tárgyalt fault két alapvetı okozója. Az elsı,
amikor a hiba olyan kódrészletnél váltódik ki, ami nem szerepelt a specifikációban
(felesleges kód). Ha pedig a tulajdonságot specifikáltuk, de nem programoztuk le, akkor
hiányos program okozta hibáról beszélünk.
Specifikált Programozott
(elvárt) 2 (tapasztalt)
mőködés mőködés
5 1 6
4 3
Tesztesetek
(ellenırzött
mőködés)
13
Horváth László Szoftvertesztelés a gyakorlatban
14
Horváth László Szoftvertesztelés a gyakorlatban
Tesztelt
Alrendszer Rendszerterv Követelmény-
kódja Unit teszt alrendszer dokumentum dokumentum,
felhasználói kézikönyv
Tesztelt Integrált
alrendszer alrendszerek
Alrendszer
kódja Unit teszt Integrációs Mőködés
Tesztelt tesztelés tesztelése
alrendszer Mőködı
Fejlesztıi tesztek rendszer
Alrendszer
kódja Unit teszt
Elfogadott Validált
Installációs rendszer Elfogadási rendszer Teljesítmény
teszt teszt teszt
15
Horváth László Szoftvertesztelés a gyakorlatban
3. Funkcionális tesztelés
3. 1. Példák
3. 1. 1. Háromszög probléma
16
Horváth László Szoftvertesztelés a gyakorlatban
Annak oka, hogy ez a példa ilyen elterjedt és ilyen hosszú idın keresztül megállja a helyét
az, hogy világos ám mégis komplex logikát tartalmaz. Rendkívül jól példázza továbbá a
megrendelık, a fejlesztık és a tesztelık közötti kommunikációs gondokat is. A specifikáció
feltételezi, hogy a készítık ismerik a háromszög tulajdonságait, legfıképpen azt, hogy egy
háromszög bármely két oldalának összege nagyobb a harmadik oldal hosszánál. Az oldalak
hosszára vonatkozó megkötés (maximum 200) önkényes és egyben kényelmes is. Ezt a
tulajdonságot késıbb a határérték tesztelésnél fogjuk kihasználni.
3. 1. 2. A „NextDate” probléma
17
Horváth László Szoftvertesztelés a gyakorlatban
3. 2. Ekvivalencia-osztályozás
3. 2. 1. Irányvonalak az osztályozáshoz
18
Horváth László Szoftvertesztelés a gyakorlatban
Ha egy olyan programot tesztelünk, amely egy konkrét értékkel dolgozik, akkor szintén
három osztályt érdemes létrehozni. Az egyikben csak az érvényes érték lesz, egy másikban
egy érték, ami kisebb az elvártnál a harmadikba pedig egy nagyobb érték kerül. Ez
természetesen olyan esetben, ha nem lehet háromértékő az input (például a logikai típus
esetében) két osztályra redukálódik és elıáll a klasszikus érvényes és érvénytelen inputok
esetére bontás. Gyakorlatilag a halmazok esetében is ez a helyzet. Veszünk egy értéket a
halmazból és egyet a halmazon kívülrıl.
Az itt felsorolt osztályozási módszereket természetesen mindig az aktuális probléma
szerint kell módosítani, miután alaposan áttanulmányoztuk a feladat specifikációját.
A következıkben tisztázzuk a különbséget a gyenge és az erıs ekvivalencia-osztályozás
között.
Tegyük fel, hogy adott egy F függvény, amely x1 és x2 értékeket kapja inputként. A két
számra a következı feltételek érvényesek:
a≤ x1 ≤d, ahol az [a, d] tartomány három résztartományból áll: [a, b),[b, c),[c, d)
e≤ x2 ≤g, ahol [e, g] szintén résztartományokra oszlik: [e, f), [f,g]
19
Horváth László Szoftvertesztelés a gyakorlatban
X2
X1
a b c d
3. 1. ábra. Gyenge ekvivalencia-osztályozás
20
Horváth László Szoftvertesztelés a gyakorlatban
X2
X1
a b c d
3. 2. ábra. Erıs ekvivalencia-osztályozás
Az elnevezés elsıre talán kicsit ellentétesnek tőnhet. Hogy lehet valami egyben gyenge és
robusztus is? A robusztusság abból adódik, hogy figyelembe vesszük az érvénytelen inputokat
is. Az eljárás gyenge volta pedig az egyszerő hibamegjelenéssel kapcsolatos szemléletre utal.
Régen nevezték ezt az eljárást hagyományos ekvivalencia-osztályozásnak is. A módszer,
amellyel a teszteseteket elıállítjuk, gyakorlatilag két lépésbıl tevıdik össze:
1. Az érvényes inputokra válasszunk adatokat, a gyenge ekvivalencia-osztályozáshoz
hasonlóan. Itt minden érték, ami a tesztesetben szerepel érvényes tartománybeli.
2. Érvénytelen inputok esetén pedig választunk egy értéket valamely érvénytelen
tartományból a többit pedig, ami a tesztesetben szerepel, érvényes osztályokból
kell választani. Ebben a lépésben használjuk ki az egyszerő hibamegjelenés elvét,
vagyis, hogy egyszerre csak egy adat lehet hibás.
21
Horváth László Szoftvertesztelés a gyakorlatban
X2
X1
a b c d
3. 3. ábra. Gyenge robusztus ekvivalencia-osztályozás
Két probléma merül fel a robusztus ekvivalencia teszteléssel kapcsolatban. Az elsı, hogy
a specifikációban gyakran nem rögzítik, hogy mik az elvárt kimeneti értékek egy érvénytelen
teszteset esetén. (Próbálhatunk azzal érvelni, hogy ez a specifikáció hiányossága, de ez sajnos
nem oldja meg a problémát.) Éppen ezért a tesztelık rengeteg idıt töltenek azzal, hogy
kimeneti értékeket definiáljanak ezekre az esetekre. A második probléma az, hogy az erısen
típusos nyelvek kiküszöbölik a hibás értékekkel kapcsolatos problémákat. Az ekvivalencia-
osztályozás azokból az idıkbıl származik, amikor a COBOL és FORTRAN nyelveket
használták programok írására, vagyis ezek a problémák egyformán fontosak voltak mindenki
számára. Tény, hogy az ehhez hasonló problémák nagyban hozzájárultak a típusos nyelvek
elterjedéséhez.
Az elızı pont alapján mindenkinek lehet némi elképzelése a technika lényegérıl. A dolog
robusztus része a hibás értékek figyelembevételébıl adódik, míg az erıs jelzı a többszörös
hiba elıfordulás lehetıségébıl ered. A teszteseteket, ahogy a 3. 4.-es ábrán is látszik, úgy
kapjuk, hogy az input érték tartományok mindegyikébıl veszünk egy-egy elemet, beleértve az
érvénytelen értékek tartományát is.
A tesztesetek meghatározásához általánosságban elmondható, hogy érvényes osztályok
esetén úgy próbáljuk meghatározni a teszteseteket, hogy minél több osztályt lefedjünk, míg
érvénytelen osztályokhoz mindig egyedi tesztesetet kell készíteni. A cél mindkét esetben az
22
Horváth László Szoftvertesztelés a gyakorlatban
X2
X1
a b c d
3. 4. ábra. Erıs robusztus ekvivalencia-osztályozás
23
Horváth László Szoftvertesztelés a gyakorlatban
A táblázatból kitőnik, hogy külön kell tesztelni a felsı határon túli és az alsó határ alatti hibás
értékekre. A tesztesetek száma 3*2 = 6 lesz.
24
Horváth László Szoftvertesztelés a gyakorlatban
Ha még inkább szét akarjuk szedni az osztályokat, akkor megtehetjük, hogy külön vesszük a
„kisebb mint” és az egyenlı eseteket.
D6’= {<a, b, c> : a = b + c}
D6’’= {<a, b, c> : a > b + c}
25
Horváth László Szoftvertesztelés a gyakorlatban
3. 3 Határérték tesztelés
Egy függvény két halmaz elemei között teremt kapcsolatot. Az elsıbıl kivett elemhez,
hozzárendeli a második halmaz egy elemét. Ezeket szokás, értelmezési tartománynak és
értékkészletnek nevezni. Egy program is felfogható egyetlen függvényként, amelynek
bemeneti értékei alkotják az értelmezési tartományt, kimeneti értékei pedig az értékkészletet.
Az input tartomány vizsgálatán alapuló tesztelési technikák talán a legismertebbek és
legelterjedtebbek. Ebben és a következı fejezetben megvizsgáljuk, hogyan lehet felhasználni
egy program funkcionális jellemzıit a tesztesetek azonosítására.
3. 3. 1 Határérték analízis
X2
X1
a b
3. 5. ábra Kétváltozós függvény input tartománya
26
Horváth László Szoftvertesztelés a gyakorlatban
27
Horváth László Szoftvertesztelés a gyakorlatban
engedi saját típus definiálását, létrehoznánk a hónap felsorolási típust {január, február, … ,
december} és ezt alkalmaznánk a függvény elkészítéséhez. Azonban mindkét módszer esetén
egyértelmő számunkra, a teljes programot megvizsgálva, hogy mit jelent a min, a min+, max
és max- érték. Amikor egy változó diszkrét korlátos érték tartománnyal rendelkezik, ezen
értékek meghatározása szintén egyértelmő. Azonban ha nincsenek jól meghatározott határai a
bemeneti értékeknek, akkor általában nekünk magunknak kell mesterséges határokat
megállapítani. Ha például a háromszög probléma alap megfogalmazását tekintjük, ott nem
voltak meghatározva az alsó és felsı határok. Alsó határt találni nem nehéz, az 1 lesz. Ez
abból a természetes igénybıl ered, hogy negatív oldalhosszúságú háromszög nem létezik. A
felsı határ megállapítása már nehezebb kérdés. Megtehetnénk, hogy a legnagyobb
ábrázolható számot tekintjük felsı határnak. Ilyen MAXINT - nek nevezett érték a legtöbb
nyelvben létezik és gond nélkül használható mőveletekhez. Egy másik lehetıség, ha
önkényesen kijelölünk egy felsı határt az oldalak hosszúságára vonatkozóan, mint ahogy azt a
bıvített megfogalmazásban mi is megtettük, amikor 200 – ra állítottuk be a legnagyobb
értéket.
A határérték analízis alkalmazása logikai változók esetében nehézkessé válhat, hiszen a
minimum és maximum értékek az igaz, illetve a hamis feltételek lesznek. Mi a helyzet
azonban a további három értékkel? A késıbbiekben látni fogjuk, hogy a logikai változók
tesztelésére ez a technika nem igazán alkalmas, helyette a döntési tábla alapú tesztelés
javasolt.
28
Horváth László Szoftvertesztelés a gyakorlatban
3. 3. 2. Robusztusság-teszteléss
X2
X1
a b
3. 6. ábra. Robusztusság tesztelés
29
Horváth László Szoftvertesztelés a gyakorlatban
Ahogy azt korábban említettük, a határérték analízis az egyszerő hiba elıfordulás elvét
alkalmazza a megbízhatóság vizsgálata során. Ha elutasítjuk ezt a feltételt, akkor azt is
megvizsgálhatjuk, hogy mi történik, ha több változó is extrém értéket vesz fel. Vizsgáljuk
meg a problémát a jól ismert kétváltozós függvényen keresztül. Az eljárás úgy indul, hogy az
eddigiekhez hasonlóan mindkét változóhoz elkészítjük az öt értéket tartalmazó (min, min+,
átlagos, max-, max) teszthalmazt. Ezután a halmazok tagjaiból rendezett párokat készítünk. A
lehetséges esetek száma 5*5 = 25 lesz. Az 3. 7.-es ábrán koordináta rendszerben ábrázolva
láthatjuk a tesztkészletet.
30
Horváth László Szoftvertesztelés a gyakorlatban
X2
X1
a b
3. 7. ábra. „Legrosszabb eset” tesztkészlet kétváltozós függvényre
Egy kicsit végiggondolva az eddig olvasottakat láthatjuk, hogy a határérték analízis során
kapott tesztesetek részhalmazát képezik a „legrosszabb eset” tesztelés során kialakulónak. A
tesztesetek száma is ugrásszerően megnı, hiszen a határérték analízis során, egy n változós
függvényt tekintve, 4n+1 tesztesetre volt szükségünk, míg most 5n-re.
A legrosszabb-eset tesztelés jól illeszkedik az eddigi sorozatba melynek során
kiterjesztettük az egyszerő határérték analízist, és ugyanazokkal a hibákkal és korlátokkal
rendelkezik. Az eljárás a legjobban talán olyan rendszerek esetén alkalmazható, ahol a
változók számos különféle módon léphetnek interakcióba egymással, és így megnı a
hibalehetıségek száma is, valamint nagy a hibák bekövetkezésébıl eredı többletköltség.
Amennyiben szükségünk lenne egy minden eshetıségre és hibára felkészülı tesztelési
eljárásra, akkor alkalmazhatnánk egy robusztus-legrosszabb eset technikát. Ennek a
legnagyobb a költsége is (egy kétváltozós függvény esetén 49 teszteset!) és ezért a
gyakorlatban nem igazán alkalmazzák, hiszen a legtöbb hiba elıfordulás kiszőrhetı a két
eljárás külön alkalmazásával.
31
Horváth László Szoftvertesztelés a gyakorlatban
3. 3. 5. Példák
32
Horváth László Szoftvertesztelés a gyakorlatban
33
Horváth László Szoftvertesztelés a gyakorlatban
34
Horváth László Szoftvertesztelés a gyakorlatban
Két teljesen eltérı jellegő problémáról van szó, azonban a technika tökéletesen
alkalmazható mindkét esetben és a tesztesetek száma is ugyanannyi lesz. Látható tehát, hogy a
tesztelés erıforrásigénye nem a változók jellegétıl, hanem azok számától függ.
3. 4. 1. Ok-okozat gráfok
35
Horváth László Szoftvertesztelés a gyakorlatban
Ha A akkor B Ha (A és B) akkor C
3. 4. 2. Döntési tábla
36
Horváth László Szoftvertesztelés a gyakorlatban
Amikor az okok mindegyike bináris jellegő akkor a döntési táblát korlátozott bemeneti
táblának nevezzük, míg ha többértékőek, akkor bıvített bemeneti táblázatról beszélünk.
A döntési tábla felépítésébıl adódóan automatikusan kialakul bennünk a teljesség érzése
az eljárással kapcsolatban.
37
Horváth László Szoftvertesztelés a gyakorlatban
1 71
E V 12
2
^ 70
3 ~ 72
38
Horváth László Szoftvertesztelés a gyakorlatban
3. 5. 1. Mit használjunk?
39
Horváth László Szoftvertesztelés a gyakorlatban
Ha a fenti kérdésekre tisztáztuk a választ, akkor a következı táblázat segítségével talán kicsit
egyszerőbbé válik a megfelelı technika kiválasztása. A táblázat maga is egy döntési tábla,
hiszen szoros összefüggés van a megfogalmazott kérdések és az alkalmazható eljárások
között.
40
Horváth László Szoftvertesztelés a gyakorlatban
41
Horváth László Szoftvertesztelés a gyakorlatban
4. Strukturális tesztelés
A strukturális tesztelési technikák legfıbb megkülönböztetı jegye, hogy mind a
tesztelendı program kódjának elemzésén alapulnak. A tesztelés célja a kód maximális
lefedése. A következı három fejezetben megvizsgáljuk az útvonal tesztelés két fı módját,
valamint az adatáram alapú tesztelést.
4. 1. Útvonal tesztelés
1. Program HAROMSZOG
2. Dim a, b, c As Integer
3. Dim Haromszoge As Boolean
1. lépés: adatok beolvasása
4. Output(„Adjon meg 3 egész számot, amelyek a háromszög oldalai lesznek!”)
5. Input(a, b, c)
6. Output(„A oldal hossza:”,a)
7. Output(„B oldal hossza:”,b)
8. Output(„C oldal hossza:”,c)
2. lépés: alkothat-e háromszöget a három megadott oldal
9. If(a<b + c) AND (b<a + c) AND (c<a + b)
42
Horváth László Szoftvertesztelés a gyakorlatban
A fenti programhoz tartozó gráf a 4. 1. ábrán látható. A 4.-tıl kezdve egészen a 8.-ig a
csúcsok egy sorozatot alkotnak. Ezután a 9-es és 12-es csúcsok között egy if-then-else
elágazás szerkezet jelölése látható. Hasonlóan a 13-tól 22-ig csúcsok is egymásba ágyazott
elágazások sorozatai. A 4-es és 23-as csúcsok a program be- és kilépı állapotai. Az eljárás
ciklusmentes, így az elkészített gráf irányított, körmentes gráf lesz.
A program gráfok fontossága abban áll, hogy a program végrehajtása során utakat jelöl ki
a gráf bevezetı csúcsától a kivezetı csúcsig. A tesztesetek készítése során éppen az lesz a
feladat, hogy valamiféle kapcsolatot hozzunk létre a gráfban található független utak és a
program végrehajtása között. Rendelkezésünkre áll egy elegáns elméleti módszer, amelynek
segítségével a potenciálisan végtelen számú végrehajtási utak számát, kiválasztva a
számunkra érdekeseket. A 4. 2. – es ábrán egy nagyon szemléletes példát látunk arra, hogy
miért nem lehetséges a teljes és kimerítı útvonal tesztelése egy programnak. Az ábrán látható,
hogy 3 különbözı út vezet a B csúcsból az F csúcsba, egy ciklus belsejében. Ha a ciklus csak
18 –szor fut le, akkor is milliárdos nagyságrendő végrehajtási út létezik.
43
Horváth László Szoftvertesztelés a gyakorlatban
4 5 6 7 8
10 11
12
13
21 14
15 16
17 18
19
20
22
23
In
C D E
Out
44
Horváth László Szoftvertesztelés a gyakorlatban
4. 1. 1. DD - utak
45
Horváth László Szoftvertesztelés a gyakorlatban
ötödik eset a normál eset, ahol a lánc csúcsok sorozata egyetlen bemenettel és kimenettel. Ez
egy igen összetett definíció, amelyet a 4. 1. ábrán látott gráf segítségével szemléltetünk. A 4 –
el címkézett csúcs egy példa az elsı esetnek megfelelı DD – útra (nevezzük ezt elsınek). A
23-as csúcs lehet példa a második esetre (nevezzük utolsónak). Az 5-tıl 8-ig élek pedig
megfelelnek az ötödik esetnek. Tudjuk, hogy ennek a DD – útnak az utolsó eleme a 8-as
csúcs, mert ez az utolsó csúcs, ami kielégíti a két kapcsolat feltételét. Ha a lánchoz
hozzávennénk a 9-es csúcsot is, akkor megsértenénk a bemenı fok = kimenı fok = 1 feltételt.
Ha megállunk a 7-es csúcsnál, akkor viszont a maximalitás kritériumát sértenénk meg. A 10,
11, 15, 17, 18 és 21-es csúcsok megfelelnek a negyedik esetben foglaltaknak. A 9, 12, 13, 14,
16, 19, 20 és 22-es csúcsok példaként szolgálnak a harmadik esetre. Szokás a gráfban szereplı
DD – utakat elnevezni az ABC nagy betőivel. A példa alapján megállapítható, hogy a
háromszög probléma egy logikailag összetett, ugyanakkor kis számítási igénnyel rendelkezı
feladat. Ez a fajta kombináció sok, rövid DD – utat eredményez.
Tegyük fel, hogy adott egy feladat implementációja. A hozzá tartozó DD – út gráf egy
olyan gráf, amelynek csúcsai DD – utak a program gráfjából, az élek pedig a DD – utak
közötti vezérlés folyamát mutatják. Valójában a DD – út gráf nem más, mint egyfajta gráf
tömörítés, ahol bizonyos csúcsokat a program gráfból (a láncokat) összevonunk egy csúcsba.
Ez a fajta összevonás és átalakítás nem okoz problémát a tesztelık számára, mert ma már
rendelkezésre állnak olyan programok, amelyek segítségével elkészíthetı egy program DD –
út gráfja. A gyakorlatban 100 sornál hosszabb forráskódú eljárásokhoz segédeszközt
használnak a DD – út gráfok elkészítéséhez.
4. 2. Lefedettség metrikák
46
Horváth László Szoftvertesztelés a gyakorlatban
Metrika Lefedettség
C0 Minden utasítás
C1 Minden DD – út
C1p Minden predikátum minden kimenethez
C2 C1 lefedettsége + ciklus lefedés
Cd C1 lefedettsége + függı DD – út párok
CMCC Többszörös feltételek lefedése
Cik Minden program végrehajtási út k számú ciklusismétlésig (ez általában k = 2)
C∞ Minden lehetséges végrehajtási út
47
Horváth László Szoftvertesztelés a gyakorlatban
DD – út tesztelés
Függı DD – út párok
48
Horváth László Szoftvertesztelés a gyakorlatban
alapján remek példákat tudunk adni függı DD – utakra. A 4. 1.-es ábrán szereplı gráfban
ilyen párt alkot a 9-es és 11-es csúcs, vagy a 10-es és 13-as. Az egyszerő DD – út lefedés nem
értékeli ezeket a függıségeket, így a mélyebben rejlı hibákra nem derül fény.
Ciklus lefedés
49
Horváth László Szoftvertesztelés a gyakorlatban
Konkatenált ciklusok esetén két eset fordulhat elı. Az elsı, hogy a két ciklus független
egymástól, ekkor az egyszerő esethez hasonlóan kell eljárni. A második esetben pedig
függıség áll fenn köztük, ekkor az egymásba ágyazott esetben leírtakat kell alkalmazni.
4. 3. Bázis útvonaltesztelés
A matematikai elgondolás, ami a „bázis” mögött rejlik, nagyon vonzó lehetıségeket kínál
a strukturális tesztelésre. A matematikusok a bázis fogalmát általában egy vektortérnek
nevezett struktúra segítségével definiálják. A vektortér elemei a vektorok, amelyekre az
összeadás és szorzás mőveletek definiálva vannak. További fél tucat feltétel teljesülése esetén
megkapjuk a vektortér definícióját. Minden vektortérhez tartozik egy bázis (valójában több
bázis is tartozhat hozzájuk). Egy vektortér bázisa vektorok egy halmaza, amelyek függetlenek
egymástól és a vektortér bármelyik másik eleme elıállítható a segítségükkel.
A tesztelés lehetıségét rejti magában, ha a programra úgy tekintünk, mint egy vektortérre,
és egy ilyen vektortérre megkeressük a bázis elemeit. Ha a bázis elemei rendben vannak,
akkor feltételezhetjük, hogy minden, ami ezekbıl az elemekbıl származik, szintén rendben
lesz, és helyesen fog mőködni. Ebben a fejezetben megismerkedünk egy kicsit Thomas
McCabe ebben a témában folytatott munkájával.
50
Horváth László Szoftvertesztelés a gyakorlatban
A 4. 4.-es ábrán látható egy rendezett gráf, amire programgráfként fogunk tekinteni. A
programnak egy bemenete van (A), tartalmaz egy ciklust (B, C) két lehetséges kilépési
ponttal, valamint egy elágazást (D, E, F). A kimeneti pont a G csúcs.
B D
C F
51
Horváth László Szoftvertesztelés a gyakorlatban
A
1 2
B D
5 6
7
3 4 E
8
C F
9 10
52
Horváth László Szoftvertesztelés a gyakorlatban
A sorok elején láthatók az utak nevei és hogy melyik csúcsokat foglalják magukban.
Ezután minden élhez feltüntetjük, hogy hányszor halad át rajta az út.
Könnyen ellenırizhetjük a P1-tıl P5-ig utak függetlenségét is. A vastag betős bejegyzések
jelzik azokat a csúcsokat, amelyekben eltérnek a P2 - P5 utak. A P1 út mindegyiktıl független,
hiszen bármelyik másikban találhatunk olyan éleket, amelyek szükségtelenek a P1 út
lefedéséhez. A bázist alkotó utak egyike sem törölhetı és ez az öt út kifeszíti a csúcsokból
létrehozható utak terét. A mátrixban feltüntettük az említett két példát is. Ha megvizsgáljuk az
éleikhez tartozó oszlopokat, szem elıtt tartva, hogyan definiáltuk az összeadást és a szorzást,
könnyen beláthatjuk, hogy valóban elıállíthatóak a megadott módon.
McCabe meghatározott egy módszert is, amelynek segítségével elıállítható a vektortérhez
tartozó bázis. Az eljárás egy alapvonal meghatározásával indul, ami összhangban van a
program egy átlagos végrehajtásával. Ennek kiválasztása némileg önkényesen történhet.
McCabe azt tanácsolja, hogy olyan utat keressünk, ami a lehetı legtöbb csúcsot foglalja
magában. Miután bejelöltük az alapvonalat, elindulunk az elsı csúcstól, és amint egy olyan
csúcshoz érünk, amelynek ≥2 kimenı éle van, a még le nem fedett élen haladunk tovább.
Lássuk McCabe példáját az eljárás szemléltetésére. Alapvonalként az A, B, C, B, E, F, G utat
választjuk. Az elsı hely ahol döntenünk kell az A csúcs, így az elsı bázisút létrehozásához a
2-es élet választjuk, az 1-es helyett. Így megkapjuk az A, D, E, F, G utat. Következı lépésben
ezt az utat követjük és a D csúcsnál a 7-es élen haladunk tovább. Az eredmény az A, D, F, G
53
Horváth László Szoftvertesztelés a gyakorlatban
út. Most már csak a B és C csúcsokat nem értékeltük ki. Ha ezt is megtesszük, megkapjuk a
hátralévı két báziselemet: A, B, E, F, G és A, B, C, G. Megjegyezzük, hogy a most elıállított
bázis utak halmaza nem egyezik meg a táblázatban szereplıvel, ami azonban nem okoz
problémát, hiszen nem követeltük meg a bázis egyértelmőségét, célunk csupán a független
utak egy maximális halmazának lefedése tesztekkel.
Az adatáram egy eléggé szerencsétlen elnevezés, mert azt sugalmazza, hogy valamiféle
kapcsolatban áll az adatáram diagrammal, pedig semmilyen kapcsolat sincs köztük. A
strukturális tesztelésnek ez a módja azt vizsgálja, hogy a programban található változók közül
melyik kap értéket, és melyikre hivatkoznak. Látni fogjuk, hogy az adatáram alapú tesztelés
egyfajta ellenırzı funkciót is betölt az útvonaltesztelésekkel kapcsolatban. Sokan ezt a
tesztelési módot is az útvonaltesztelések közé sorolják.
Már az 1960-es évek óta vizsgálják a programozók a forráskódot abból a szempontból,
hogy melyik változók kapnak értéket, és ezek közül melyeket használjuk fel. A korai
adatáram alapú elemzések gyakran a hibák egy olyan halmazához vezettek, amit ma a
definiálás/referencia problémájaként ismerünk:
• egy változót definiáltuk, de nem hivatkozunk rá
• egy változót használunk de nem definiáltuk
• egy változót kétszer definiálunk használat elıtt.
54
Horváth László Szoftvertesztelés a gyakorlatban
Minden-felhasználás kritérium
55
Horváth László Szoftvertesztelés a gyakorlatban
Elıször is tisztáznunk kell két fogalmat, ami ahhoz szükséges, hogy a kritériumot
megfogalmazhassuk.
• Definíció1: Egy felhasználást predikátum (“predicate”) felhasználásnak nevezünk
(“p - use”), ha a felhasználás egy feltételes utasításban szerepel. Például az if x>0
utasítás az x változó egy p - felhasználásának számít.
• Definíció2: Egy felhasználás számítási (“computation”) felhasználás (“c - use”), ha
nem predikátum felhasználás Például az „...=y+2” egy c - felhasználás y-ra nézve.
A minden c - felhasználás/néhány p - felhasználás kritérium megköveteli, hogy egy
definíció minden c - felhasználását le kell tesztelni, továbbá, ha egy definíciónak nincsen
számítási felhasználása, akkor ennek legalább egy predikátumbeli felhasználását végre kell
hajtani legalább egy teszteset segítségével.
Az iménti példa esetén az y=1 és az y=0 program inputokból alkotott halmaz teljesíti a
minden c - felhasználás/néhány p - felhasználás kritériumot, hiszen az x=1, read(y) definíciók
minden számítási felhasználását (y=y+x, y=y-x), továbbá a read(y) if y>0 predikátumbeli
felhasználását leteszteljük.
56
Horváth László Szoftvertesztelés a gyakorlatban
7. ...
8. endif;
Minden-definíció-felhasználás-út
57
Horváth László Szoftvertesztelés a gyakorlatban
A strukturális tesztelés, vagy fehér doboz tesztelés során feltételeztük, hogy a tesztelınek
lehetısége van a kód vizsgálatára. A program forráskódja alapján bevezettük a program gráf
fogalmát és ehhez kapcsolódóan egy sor technikát ismertettünk, amelyek mind azt a célt
szolgálják, hogy növeljük a szoftverrel szembeni bizalmat. A fejezetben elıször ismertettük
az útvonal tesztelést, amihez szorosan kötıdött a DD – utak fogalma. Ezután néhány
szoftvertesztelési metrikával és azok használatával ismerkedtünk meg, majd ezeket követte
McCabe módszerének leírása a bázis útvonaltesztelésrıl. Végül bepillantást nyerhettünk az
adatáram alapú tesztelési kritériumok világába is.
A strukturális teszteléssel a programozói hibák könnyen felismerhetıek, hiszen a kód
nyitott könyvként szerepel elıttünk. Hátránya viszont a technikának, hogy a hiányos vagy
hibás szoftverspecifikációt nem ismeri fel. Nem detektálja továbbá a specifikációban
megfogalmazott, de nem implementált függvények hiányát sem. Korábban láthattuk a
funkcionális tesztelési módszerek hátrányait is és könnyen megállapítható, hogy egyik
módszer sem képes önmagában minden hibát felfedni. Még azt sem lehet mondani, hogy az
egyik sokkal hatékonyabb lenne a másiknál. Egymás kiegészítıi és mindig az alkalomhoz
mérten kell kiválasztani a számunkra legmegfelelıbbet. Általában azonban jó tanácsként
érdemes megfogadni, hogy mindig a funkcionális tesztekkel indítsunk, és utána mélyedjünk el
a kód elemzésében és a strukturális tesztek elvégzésében.
Mostanra felmerülhetett bennünk a kérdés, hogy vajon mikor kell abbahagyni a tesztelést,
illetve meddig érdemes folytatni? Nos erre több válasz is adható attól függıen, hogy mennyi
erıforrás áll rendelkezésünkre, illetve, hogy mik az elvárásaink a teszteléssel kapcsolatban.
Íme néhány lehetséges válasz a kérdésre:
1. Ha kifutottunk az idıbıl.
2. Ha a további tesztelés nem okoz újabb failure-öket.
3. Ha a további tesztelés nem tár fel újabb fault-okat.
4. Amikor nem tudunk kitalálni újabb teszteseteket.
5. Ha elértük a kívánt lefedettség szintet.
6. Amikor az összes hibát eltávolítottuk.
58
Horváth László Szoftvertesztelés a gyakorlatban
Sajnos az elsı válasz túl általános és a hatodik egyáltalán nem garantálható. A legtöbb
szoftver megbízhatósági modell a második és harmadik feltételt tekinti mérvadónak. Ezeket a
gyakorlatban is nagy sikerrel alkalmazzák. A negyedik feltétel is viszonylag hasznos lehet,
amennyiben követjük az ismertetett eljárásokat. Azonban ha híján vagyunk a motivációnak,
akkor ez a feltétel is hasztalanná válik. Az ötödik feltétel arra az esetre vonatkozik, hogy ha a
tesztelés során a feltárt hibák száma elkezd rohamosan csökkeni és a ráfordított költségek
meghaladják a hasznot. Amennyiben biztosak vagyunk benne, hogy nem maradtak nagy
veszélyt jelentı hibák a rendszerben akkor abbahagyhatjuk a tesztelést. Ha sikerült
megadnunk egy maximális lefedését a program gráfjában lévı független utaknak, akkor
szintén befejezhetjük a tesztelést, erre vonatkozik a hatodik feltétel. Az, hogy ki melyik
feltételt tekinti mérvadónak személy, vállalat, illetve alkalmazásfüggı dolog. Olyan
rendszerek esetében, ahol emberéletek, vagy nagy értékő felszerelés kerülhet veszélybe a
helytelen mőködés miatt, minél inkább törekedni kell az utolsó pont teljesítésére.
A következıkben eltávolodunk a szoftver szerkezeti elemeitıl és a kódtól és bemutatjuk a
felhasználói interfészek tesztelésére vonatkozó alapelveket, valamint foglalkozunk a
napjainkban egyre fontosabb objektum orientált tesztelést érintı problémákkal.
59
Horváth László Szoftvertesztelés a gyakorlatban
A mai alkalmazások szinte kivétel nélkül megkövetelik, hogy készüljön hozzájuk egy
felhasználói interfész, amelyen keresztül használatuk és karbantartásuk könnyebbé,
kezelhetıbbé válik. A kliens/szerver rendszerek esetében például egy átlagos felhasználó csak
az interfészen keresztül kerül kapcsolatba a rendszerrel, így annak minıségébıl tud csak
következtetést levonni a teljes rendszerrel kapcsolatban. Egy szoftverrendszer tesztelése során
a tesztelıknek meg kell birkózniuk a felület mőködéséhez szükséges függvények tesztelésével
is. A korábbi fejezetekben láthattuk, hogy egy alkalmazás input és output tartománya
lényegében végtelen lehet. A hibalehetıségek számát és a programhoz tartozó gráf
bonyolultságát csak tovább növelik a felhasználói interfész elemei.
A témával foglalkozó szakirodalomban újabban hajlamosak abba az irányba elmenni,
hogy csupán a felület tesztelését segítı eszközöket ismertetik, a mögöttes elvi tartalmat
mellızve. Itt megpróbálunk bemutatni egyfajta folyamatot, ami mentén a tesztelés elvégzése
és a hibák felfedése könnyebbé válik.
60
Horváth László Szoftvertesztelés a gyakorlatban
Eseményvezérelt alkalmazás
61
Horváth László Szoftvertesztelés a gyakorlatban
aktív. A lehetıségek nagy száma megkívánja a kódtól, hogy helyesen kezelje a következı
lépést, bármi legyen is az. A legtöbb esetben ezek az események a háttérben, rendszerszinten
is kezelhetıek, néha azonban a programozóknak maguknak kell ezeket elkészíteni. Sok hiba
forrása lehet, ha nem megfelelıen gondoljuk végig a lehetıségeket, és nem készítünk
megfelelı kezelıfüggvényeket.
Objektum orientáltság
62
Horváth László Szoftvertesztelés a gyakorlatban
63
Horváth László Szoftvertesztelés a gyakorlatban
Ablakkezelés
5. 3. Tesztelési stratégia
5. 3. 1. Alapelvek
64
Horváth László Szoftvertesztelés a gyakorlatban
5. 3. 2. A hibák típusai
65
Horváth László Szoftvertesztelés a gyakorlatban
5. 4. A tesztelés típusai
Az ellenırzı lista alkalmazása egyenes utat biztosít ahhoz, hogy könnyen végezzünk
újrafelhasználható és megismételhetı tesztelést. Sajnos nem túl gyakran alkalmazzák, aminek
oka talán az lehet, hogy túl egyszerő és triviálisnak tőnik. Azonban pont ez az egyszerőség
adja a módszer hatékonyságát. Nagyon jól használható a tesztelés alacsonyabb szintjein a
komponensek tesztelésére és nagyban megkönnyíti a dokumentációt is. Az ellenırzı listák
leggyakrabban használt és legjobban dokumentált elemei:
• Alap programozási/interfész elemek:
o ablak méret, pozíció, modalitás
o standard rendszer parancsok, gombok, mint például minimalizálás, bezárás
• Alkalmazásfüggı szokásos elemek:
o Ok, mégse, folytatás gombok, elrendezés, színek, méretek
o A vezérlı gombok konzisztens használata
o Címkézéshez standard szavak, szövegek használata (segítség, súgó,
kivágás/beszúrás)
Ezek az elemek már a komponensek tesztelése során ellenırizhetık, így akár a programozók
is elvégezhetik, ugyanakkor a teljes alkalmazás tesztelése során is nagy figyelmet érdemelnek.
A navigáció tesztelése
66
Horváth László Szoftvertesztelés a gyakorlatban
Amennyiben a fenti elemek nem állnak rendelkezésre, akkor gondoskodni kell ezek
szimulálásáról, helyettesítésérıl. Ha ezekkel elkészültünk, akkor a következı dolgokat kell
implementálni:
• Azonosítani kell az összes lehetséges elérési módját az ablaknak, és mindegyikhez
tesztesetet kell készíteni
• Azonosítani kell az összes olyan funkciót, elemet, amelyet az alkalmazás során
elérhetünk az ablakból, és tesztesetet kell készíteni hozzájuk
• Azonosítani kell a megfordítható mőveleteket (például egy meghívott ablak
bezárása után, vissza kell térni a hívó ablakhoz) és teszteseteket kell készíteni
hozzájuk
• Azonosítani kell a vissza nem fordítható mőveleteket (például a hívó ablak
bezáródik a hívott ablak elıtőnésekor) és teszteseteket kell készíteni hozzájuk
Rengeteg módja lehet egy alkalmazáson belül annak, hogy elıhívjunk egy ablakot (menü,
billentyőzet, gombok, stb.). Ilyen esetekben minden egyes lehetıséghez külön tesztesetet kell
készíteni.
Az alkalmazás tesztelése
Ezen a ponton valamilyen fekete doboz tesztelés elvégzése történik, amelynek során
megfigyeljük, hogy a felületen található elemek helyesen mőködnek-e. A hagyományos form
alapú alkalmazások esetében itt kezdıdik a tesztelés. Egyaránt figyelni kell a bemeneti és
kimeneti értékek helyességére, az eredmény megfelelı formában való megjelenítésére.
67
Horváth László Szoftvertesztelés a gyakorlatban
A szinkronizáció tesztelése
68
Horváth László Szoftvertesztelés a gyakorlatban
5. 5. A tesztelés automatizálása
Az eddig ismertetett eljárások és alapelvek során nagy hangsúlyt kapott, hogy a tesztelés
megkezdése elıtt alaposan végig kell gondolni, és mindvégig szem elıtt tartani, mik a
céljaink a teszteléssel. Ha ezeket a célokat nem felejtjük el és ezek mentén dolgozunk, akkor a
tesztelés bizonyos fázisai automatizálhatóvá válnak. Az alábbiakban felsorolunk néhány olyan
tanácsot és alapelvet, amelyek hasznosak lehetnek a tesztelés automatizálását elısegítı
eszközök készítéséhez:
• Pareto elv: Az általános bevezetı részben már szó volt a Pareto elvrıl, amely
szerint a hibák 80%-a a kód 20%-ban fordul elı. Ennek egy kissé módosított
változata szerint a tesztelés 20%-nak módosításával 80%-os haszonra tehetünk
szert idıben és erıforrásban.
• Vegyes megközelítés: ahol csak lehet, használjunk segédeszközöket a manuális
tesztelés elıkészítésére, megkönnyítésére, és mindig álljunk készen arra, hogy
bizonyos feladatokat kézzel kell elvégezni, akár a támogató eszközök
meghibásodása miatt is.
• Alkalmi scriptek: A leghatékonyabb akkor alkalmazni ıket, ha olyan kóddal
találjuk szemben magunkat, ami egy általánosan elkészített script segítségével nem
tesztelhetı (például sok ciklus és case utasítás).
• Rögzített scriptek: olyan scriptek, amelyek könnyővé teszik a tesztek
megismétlését.
69
Horváth László Szoftvertesztelés a gyakorlatban
Ezek után módunk nyílik egy lista összeállítására arról, hogy a felhasználói interfész
tesztelése során melyik folyamatot érdemes automatizálni, illetve melyiket végezzük
manuálisan. Az 5. 1.-es táblázatban láthatóak ezek az ajánlások. Az itt felsoroltak
természetesen nem kötelezı érvényőek, minden szervezetnek megvannak a saját kialakult
szokásai, hogy mit kell kézzel tesztelni, illetve mikor és milyen eszközöket lehet felhasználni
az automatizáláshoz.
70
Horváth László Szoftvertesztelés a gyakorlatban
71
Horváth László Szoftvertesztelés a gyakorlatban
72
Horváth László Szoftvertesztelés a gyakorlatban
6. Objektumorientált tesztelés
6. 1. Teszttervezés
73
Horváth László Szoftvertesztelés a gyakorlatban
6. 1. 1. Objektumosztály tesztelése
74
Horváth László Szoftvertesztelés a gyakorlatban
tesztsorozatra van szükség. Tegyük fel, hogy adott egy osztály, amely egy hımérséklet mérı
állomás irányításáért felelıs. Minden órában be kell kapcsolni egy mőszert, ami megméri a
pillanatnyi hımérsékletet. Ebben az esetben a bekapcsolás önállóan tesztelhetı, viszont a
kikapcsolás teszteléséhez elıször be kell kapcsolni a mőszert. Érdemes tehát a kettıt együtt
vizsgálni. Az objektumok állapotainak teszteléséhez egy állapotmodell használatára van
szükség. Ennek a modellnek a segítségével azonosítható a tesztelendı állapotátmenetek
sorozata és meghatározhatók az állapotátmenetek eléréséhez szükséges események. Általában
az összes állapotátmenet sorozatot tesztelni kell, a gyakorlatban azonban, a magas költségek
miatt, sokszor csak részleges tesztelést végeznek.
Mivel objektumorientált rendszerekben gyakran alkalmazzák az öröklést, mint nyelvi
eszközt, így el kell gondolkozni az alosztályok objektumainak és mőveleteinek tesztelésén is.
Olyan esetekben, amikor egy alosztály örököl egy mőveletet a szuperosztálytól, minden
örökölt mőveletet tesztelni kell, hiszen ezek a mőveletek felhasználhatnak más mőveleteket és
attribútumokat, amik viszont megváltozhattak a származtatás során. A felülírt mőveletekkel
hasonló a helyzet. A könnyebb tesztelhetıség érdekében annyi engedmény tehetı, hogy egy
eljárásnak vagy függvénynek csak azon részeire kell új teszteseteket készíteni, ahol
változásokat idézett elı a származtatás és esetleg új hibák kerülhettek a rendszerbe. Tegyük
fel például, hogy adott két osztály, amelyek többek között a következı függvényeket
tartalmazzák:
• Alap osztály:
o inherited(int x)
o redefined() – 1 és 10 közötti számokkal tér vissza
• Származtatott osztály:
o redefined() – 0 és 20 közötti számokkal tér vissza
75
Horváth László Szoftvertesztelés a gyakorlatban
6. 1. 2. Objektumintegráció
76
Horváth László Szoftvertesztelés a gyakorlatban
érdekében. Egy teljes forgatókönyv tesztelés során ráadásul figyelembe kell venni a
kivételeket, és azok helyességét is meg kell vizsgálni.
A tesztek tervezése során érdemes ellenırzı listákat készíteni, amelyek segítségével
nyilvántarthatjuk, hogy melyik metódusokat teszteltük már. Természetesen lehetetlen az
összes lehetséges kombinációt lefuttatni, de így legalább biztosítjuk, hogy minden metódus
tesztelve lett valamely sorozat részeként.
77
Horváth László Szoftvertesztelés a gyakorlatban
7. Tesztelı eszközök
AdaTEST95
78
Horváth László Szoftvertesztelés a gyakorlatban
C++ Test
CppUnit
HttpUnit
Egy Java könyvtár web alkalmazások tesztelésére. Lehetıségünk van böngészı program
használata nélkül hozzáférni weboldalakhoz a szükséges tesztelések elvégzéséhez. A HttpUnit
a http protokoll szimulálása révén támogatja különbözı formokkal kapcsolatos feladatok
elvégzését, lehetıség van JavaScript futtatására és alapvetı autentikációs mőveletek
elvégzésére. Lehetıségünk van a visszakapott oldalakat egyszerő szövegként, valamint
formok, táblázatok és linkek halmazaként kezelni. Bármely Java futtató platformra elérhetı a
http://httpunit.sourceforge.net oldalon. Hasonló tulajdonságokkal rendelkezik a HtmlUnit
nevő eszköz is: http://htmlunit.sourceforge.net.
79
Horváth László Szoftvertesztelés a gyakorlatban
JUnit
Széles körben használt és nagyon kedvelt Java nyelven íródott programok teszteléséhez.
Nagy mértékben támogatja regressziós tesztek végzését beépített függvények segítségével.
Néhány Java fejlesztıkörnyezetbe eleve integrálják az eszköz használatának lehetıségét,
elismerve ezzel képességeit (pl. NetBeans). Függvényhívások szimulálásával végezhetı a
tesztelés, melynek során elıre beállíthatjuk mi az elvárt eredmény. Lehetıség van grafikus
formában megtekinteni az eredményt és a tesztelést is indíthatjuk egy grafikus interfészen
keresztül. Természetesen kódból is hívható és beépíthetjük programjainkba. Az ingyenesen
letölthetı Java kiegészítés és a hozzátartozó dokumentáció elérhetı a http://www.junit.org
weboldalon.
PhpUnit
80
Horváth László Szoftvertesztelés a gyakorlatban
8. Összefoglalás
A dolgozat elkészítésével szerettem volna egy összefoglaló képet adni a rendelkezésre álló
és a gyakorlatban jól használható tesztelési módszerekrıl, eljárásokról. Igyekeztem mindenhol
a témának megfelelı, azt jól szemléltetı példákat találni, megkönnyítve ezzel a megértést.
Ahogy azt az elsı fejezetben megjegyeztem kutatásaimat fıleg a unit tesztek szintjén
végeztem, hiszen a programozók leggyakrabban ezen a szinten dolgoznak és végzik saját
munkájuk tesztelését. A cél az volt, hogy egy tömör képet adjak a tesztelésnek errıl a
szintjérıl, rávilágítva a problémákra és a lehetséges megoldásokra. A dolgozat végén
ismertetett segédeszközök közül volt alkalmam néhányat a gyakorlatban is kipróbálni. Az
olyan termékek, mint az RTRT igazán remek lehetıséget nyújtanak azoknak, akiknek egy
komplett tesztrendszerre van szükségük és sikeresen alkalmazhatók nagyobb vállalati
projektek tesztelésére is. Ha viszont csak kisebb alkalmazásokat szeretnénk tesztelni, akkor
készíthetünk a JUnithoz hasonló osztályokat, szinte bármelyik manapság elterjedt
programnyelvhez. A dolgozatban leírtak alapján könnyebb lehet az elindulás ilyen eszközök
készítéséhez.
A másik fontos dolog, amit a diplomamunkámmal kapcsolatban meg kell említeni az,
hogy a készítése során rendkívül kevés magyarnyelvő anyagot találtam. Sajnos hazánkban
nem nagyon van olyan könyv, amely mérvadónak számítana szakmai körökben éppen ezért
nehéz az információk megszerzése. A dolgozat jó alapot szolgáltat az egyetem hallgatóinak is
a tesztelés alapjainak elsajátításához.
81
Horváth László Szoftvertesztelés a gyakorlatban
Irodalomjegyzék
82