A lefedettségi metrikákat nemcsak a tesztkészlet kiértékelésére lehet használni, hanem arra is, hogy a forráskód alapján olyan teszteseteket származtassuk, amik magas lefedettséget érnek el. Az ilyen technikák hasznos kiegészítői lehetnek a fejlesztői és tesztelői eszköztárnak. Az előadás bemutatja a forráskód alapú tesztbemenet-generáló módszereket és egy konkrét .NET-es egységteszt-generáló megoldás, a Microsoft Pex eszközével kapcsolatos tapasztalatokat.
1. Budapesti Műszaki és Gazdaságtudományi Egyetem
Méréstechnika és Információs Rendszerek Tanszék
Egységtesztek automatikus
generálása forráskódból
Honfi Dávid, dr. Micskei Zoltán
BME MIT
Teszt & Tea 2014
2. Előadás fókusza
2
Modul A
Modul B
Modul C
Modul D
Egység (unit)
tesztelés
int fun1(int a, int b){
if (a == 0){
printf(ERROR_MSG);
return -1;
}
if (b > a){
return b*a + 5;
} else {
return (a+b) / 2;
}
}
Struktúra alapú
tesztelés
(kód ismert)
3. Tesztek tervezése forráskód alapján
3
int fun1(int a, int b){
if (a == 0){
printf(ERROR_MSG);
return -1;
}
if (b > a)
return b*a + 5;
else
return (a+b) / 2;
}
1
2
3
4
a b utasítás
0 * 1, 2
a!=0 b > a 3
a!=0 b < a 4
a == 0
a: 0
b: 0
T
b > a
F
a: 1
b: 2
T
a: 2
b: 1
F
4. Mi az ami kimaradt?
Ez még nem teszt, mert nincs elvárt kimenet
Mit lehet észrevenni:
o Alap, általános hibák (pl. nem várt kivétel)
o Kódban lévő assert() hívások megsértése
o Eltérés meglévő kimenettől
• Regressziós teszt: korábbi változatok (pl. Java 1.5 vs. 1.6)
• Más implementációk összehasonlítása (coreutils vs. busybux)
4
5. Tesztgenerálás automatizálása
Technika automatizálható
o '70-es évek óta módszerek
o Pl. szimbolikus végrehajtás
o DE: számítási igény, kihívások
Kezd alkalmazhatóvá válni
o Konkrét és szimbolikus végrehajtás vegyítése
o Fejlett kényszermegoldók (SMT solver)
o …
5
6. Eszközök
Név Platform Bemenet Megjegyzés
KLEE Linux C (LLVM bitcode) Nyílt forrású
PEX Windows .NET assembly VS Power Tool
SAGE Windows x86 bináris MS internal, security
Jalangi - JavaScript Nyílt forrású
Symbolic
PathFinder
- Java Nyílt forrású, NASA
6
További (jobbára nem fejlesztett) eszközök:
CATG, CREST, CUTE, Euclide, EXE, jCUTE, jFuzz, LCT, Palus, PET…
10. Esettanulmányok és tapasztalatok
Modellező eszköz (PDN2)
o Átlagosan 99%-os blokklefedettség
(IL kód)
o Kivételek, elérhetetlen
kód, funkcionális hibák
o Konklúzió: Komplex szoftverekben
is használható
CMS rendszer
o Post-mortem tesztelés
o Ismerni kell a kódot
• Elő- és utófeltételek
• Mockok
o Konklúzió: Iteratív jellegű
eszközhasználat
10
371
100
20
10
0 50 100 150 200 250 300 350 400
Valódi hibát felfedő Elküldve fejlesztőknek
Hibás teszteset Teszteset összesen
11. Pex for fun / Code Hunt
11
http://pexforfun.com
http://codehunt.com
12. Mennyire használhatók ezek a módszerek?
SF100 benchmark
o 100 projekt SourceForge-ról (Java nyelvűek)
o EvouSuite 48%-os elágazás lefedettséget ér el
• De nagy a szórás!
ABB cég kísérlete
o CREST és KLEE eszközök
o Kb. 60%-os elágazás lefedettséget érnek el
• De sok esettel nem boldogulnak!
G. Fraser and A. Arcuri, “Sound Empirical
Evidence in Software Testing,” ICSE 2013
X. Qu, B. Robinson: A Case Study of Concolic
Testing Tools and Their Limitations, 2011
13. Összefoglalás
Tesztbemenetek generálása kódból
o Ígéretes technikák
o (Prototípus) eszközök
Tapasztalatok
o Betanulást igényel a használatuk
o Sokszor elakadnak még, de találnak hibát
13