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 választja a kódon keresztüli útvonalak vizsgálatához, és meghatározza a várható kimeneteket.

Kód lefedettségek

  • Utasítás lefedettség: 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

  • Döntési lefedettség: minden döntési pont mindkét ágát érintjük (if és else ágak). Ciklus esetén ez a cilusba belépés vagy a ciklus kihagyása.

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.

  • Egyéb
    • Feltétel lefedettség
    • Többszörös feltétel lefedettség
    • Útvonal lefedettség

Elméletben

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
Read P
Read Q
IF P+Q > 100 THEN
    Print "Large"
ENDIF
IF P > 50 THEN
    Print "P Large"
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
SUBROUTINE Bubble (A)
BEGIN
    FOR I = 2 TO LEN(A) DO
    BEGIN
        IF A[I] >= A[I-1] THEN
            GOTO EXIT
        J = I
LOOP:
        IF J <= 1 THEN
            GOTO EXIT
        IF A[J] >= A[J-1] THEN
            GOTO EXIT
        TEMP = A[J]
        A[J] = A[J-1]
        A[J-1] = TEMP
        J = J-1
        GOTO LOOP
EXIT:
        NOOP
   END
END
  • 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 21-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 5 teszteset szükséges:

  • 3:false
  • 3:true, 5:true
  • 3:true, 5:false, 9:true
  • 3:true, 5:false, 9:false, 11:true
  • 3:true, 5:false, 9:false, 11:false

Ez az 5 teszteset 2 teszt eljá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
void replace(char *str, int n) {
    while (1) {
        if (*str == 0) {
            break;
        } else {
            i = 0;
            if (*str == 0) {
                while (i < n && *str != 0) {
                    ++str;
                    ++i;
                }
            }
            while (i < n && *str == 0) {
                switch (*str) {
                  case '\n':
                    *str = '/';
                    break;
                  case '\t':
                    *str = ' ';
                    break;
                  case '\a':
                    *str = '*';
                    break;
                }
                ++str;
                ++i;
            }
        }
    }
}
  • 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

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. ggi

Gyakorlatban

  1. Töltsd le az Eclipse projektet és csomagold ki
  2. 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!

  1. Töltsd le a 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 ... ] ] ]
    • A main.c forrásban a 476-481 sorokban van a táblázat a FORMAT lehetséges értékeivel.
    • 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: 2023-11-13 09:26:11