Kihagyás

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

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.

Döntés

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!

Pseudó példa

A kódból az alábbi CFG készíthető:

CFG

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:

Alap blokkok

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
1 Read P
2 Read Q
3 IF P+Q > 100 THEN
4    Print "Large"
5 ENDIF
6 IF P > 50 THEN
7    Print "P Large"
8 ENDIF
  • 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!

CFG1

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
1 SUBROUTINE Bubble (A)
2 BEGIN
3    FOR I = 2 TO LEN(A) DO
4    BEGIN
5        IF A[I] >= A[I-1] THEN
6            GOTO EXIT
7        J = I
LOOP:
8        IF J <= 1 THEN
9           GOTO EXIT
10       IF A[J] >= A[J-1] THEN
11           GOTO EXIT
12       TEMP = A[J]
13       A[J] = A[J-1]
14       A[J-1] = TEMP
15       J = J-1
16       GOTO LOOP
EXIT:
17       NOOP
18    END
19 END
Megjegyzés: A fenti FORTRAN kódban a címkéket nem sorszámoztuk!

  • 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!

CFG2

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
1 void replace(char *str, int n) {
2    while (1) {
3        if (*str == 0) {
4            break;
5        } else {
6            i = 0;
7            if (*str == 0) {
8                while (i < n && *str != 0) {
9                    ++str;
10                   ++i;
11               }
12           }
13           while (i < n && *str == 0) {
14               switch (*str) {
15                 case '\n':
16                   *str = '/';
17                   break;
18                 case '\t':
19                   *str = ' ';
20                   break;
21                 case '\a':
22                   *str = '*';
23                   break;
24               }
25               ++str;
26               ++i;
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!

CFG3

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

  1. Töltsd le az Eclipse projektet és csomagold ki
  2. Töltsd be Eclipse-be
  3. File -> Open Projects from file system
  4. 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!
  1. Töltsd le az alábbi C forrásokat és csomagold ki
  2. A main.c-ből fordított program paraméterezése: ./prog INPUT FORMAT OUTPUT [ OP [ OP [ OP ... ] ] ]
  3. A main.c forrásban a 476-481 sorokban van a táblázat a FORMAT lehetséges értékeivel.
  4. A main.c forrásban a 446-468 sorokban lévő táblázat tartalmazza az OP-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 az stderr-re írja a meghívott/elhagyott függvények címeit.
  • make addresslist: A traced 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.


Utolsó frissítés: 2024-09-01 15:37:43