Bevezetés az egység tesztelésébe a Pythonban

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 átnézik a kódot? Vagy manuálisan teszteli a kódot?

Mindkét dolgot 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 kell egység teszteket írni Pythonban, és meglátja, 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:

#Generate a formatted full name def formatted_name(first_name, last_name): full_name = first_name + ' ' + last_name return full_name.title()

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:

from name_function import formatted_name print("Please enter the first and last names or enter x to E[x]it.") while True: first_name = input("Please enter the first name: ") if first_name == "x": print("Good bye.") break last_name = input("Please enter the last name: ") if last_name == "x": print("Good bye.") break result = formatted_name(first_name, last_name) print("Formatted name is: " + result + ".")

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 megmutassa 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:

import unittest from name_function import formatted_name class NamesTestCase(unittest.TestCase): def test_first_last_name(self): result = formatted_name("pete", "seeger") self.assertEqual(result, "Pete Seeger")

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 meg fogjuk hívni 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 a következőket 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:

#Generate a formatted full name including a middle name def formatted_name(first_name, last_name, middle_name): full_name = first_name + ' ' + middle_name + ' ' + last_name return full_name.title()

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:

Error Traceback (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 mutatja.

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.

In this example, our function formatted_name() first required two  parameters, and now as it is rewritten it requires one extra: a middle name. Adding a middle name to our function broke the desired behavior of  it. Since the idea is not to make changes to the tests, the best solution is to make middle name optional.

After we do this the idea is to make the tests pass when the first and last name are used, for example “Pete Seeger”, as well as when first, last and middle names are used, for example “Raymond Red Reddington”. So  let’s modify the code of formatted_name() once again:

#Generate a formatted full name including a middle name def formatted_name(first_name, last_name,): if len(middle_name) > 0: full_name = first_name + ' ' + middle_name + ' ' + last_name else: full_name = first_name + ' ' + last_name return full_name.title()

Now the function should work for names with and without the middle name.

And to make sure it still works with “Pete Seeger” run the test again:

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:

import unittest from name_function import formatted_name class NamesTestCase(unittest.TestCase): def test_first_last_name(self): result = formatted_name("pete", "seeger") self.assertEqual(result, "Pete Seeger") def test_first_last_middle_name(self): result = formatted_name("raymond", "reddington", "red") self.assertEqual(result, "Raymond Red Reddington")

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

Ran 2 tests in 0.001s OK
Bra gjort!

Szép munka!

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.

Köszönöm, hogy elolvasta! Nézzen meg további hasonló cikkeket a freeCodeCamp profilomon: //www.freecodecamp.org/news/author/goran/ és egyéb szórakoztató dolgokat, amelyeket a GitHub oldalamon építek: //github.com/GoranAviani