Bevezetés a Python teszteléséhez

Most fejezte be a kódrészlet írását, és azon gondolkodik, mit tegyen. Beküld egy húzási kérelmet, és csapattársai megvizsgálják a kódot, vagy manuálisan tesztelik a kódot? Mindezeket a dolgokat meg kell tennie, de egy további lépéssel: egységesen kell tesztelnie a kódot, hogy megbizonyosodjon arról, hogy a kód rendeltetésszerűen működik.

Az egységtesztek sikeresek vagy sikertelenek, és ez nagyszerű technikát jelent a kód ellenőrzésére. Ebben az oktatóanyagban bemutatom, hogyan lehet egység teszteket írni Python-ban, és mennyire könnyű elindítani őket a saját projektben.

Elkezdeni

A tesztelés legjobb módja, ha gyakorlati úton végzi. Ebből a célból a name_function.py nevű fájlba írok egy egyszerű függvényt, amely kereszt- és vezetéknevet vesz fel, és teljes nevet ad vissza:

A formatted_name () függvény felveszi az utónevet és a vezetéknevet, és egy szóközzel kombinálja őket a teljes név kialakításához. Ezután minden szó első betűjét nagybetűvel írja. A kód működésének ellenőrzéséhez be kell írnia néhány kódot, amely ezt a funkciót használja. A names.py-be írok néhány egyszerű kódot, amely lehetővé teszi a felhasználók számára az utó- és vezetéknevük megadását:

Ez a kód a formátumozott_nevet () importálja a name_function.py oldalról és futás közben, lehetővé teszi a felhasználó számára, hogy beírja az utó- és vezetéknevek sorozatát, és megjelenítse a formázott teljes neveket.

Egységteszt és tesztesetek

A Python szabványos könyvtárában van egy unittest nevű modul, amely a kód tesztelésére szolgáló eszközöket tartalmaz. Az egységteszt ellenőrzi, hogy a funkciója minden egyes része helyes-e, ami jelentősen megkönnyíti azok integrálását más részekkel.

A teszteset az egységtesztek gyűjteménye, amely együttesen bizonyítja, hogy egy funkció a rendeltetésszerűen működik, olyan helyzetek teljes skáláján belül, amelyekben ez a funkció megtalálható, és amelyet várhatóan kezelni fog. A tesztesetnek meg kell fontolnia minden lehetséges bemeneti fajtát, amelyet egy funkció a felhasználóktól kaphat, és ezért tartalmaznia kell teszteket e helyzetek mindegyikének bemutatására.

Sikeres teszt

Íme egy tipikus forgatókönyv a tesztek írásához:

Először létre kell hoznia egy tesztfájlt. Ezután importálja az unittest modult, határozza meg az unittest.TestCase által örökölt tesztosztályt, végül pedig írjon egy sor módszert a függvény viselkedésének összes esetének tesztelésére.

Soronként magyarázat található a következő kód alatt:

Először importálnia kell egy unittestet és a tesztelni kívánt függvényt, formatted_name (). Ezután létrehoz egy osztályt, például NamesTestCase, amely teszteket tartalmaz a formatted_name () függvényhez. Ez az osztály az unittest.TestCase osztályból örökli.

A NamesTestCase egyetlen metódust tartalmaz, amely a formatted_name () egyik részét teszteli. Ezt a metódust meghívhatja test_first_last_name ().

Ne feledje, hogy a „test_” kezdetű metódusok a teszt_név_funkció.py futtatásakor automatikusan futnak.

A test_first_last_name () tesztmódszeren belül meghívja a tesztelni kívánt függvényt, és visszatérési értéket tárol. Ebben a példában meghívjuk a formatted_name () nevet a „pete” és a „seeger” argumentummal, és az eredményt a kapott változóban tároljuk.

Az utolsó sorban az assert módszert fogjuk használni. Az érvényesítési módszer ellenőrzi, hogy a kapott eredmény megegyezik-e a várt eredménnyel. És ebben az esetben tudjuk, hogy a formatted_name () függvény a teljes nevet nagybetűs első betűkkel adja vissza, ezért a „Pete Seeger” eredményre számítunk. Ennek ellenőrzésére az unittest assertEqual () metódusát használják.

self.assertEqual(result, “Pete Seeger”)

Ez a sor alapvetően azt jelenti: Hasonlítsa össze a kapott változó értékét a „Pete Seeger” -vel, és ha egyenlőek, akkor rendben van, de ha nem tudatja velem.

A test_name_function.py futtatásakor várhatóan kap egy OK-t, ami azt jelenti, hogy a teszt sikeres volt.

Ran 1 test in 0.001s
OK

Sikertelen teszt

Megmutatom, hogy néz ki egy sikertelen teszt, és módosítok egy formatted_name () függvényt egy új középső argumentum hozzáadásával.

Szóval átírom a függvényt, hogy így nézzen ki:

A formatted_name () ezen verziója középnévvel rendelkező személyek számára működik, de amikor teszteljük, látni fogjuk, hogy a funkció megszakadt azoknál az embereknél, akiknek nincs középső neve.

Tehát a test_name_function.py futtatásakor megkapja a kimenetet, amely így néz ki:

ErrorTraceback (most recent call last):
File “test_name_function.py”, line 7, in test_first_last_name result = formatted_name(“pete”, “seeger”)
TypeError: formatted_name() missing 1 required positional argument: ‘middle_name’
Ran 1 test in 0.002s
FAILED (errors=1)

A kimenetben olyan információkat lát, amelyek mindent elárulnak, hogy tudd, hol sikertelen a teszt:

  • A kimenet első eleme a Hiba, amely azt mondja, hogy legalább egy tesztesemény hibát eredményezett.
  • Ezután látni fogja a fájlt és a hibamódszert.
  • Ezután látni fogja azt a sort, amelyben a hiba történt.
  • És ez milyen hiba, ebben az esetben hiányzik 1 argumentum a „középnév”.
  • Látja továbbá a futtatott tesztek számát, a tesztek befejezéséhez szükséges időt és egy szöveges üzenetet, amely a tesztek állapotát és a fellépő hibák számát jelöli.

Mi a teendő, ha a teszt nem sikerült

A sikeres teszt azt jelenti, hogy a függvény a tőle elvártaknak megfelelően viselkedik. A sikertelen teszt azt jelenti, hogy még több szórakozás áll előtted.

Láttam néhány programozót, akik a kód javítása helyett inkább a tesztet változtatják meg - de erre nem. Szánjon még egy kis időt a probléma megoldására, mivel ez segít jobban megérteni a kódot és hosszú távon időt takaríthat meg.

Ebben a példában a_név () formátumú függvényünknek először két paraméterre volt szüksége, és most, amikor újraírják, egy extra szükséges: egy középső név. Középnév hozzáadása a funkciónkhoz megtörte a kívánt viselkedést. Mivel az ötlet nem az, hogy módosítsuk a teszteket, a legjobb megoldás az, ha a középső nevet opcionálisá teszjük.

Miután ezt megtettük, az az ötlet, hogy a tesztek sikeresek legyenek, amikor az utó- és vezetéknevet használják, például „Pete Seeger”, valamint amikor az első, a vezeték- és a középső nevet használják, például a „Raymond Red Reddington”. Tehát módosítsuk még egyszer a formatted_name () kódját:

Most a függvénynek a középnévvel ellátott és anélküli nevek esetén is működnie kell.

És ellenőrizze, hogy továbbra is működik-e a „Pete Seeger”, futtassa újra a tesztet:

Ran 1 test in 0.001s
OK
És ezt akartam megmutatni nektek: Mindig jobb, ha más módon változtatunk a kódon, hogy megfeleljenek a teszteknek. Eljött az ideje, hogy új tesztet vegyen fel azokra a nevekre, amelyeknek középső neve van.

Új tesztek hozzáadása

Írjon egy új módszert a NamesTestCase osztályba, amely teszteli a középső neveket:

A teszt futtatása után mindkét tesztnek meg kell felelnie:

Ran 2 tests in 0.001s
OK
Bra gjort! Jól sikerült!

A teszteket azért írta le, hogy ellenőrizze, hogy a függvény középnévvel ellátott vagy anélküli nevek használatával működik-e. Maradjon velünk a 2. részben, ahol többet fogok beszélni a Python teszteléséről.

Ez és egyéb szórakoztató dolgok megtalálhatók a Github-on: //github.com/GoranAviani