Egységtesztelés alapjai¶
Szerkesztés alatt!
Az oldal további része szerkesztés alatt áll, a tartalma minden további értesítés nélkül többször, gyakran, jelentősen megváltozhat!
Tesztelni sokféleképpen és több szinten lehet. Tesztelési szintek például az egység, egység-integrációs, és rendszerteszt szintek. Ezekből az "alap" az egységteszt. Ez a program (általában a megvalósításhoz köthető) kisebb egységeit (függvény, osztály, modul) egymástól függetlenül, önállóan teszteli. Ha már a program valamelyik önálló kis egysége önmagában hibás, akkor mit várunk az ilyen egységek együttműködésétől (integrációs teszt) vagy a teljes rendszertől (rendszerteszt)?
No de hogyan lehet a program egységeit, itt most tipikusan az egyes függvényeit önmagukban tesztelni?
Ehhez egy olyan tesztprogram kell, ami sorban meghívja ezeket, és ellenőrzi a visszaadott eredményeket.
Az ilyen tesztek implementációja egyrészt ugyanazon a programozási nyelven történik, mint amiben az adott egység meg van írva, másrészt valamilyen keretrendszert szokás hozzájuk használni.
Python nyelvre egy ilyen keretrendszer a pytest.
(Használatához telepíteni kell a pytest
csomagot.)
A pytest telepítése linux alatt sudo/root jogokkal mindenki számára
Ha van sudo
jogod egy linuxos gépen (tudsz root jogokkal futtatni programokat), akkor a pytest-et tudod úgy telepíteni, hogy az minden felhasználó számára elérhető legyen:
1 |
|
1 |
|
A pytest telepítése sudo/root jog nélkül
Ha nincs megfelelő jogod, akkor a
1 |
|
Példa¶
Adott egy képmanipuláló lib és program(család), ahol is most a libpnm
-hez adunk egységteszteket.
A pytest keretrendszer szerencsére segít bennünket.
A pytest alapvetően név alapján ismeri fel a teszteket.
A test_
prefixszel rendelkező függvényeket tekinti teszteknek, és ezeket fogja futtatni.
Amelyik teszt AssertionError
-t dob, az bukott, amelyik nem, az átment.
Az egységtesztek megvalósítása
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
|
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 31 32 33 34 35 36 37 |
|
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |
|
A test_type.py tartalmazza a pnm_type
modul, a test_manipulation.py pedig a pnm_manipulation
modul tesztjeit.
A test_manipulation.py pedig egyrészt a tesztkörnyezet beállításait, illetve a tesztekben használt segédfüggvényeket, konstansokat, fixture-öket, stb.
Futtatás¶
A tesztek futtatása a
1 |
|
pytest
ilyenkor megkeresi a test_
kezdetű python fájlokat, majd ezekből lefuttatja a test_
kezdetű függvényeket.
Tippek¶
Egy assert per teszt
Szokás azt mondani, hogy egy teszteset egyetlen assert
-et tartalmazzon, de ez néha nagyon elaprózhatja a teszteket.
A lényeg, hogy egy teszteset logikailag egy dolgot teszteljen.
Ahhoz például, hogy vajon két kép teljesen egyforma-e nyilván több ellenőrzés szükséges.
Ezeket vagy külön-külön ellenőriztetjük egy-egy assert
segítségével, vagy mi magunk összegezzük, és a végén mondunk egy pass-t vagy FAIL-t.
Több teszt per unit
Egy függvényhez több tesztfüggvényt is lehet írni, ami ilyen-olyan adatokkal próbálja ki. Lehet például a határérték analízis alapján egy függvényhez több külön tesztesetet rendelni, hogy lássuk, melyik határértéknél van a hiba.
Tesztesetek nevei
Unit tesztek esetén a tesztek (tesztfüggvények) neveit a következőképpen szokás összerakni. Először a "test" szó, utána a tesztelendő egység (függvény) neve, majd -- ha több tesztünk is van az egységhez -- a teszt funkciója.
Feladat¶
Adott egy kódoló függvényeket megvalósító python csomag.
A kódoló csomag forrásai
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 31 32 33 34 35 36 37 38 39 40 41 |
|
A függvények feladatai:
create_coder_from_encoding_key(key_)
éscreate_coder_from_decoding_key(key_)
:
Létrehoznak egy-egy kódoló-dekódóló kulcspárt. Egyszerű helyettesítő kódolásról van szó. A kódoló bemenete 26 kisbetű, az i. indexű azt mutatja meg, hogy az ábécé i+1. betűje mire változik ("ces
..." esetén például 'a
'→'c
', 'b
'→'e
', 'c
'→'s
', ... lesz) a kódolás során. A dekódolókulcs hasonlóan mutatja, de csupa nagybetűkkel, hogy miből lesz az adott betű ("CES
..." esetén pl. 'c
'→'a
', 'e
'→'b
', 's
'→'c
' kódolást ír elő). A visszaadott dict-ben a két listában nem betűk, hanem számok vannak ('a
' és 'A
' esetén 0, 'b
' és 'B
' esetén 1, ..., 'z
' és 'Z
' esetén 25). Ha a kulcs nem egyértelmű kódolást vagy dekódolást ír elő, akkor a függvény ValueError-t dob.encode(coder, char)
ésdecode(coder, char)
:
Egy darab karakter kódolása vagy dekódolása acoder
alapján. Csak a betűket kell transzformálni, minden más karakter érintetlen marad.codekey_, char)
:
Egy darab karakter szimpla transzformációja a megadott kulcs alapján.get_encoding_key(coder)
ésget_decoding_key(coder)
:
A függvények visszaadják a coder paraméterben megadott kódolás kódoló illetve dekódoló kulcsot, olvasható formában (olyan formában, ahogy a kétcreate_coder_from_*
függvény várja ezeket).
A feladat
Írjunk ehhez a csomaghoz teszteket (minden függvényhez legalább egyet)!
A kódoló csomag tesztje (kezdemény)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
A csomag egyben itt tölthető le. Aki szeretné, kijavíthatja a tesztek által megtalált hibákat.