Kihagyás

Unittest

A Python beépített unittest modulja lehetővé teszi a kódok tesztelését egy strukturált keretrendszer segítségével. Ezzel az eszközzel automatizálhatjuk a teszteket, biztosítva, hogy a kódunk helyesen működjön különböző bemenetekkel és esetekben. A unittest egy xUnit-stílusú tesztelési keretrendszer, amelyet hasonló rendszerek inspiráltak, mint a JUnit Java-ban.

A unittest által használt tesztelési megközelítés egységtesztelésnek (unit testing) nevezett kategóriába tartozik.

Az egységtesztelés célja az, hogy a kód legkisebb, elkülöníthető egységeit (általában függvényeket vagy metódusokat) teszteljük, és ellenőrizzük, hogy ezek az egységek önállóan helyesen működnek-e. Az egységtesztek nagyon részletesek és az alkalmazás különböző elemeinek helyes működését biztosítják.

A tesztelési kategóriák közé tartoznak még a következők is:

  • Integrációs tesztelés (Integration testing): Ez a tesztelési típus azt vizsgálja, hogy a különálló modulok, egységek hogyan működnek együtt, tehát az egyes részek összekapcsolására és a rendszer egységként való tesztelésére fókuszál.
  • Funkcionális tesztelés (Functional testing): Itt a tesztelés célja az, hogy a rendszer egy adott funkciója a specifikációknak megfelelően működik-e.
  • Rendszertesztelés (System testing): Ez a teljes rendszert együttesen teszteli annak érdekében, hogy a rendszer minden összetevője együtt megfelelően működjön.
  • Elfogadási tesztelés (Acceptance testing): A végső felhasználó vagy az ügyfél által végzett tesztelés, amely azt ellenőrzi, hogy a rendszer megfelel-e a megadott követelményeknek.
  • Regressziós tesztelés (Regression testing): A tesztelés célja annak biztosítása, hogy az új kód vagy módosítás ne vezessen be új hibákat a már létező funkciókba.

A unittest modul tehát kifejezetten az egységtesztelés eszköze, amely a kód kis, izolált részeinek megbízhatóságát segít ellenőrizni.

Alapok

A unittest modulban a tesztek szervezésének alapegysége a tesztosztály. Minden tesztosztály a unittest.TestCase osztályból származik, amely tartalmazza azokat a módszereket, amelyeket a tesztesetekben használhatunk az ellenőrzésekhez. A tesztesetek egyedi tesztfunkciókat képviselnek, amelyek mindig a test_ előtaggal kezdődnek, így a keretrendszer felismeri őket tesztként.

Tesztesetek írása

A tesztesetek azokat a kódrészeket tartalmazzák, amelyeket le szeretnénk tesztelni. Az assert metódusokat használhatjuk annak ellenőrzésére, hogy a várt eredmények megfelelnek-e a tényleges eredményeknek. Ha egy assert metódus sikertelen, a teszt elbukik.

Példa

Íme egy egyszerű példa arra, hogyan hozhatunk létre egy tesztosztályt és teszteseteket:

import unittest

# A tesztelendő függvény
def add(x, y):
    return x + y

class TestAddFunction(unittest.TestCase):

    def test_add_positive_numbers(self):
        self.assertEqual(add(1, 2), 3)

    def test_add_negative_numbers(self):
        self.assertEqual(add(-1, -2), -3)

    def test_add_zero(self):
        self.assertEqual(add(0, 0), 0)

if __name__ == '__main__':
    unittest.main()

Fontos metódusok

A unittest.TestCase osztály számos beépített assert metódust biztosít, amelyekkel különböző feltételeket ellenőrizhetünk:

  • assertEqual(a, b): Ellenőrzi, hogy a két érték egyenlő-e.
  • assertNotEqual(a, b): Ellenőrzi, hogy a két érték nem egyenlő-e.
  • assertTrue(x): Ellenőrzi, hogy a kifejezés igaz-e.
  • assertFalse(x): Ellenőrzi, hogy a kifejezés hamis-e.
  • assertIs(a, b): Ellenőrzi, hogy két objektum ugyanaz az objektum-e.
  • assertIsNone(x): Ellenőrzi, hogy az érték None-e.
  • assertIn(a, b): Ellenőrzi, hogy egy elem szerepel-e egy másikban (pl. lista, string).

Setup és Teardown

A unittest lehetőséget biztosít arra is, hogy minden teszt előtt és után bizonyos előkészítő vagy takarítási műveleteket hajtsunk végre. Erre a célra használhatjuk a következő metódusokat:

  • setUp(): Ezt a metódust minden teszt futása előtt automatikusan meghívja a keretrendszer. Itt állíthatjuk be a tesztelési környezetet.
  • tearDown(): Minden teszt futása után automatikusan lefut. Itt takaríthatjuk el azokat az erőforrásokat, amelyekre a tesztnek már nincs szüksége.

Példa Setup és Teardown használatára

class TestWithSetup(unittest.TestCase):

    def setUp(self):
        self.x = 10
        self.y = 20

    def tearDown(self):
        print("Tesztek lefutottak.")

    def test_add(self):
        self.assertEqual(self.x + self.y, 30)

    def test_subtract(self):
        self.assertEqual(self.y - self.x, 10)

if __name__ == '__main__':
    unittest.main()

Tesztek futtatása

A teszteket a parancssorból futtathatjuk az alábbi módon:

python -m unittest test_file.py

Ez a parancs futtatja a test_file.py fájlban található összes tesztet.

Ha a tesztek sikeresek, a kimenetben a zöld "OK" felirat jelenik meg, ha valami hibás, a piros "FAIL" jelzés mutatja a problémát.

Tesztösszesítők

A unittest modul fejlettebb funkciókat is kínál, például:

  • Tesztcsoportosítás és futtatás tesztösszesítők segítségével.
  • Tesztelési sorrend módosítása.
  • Hibakezelés és figyelmeztetések konfigurálása.