Fehérdoboz-tesztelés¶
A fehérdobozos teszt (más néven strukturális teszt) egy olyan tesztelési módszer, amely az alkalmazás belső struktúráit vagy működését teszteli, szemben annak funkcionalitásával (azaz a feketedobozos teszteléssel). A fehérdobozos tesztelés során a rendszer belső perspektíváját, valamint a programozási készségeket használják a tesztesetek megtervezéséhez. A tesztelő az inputokat a kódon keresztüli útvonalak vizsgálatához választja ki, és meghatározza a várható kimeneteket.
Utasítástesztelés¶
Utasítástesztelésben a lefedettségi elemek a végrehajtható utasítások. A cél olyan tesztesetek tervezése, amelyek addig futtatják a kódban lévő utasításokat, amíg el nem érnek egy elfogadható lefedettségi szintet. A lefedettséget a tesztesetek által felhasznált utasítások és a kódban lévő összes végrehajtható utasítás számának hányadosaként határozzuk meg, százalékban kifejezve.
A lefedettség számítása során egy egységnek számítanak az alábbiak:
- Szekvencia
- Szelekció
- Iteráció
Lefedettség: tesztek által érintett utasítások száma / összes utasítás
Elágazási tesztelés és elágazás lefedettség¶
Az elágazás a vezérlés átadása a vezérlésifolyam-gráf két csomópontja között, amely megmutatja, hogy a teszt tárgyában milyen lehetséges sorozatokban futnak le a forráskód utasításai. Minden vezérlésátadás lehet feltétel nélküli (pl. szekvenciális kód) vagy feltételes (pl. döntési kimenet).
Az elágazási tesztelésben a lefedettségi elemek az elágazások. A cél olyan tesztesetek tervezése, amelyek addig futtatják a kódban lévő elágazásokat, amíg el nem érnek egy elfogadható lefedettségi szintet. A lefedettséget a tesztesetek által felhasznált elágazások és az összes elágazás számának hányadosaként határozzuk meg, százalékban kifejezve.
A számítás során minden döntési pont mindkét ágát érintjük (if és else ágak). Ciklus esetén ez a cilusba belépést vagy a ciklus kihagyását jelenti.
Lefedettség: végrehajtott döntési eredmények / lehetséges döntési eredmények
Alaposabb, mint az utasítás lefedettség, mert 100% döntési lefedettség 100% utasítás lefedettséget is jelent, ugyanakkor 100% utasítás lefedettség nem eredményez 100% döntési lefedettséget.
A lefedettség számításának modellje¶
Control Flow Graph (CFG): olyan irányított gráf , ahol a csomópontok utasításoknak felelnek meg, az élek a vezérlés folyamatát jelzik. Az i
és j
csomópontok között akkor létezik él a gráfban, ha a j
csomópont közvetlenül i
után végrehajtódhat a program valamely végrehajtása során.
Példa:
Tekintsük az alábbi pszeudókódot!
A kódból az alábbi CFG készíthető:
A 4 és 23 csomópontok a program elejét és végét jelölik. Mivel nincs ciklus a programban, ez egy irányított körmentes gráf lesz.
A gyakorlatban nincs szükség minden csomópont ábrázolására, használhatjuk az un. alap blokkokat. Az alap blokkok olyan egymás után következő utasítások, amelyekre teljesül, hogy ha a blokkban lévő első utasítás végrehajtásra kerül, akkor a blokk utolsó utasítása is végrehajtódik és a blokkon belül minden utasítás csak a blokkon belül lévő más utasítástól kaphat vezérlést.
A fenti példa ábrázolása alap blokkokkal:
Az eredeti CFG-ben a 4 től 9-ig csak egyféleképpen mehet a folyam, ezért ezek 9összevonhatók egy alap blokkba. Ugyanígy látható, hogy a 12-13 és 22-23 csomópontok is összevonhatók.
1. feladat
Tekintsük az alábbi kódrészletet:
1 2 3 4 5 6 7 8 |
|
- Határozzuk meg a 100%-os utasítás és elágazás lefedettséghez szükséges tesztesetek számát!
- Adjunk meg egy minimális teszteset halmazt, ami ilyen lefedettségeket produkál!
Lehetséges megoldás
Készítsünk folyamatábrát!
Utasítás lefedettséghez egyetlen teszteset elegendő:
- (START) -> (1,2,3) -> (4) -> (5,6) -> (7) -> (8, END)
- Mindkét IF-nél az igaz ágba megy bele: P+Q > 100 és P > 50
- Erre példa lehet: P = 75, Q = 75
Elágazás lefedettséghez legalább kettő teszteset kell, pl:
- (START) -> (1,2,3) -> (4) -> (5,6) -> (7) -> (8, END)
- P+Q > 100 és P > 50
- P = 75, Q = 75
- (START) -> (1,2,3) -> (5,6) -> (8, END)
- Hamis ágakat érintjük: P+Q <= 100 és P <= 50
- Erre példa: P = 25, Q = 25
2. feladat
Tekintsük az alábbi programot:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
- Határozzuk meg a 100%-os utasítás és elágazás lefedettséghez szükséges tesztesetek számát!
- Adjunk meg egy minimális teszteset halmazt, ami ilyen lefedettségeket produkál!
Lehetséges megoldás
Készítsünk folyamatábrát!
Megjegyzés: START-tal jelöltük az 1,2 sorokat (azaz a szubrutinblokk kezdetét) és END-del a 19-es sort (a szubrutinblokk végét). A címkék sorai (LOOP: és EXIT:) nem szerepelnek a CFG-ben.
Az utasítás lefedettséghez egyetlen teszteset elegendő.
Az elágazás lefedettséghez öt teszteset szükséges:
- 3:false
- 3:true, 5:true
- 3:true, 5:false, 8:true
- 3:true, 5:false, 8:false, 10:true
- 3:true, 5:false, 8:false, 10:false
Ez az öt teszteset két teszteljárással megvalósítható.
3. feladat
Tekintsük az alábbi kódrészletet:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
- Határozzuk meg a 100%-os utasítás- és branch-lefedettséghez szükséges tesztesetek számát!
- Adjunk meg egy minimális teszteset halmazt, ami ilyen lefedettségeket produkál!
Lehetséges megoldás
Készítsünk folyamatábrát!
Figyeljünk a kód struktúrájára!
Mivel az első elágazás hamis ágában nem lehet *str==0
, ezért a 7-es sorban kezdődő elágazásban lévő utasítások nem elérhetők. Ugyancsak nem elérhető ugyanezen okból kifolyólag a 13-mas sorban kezdődő ciklus magja.
Fehérdoboz tesztelés a gyakorlatban¶
- Töltsd le az Eclipse projektet és csomagold ki
- Töltsd be Eclipse-be
File -> Open Projects from file system
File -> Import ... -> General -> Existing project into workspace
4. feladat
Mérj lefedettséget a Ship
projekten Eclipse környezetben (jUnit tesztek lefedettsége)!
- Jobb gomb a projekten ->
Coverage As -> JUnit Test
- Készíts teszteseteket, amelyek minél nagyobb lefedettséget biztosítanak a
ShipCollisionWarningSystem
osztályra!
- Töltsd le az alábbi C forrásokat és csomagold ki
- A
main.c
-ből fordított program paraméterezése:./prog INPUT FORMAT OUTPUT [ OP [ OP [ OP ... ] ] ]
- A
main.c
forrásban a 476-481 sorokban van a táblázat aFORMAT
lehetséges értékeivel. - A
main.c
forrásban a 446-468 sorokban lévő táblázat tartalmazza azOP
-okat.
Megjegyzés: A feladat megoldható Linuxon és a Windows 10 Linux alrendszerben is (bash terminál).
Házi feladat
Mérj függvény szintű lefedettséget a main.c
programra a gcc
program -finstrument-functions
kapcsolója segítségével!
make traced
: A futtatható program, ami azstderr
-re írja a meghívott/elhagyott függvények címeit.make addresslist
: Atraced
programból kiszedi az összes függvény címét. Érdemes szűrni az eredményt.
A feladat beadási határideje a következő órát megelőző nap 8.00 óra. A feladatot a Coospace felületen kell beadni. A formátuma egy szöveges állomány, amely tartalmazza a fent meghatározott csoportok szerinti eredményeket. A futtatás módját is kérjük jelölni a dokumentumban.
Házi feladat
Mérj lefedettséget a main.c
programra a gcov
segítségével!
make prog
: A futtatható program, ami gcov-os formátumban menti a lefedettséget.- futtastd a programot
./prog INPUT FORMAT OUTPUT [ OP [ OP [ OP ... ] ] ]
make main.c.gcov
: Az aktuális lefedettséggel annotált forráskód (és mellesleg összegző statisztikát is csinál).
Készíts teszteseteket a main.c
programhoz, hogy minél nagyobb utasítás-lefedettséget érj el!
A feladat beadási határideje a következő órát megelőző nap 8.00 óra. A feladatot a Coospace felületen kell beadni. A formátuma egy szöveges állomány, amely tartalmazza a definiált teszteseteket és a kapcsolódó lefedettség értékeket.