Integrációs és ellenőrzési technikák (VIMIA04) Teszttervezés Majzik István, Micskei Zoltán Méréstechnika és Információs Rendszerek Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék 1
Áttekintés 2
Miért fontos a teszttervezés? More than the act of testing, the act of designing tests is one of the best bug preventers known. Boris Beizer 3
Tesztelési alapfogalmak (ismétlés) Specification, requirements Test cases Test execution Verdicts SUT: system under test Teszteset (test case) o bemeneti értékek, végrehajtási feltételek és elvárt eredmények halmaza, amelyeket egy konkrét célért fejlesztettek Tesztkészlet (test suite) Teszt-orákulum (test oracle) o Olyan elv vagy módszer, ami segít eldönteni a tesztelőnek, hogy sikeres volt-e a teszt Eredmény (verdict): pass / fail /error / inconclusive 4
Megoldandó feladatok Tesztkiválasztás (test selection) o Milyen bemeneti értékeket és adatok használjunk? Orákulum problémája o Honnan lesz megbízható orákulum? Kilépési feltétel (exit criteria) o Meddig folytassuk a tesztelést? 5
Teszttervezési technikák Cél: tesztesetek kiválasztása tesztcél alapján Specifikáció alapú SUT: black box Csak a specifikáció ismert Előirt funkcionalitás vizsgálata Struktúra alapú SUT: white box Belső felépítés ismert Felépítés és működés alapján bejárás 6
Lefedettségi metrikák Tesztelhető elemek mekkora %-a volt tesztelve Tesztelhető elemek o Specifikáció: követelmény, funkció o Struktúra: utasítás, döntés Lefedettségi feltétel (coverage criterion) o X % az Y metrikánál Ez nem hibafedés! 7
Mire jók a lefedettségi metrikák? Kiértékelés (mérés) Kiválasztás (cél) Meglévő tesztek kiértékelése Hiányzó tesztek azonosítása Teszt tervezése metrika mentén Cél adott % elérése 8
SPECIFIKÁCIÓ ALAPÚ TESZTELÉS 9
Teszttervezési technikák Cél: tesztesetek kiválasztása tesztcél alapján Specifikáció alapú SUT: black box Csak a specifikáció ismert Előirt funkcionalitás vizsgálata Struktúra alapú SUT: white box Belső felépítés ismert Felépítés és működés alapján bejárás 10
Specifikáció alapú technikák Ekvivalencia partícionálás Határértékanalízis Use case / user story Kombinatorikus módszerek Döntési táblák 11
Ekvivalencia partícionálás Bemenet és kimenet ekvivalencia osztályai: o Olyan adatok, amelyek várhatóan ugyanazt a hibát fedik le (ugyanazt a programrészt járják be) o Cél: Egy-egy ekvivalencia osztályból egy-egy teszt adat kiválasztása (többire elvileg hasonló) Nagyon környezetfüggő (context-dependent) o Ismerni kell a környezetet és a SUT-ot! o Tesztelő tudásán múlik a módszer hatékonysága 12
Ekvivalencia osztályok meghatározása Meghatározás heurisztikus folyamat: o Kezdés: érvényes és érvénytelen bemeneti adatok o Partíciók tovább finomítása Tipikus heurisztikák: o Tartomány (pl. 1-1000) < min, min-max, >max o Halmaz (pl. RED, GREEN, BLUE) érvényes elem, érvénytelen o Specifikus (pl. @ az elején) feltétel teljesül, feltétel nem teljesül o Egyéni (pl. február hónap) 13
Tesztesetek származtatása ekv. osztályból Több bemenet ekv. osztályainak összekapcsolása Érvényes (normál) ekv. osztályok esetén: o egy teszt minél több osztályt fedjen le Érvénytelen ekv. osztályok esetén: o először minden érvénytelen osztályhoz külön teszt legyen o egymás hatását ne oltsák ki o majd több osztály kombinációja is 14
FELADAT Ekvivalencia partícionálás Leírás: Online italboltunkban kedvezményrendszert vezetünk be. A 30 évesnél idősebb vásárlók 3%, az 50 évnél idősebbek 5% kedvezményt kapnak. A kiválasztott ital kosárba rakása után meg kell adni a megvásárolni kívánt mennyiséget, majd a születési dátumukat, és a kedvezmény levonásra kerül az árból. Bemeneti paraméterek? Ekvivalencia osztályok? Van kérdésünk a leírással kapcsolatban? 15
Specifikáció alapú technikák Ekvivalencia partícionálás Határértékanalízis Use case / user story Kombinatorikus módszerek Döntési táblák 17
Határérték-analízis Adattartományok határait vizsgálja o Egy-egy ekvivalencia osztály határaira koncentrál o Bemeneti és kimeneti tartományokra is Tipikus megtalált hibák: o relációs operátorok o ciklusok be- és kilépési feltételei o adatstruktúrák mérete o 18
Tipikus teszt adatok határértékeknél Egy határérték 3 tesztet jelent: határérték Egy tartomány 5-7 tesztet jelent: határérték 1 határérték 2 19
FELADAT Határérték-analízis Leírás: Online italboltunkban kedvezményrendszert vezetünk be. A 30 évesnél idősebb vásárlók 3%, az 50 évnél idősebbek 5% kedvezményt kapnak. A kiválasztott ital kosárba rakása után meg kell adni a megvásárolni kívánt mennyiséget, majd a születési dátumukat, és a kedvezmény levonásra kerül az árból. Határértékek? Milyen értékeket használjunk a tesztekben? 20
Specifikáció alapú technikák Ekvivalencia partícionálás Határértékanalízis Use case / user story Kombinatorikus módszerek Döntési táblák 22
Tesztek származtatása használati esetekből Tipikus tesztesetek: o 1 teszt: fő ág ( happy path, mainstream ) Ellenőrzés: utófeltételek vizsgálata o Alternatív lefutások: mindegyikhez külön teszteset o Előfeltételek (nem)teljesülése Jobbára magasabb szintek (rendszer, elfogadási ) 23
FELADAT Használati esetek (use case) 24
STRUKTÚRA ALAPÚ TESZTELÉS 25
Teszttervezési technikák Cél: tesztesetek kiválasztása tesztcél alapján Specifikáció alapú SUT: black box Csak a specifikáció ismert Előirt funkcionalitás vizsgálata Struktúra alapú SUT: white box Belső felépítés ismert Felépítés és működés alapján bejárás 26
Mi a belső felépítés? Kód esetén: forráskód struktúrája Forráskód: int a = read(); while(a < 16) { if(a < 10) { a += 2; } else { a++; } } a = a * 2; Control-flow graph (CFG): control flow Megjegyzés: CFG pontos definíciójával most nem foglalkozunk! 27
Alapfogalmak int t = 1; Speed s = SLOW; Utasítás Blokk if (! started){ } start(); if (t > 10 && s == FAST){ brake(); } else { accelerate(); } 28 Feltétel Döntés Döntési ág
Utasítás (statement) Blokk (block) Alapfogalmak o Utasítások egybefüggő sorozata, amik között nincs elágazás vagy függvényhívás Feltétel (condition) o Egyszerű vizsgálat, amiben nincs logikai (Boole) operátor Döntés (decision) o Nulla vagy több logikai operátorral összekötött feltételből álló kifejezés Döntési ág (branch) o Egy döntés lehetséges kimenetele Út (path) o Utasítások sorozata, tipikusan a modul be és kilépési pontja között 29
1. Utasítás lefedettség Tesztelés során végrehajtott utasítások száma Összes utasítás szám A1 A2 A4 A3 A5 Utasítás lefedettség: 4/5 = 80% 30
Utasítás lefedettség értékelése Minden utasítást legalább egyszer végrehajtunk k=0 [a>0] k=1 [a<=0] m=1/k Utasítás lefedettség: 100% DE: hiányzik a [a<=0] ág Üres ágak lefedését nem garantálja 31
2. Döntési lefedettség Tesztelés során előfordult döntési eredmények száma Döntési eredmények lehetséges száma A2 Döntési lefedettség: 50% A4 A3 Hány eredménye lehet egy döntésnek? 32
Döntési lefedettség értékelése Minden utasítást legalább egyszer végrehajtunk Minden ágat lefedünk (üres ágakat is) # safe(c) safe(b) [safe(c) safe(b)] A2 [else] 1 T F 2 F F A4 A3 100% döntési lefedettség DE: safe(b) = true eset hiányzik! Feltételek kombinációjára nem figyel 33
További lefedettségi metrikák (lásd MSc) Condition Coverage Condition/Decision Coverage (C/DC) Modified Condition/Decision Coverage (MC/DC) Multiple Condition Coverage (MCC) Loop Coverage All-Defs Coverage All-Uses Coverage 34
FELADAT Struktúra alapú tesztelés 1 int pow(int n, int k) { 2 if (n < 0 k < 0) { 3 return -1; 4 } 5 int p = 1; 6 for (int i = 0; i < k; i++) { 7 p *= n; 8 } 9 return p; } Rajzold fel a kód CFG-jét! Tervezz teszteket: 100% utasítás lefedettség 100% döntési lefedettség 35
Kód lefedettség számolása a gyakorlatban Mindegyik eszköznél más definíciók Megvalósítás o Forrás/bináris kód instrumentálása o Lefedettséget számoló utasítások hozzáadása if (a > 10){ CoveredBranch(1, true); b = 3; } else { CoveredBranch(1, false); b = 5; } send(b); Lásd például: Is bytecode instrumentation as good as source code instrumentation, 2013. 37
Kód lefedettség használata Mire használható: o Egyáltalán nem tesztelt kódrészlet azonosítása o Tesztkészlet teljességének értékelése o Kilépési feltételekben Mire nem használható: o Hiányzó/hiányos követelmények azonosítása o Kód/teszt minőségével csak indirekt kapcsolat 38
Kód lefedettség használata a gyakorlatban Microsoft tapasztalata: o Test suite with high code coverage and high assertion density is a good indicator for code quality. o Code coverage alone is generally not enough to ensure a good quality of unit tests and should be used with care. o The lack of code coverage to the contrary clearly indicates a risk, as many behaviors are untested. (Forrás: Parameterized Unit Testing with Microsoft Pex ) Kapcsolódó cikkek: o Coverage Is Not Strongly Correlated with Test Suite Effectiveness, 2014. DOI: 10.1145/2568225.2568271 o The Risks of Coverage-Directed Test Case Generation, 2015. DOI: 10.1109/TSE.2015.2421011 39
Teszttervezési technikák összefoglalása Specifikáció és struktúra alapú technikák o Több, egymást kiegészítő módszer o Mindegyik módszert gyakorolni kell Technikák kombinációja hasznos Példa (Microsoft): specifikáció alapú: 83% kód lefedettség + felderítő tesztelés: 86% kód lefedettség + struktúra alapú: 91% kód lefedettség 40 40
Összefoglalás 41