Bevezetés a Python Unit Test használatához

A szoftver minőségbiztosítás (QA: Quality Assurance) fontos részei az egységtesztek (Unit test). Ezek teszik lehetővé, hogy az egymástól független komponensek helyes működését le tudjuk tesztelni.
Pythonban egységteszteket legegyszerűbben a beépített unittest modul felhasználásával lehet írni.

Amiért fontos, hogy egységteszteket írjunk

  1. Helyes működés biztosítása: Az egységtesztek segítenek ellenőrizni az adott komponens helyes működését, ezáltal csökkentve az esélyt a futásidejű hibák keletkezésében.
  2. A kódminőség javítása: Az egységtesztek írása rákényszerít bennünket, hogy átgondoljuk a megírt kódokat, így erősítve a jobb tervezést és a karbantarthatóbb implementációt.
  3. A komponensek elromlásának kiszűrése: Az átalakítások során segítenek az egységtesztek abban is, hogy kiszűrjük a régebben jól működő, de egy átalakítás miatt elromlott komponenst. Így biztosíthatjuk a szoftverünk stabilitását.
  4. A hibakeresési idő csökkentése: Amikor egy hiba előfordul, akkor az egységtesztekkel sokszor könnyebben felderíthetjük, hogy mi a valós ok, így lerövidül a javítási idő.

Az alapegységek

  1. Tesztesetek (Test cases): A teszteset egy kicsi, egységnyi része az egységtesztnek, ami egy apró részegységre fókuszál a tesztelés során.
  2. Teszcsomagok (Test suites): Az egymással logikai kapcsolatban álló teszteseteket tesztcsomagokba szervezzük.
  3. Állítások (Assertions): Az állítások segítségével ellenőrizhetjük, hogy az éppen tesztelt kódrészlet helyes eredményt adott-e vissza. (pl. assertTrue, assertFalse)

Egységtesztek írása Pythonban a beépített unittest modul segítségével

  1. Importáljuk a unittest modult.
  2. Hozzunk létre egy teszt osztályt ami a unittest.TestCase ősosztályból származik.
  3. Definiáljunk metódusokat a teszt osztályunkban, amelyek neveit rendre a test_ prefix segítségével jelöljünk meg.
  4. Használjuk a assert utasításokat a kódunk ellenőrzésére.

Példa

import unittest # program blokk (egység), aminek a minőségét tesztesetekkel szeretnénk biztosítani def add_numbers(x, y): return x + y # Tesztcsomag class TestAddFunction(unittest.TestCase): # Teszteset # Pozitív, tehát azt várjuk és állítjuk (assert) az eset végén hogy a visszaadott érték a feltételezésnek megfelel # 2 + 3 = 5? def test_add_numbers_positive(self): self.assertEqual(add_numbers(2, 3), 5) # pozitív teszteset -> tudjuk, hogy 2 + 3 = 5! # Teszteset # Negatív, tehát azt várjuk és állítjuk (assert) az eset végén hogy a visszaadott érték a feltételezésnek nem felel meg # -2 + 3 = 15? def test_add_numbers_negative(self): self.assertNotEqual(add_numbers(-2, 3), 15) # negatív teszteset -> -2+3 != 15

Legjobb gyakorlatok, bevett szokások

  1. Tartsuk a teszteseteinket egyszerű és lényegretörő formában: Minden teszteset csak egy egyszerű részt teszteljen!
  2. Használjunk beszédes neveket: Használjunk egyértelmű és beszédes neveket a tesztosztályainkhoz és metódusaihoz!
  3. Használjunk assert-eket: Használjunk assert-eket az elvárt viselkedés ellenőrzésére a kódunkban!
  4. Teszteljük a várható hibákat: Teszteljük, hogy a kódunk helyesen kezeli-e a várható hibákat és kivételeket!