A tesztcsomag beállítása a kódhoz olyan akadálynak tűnhet, amelyre még nem áll készen, de ez a könyvtár sok megterhelést igényel.

A tesztelés a szoftverfejlesztés elengedhetetlen része. Segít a hibák korai észlelésében, és csökkenti a hibák valószínűségét.

A Pytest a Python egyik legnépszerűbb tesztelési keretrendszere. Lehetővé teszi kisméretű és olvasható tesztek írását, amelyek az alkalmazás növekedésével skálázhatók. Ismerje meg, hogyan állíthatja be és használhatja a Pytestet a Python-kóddal.

A Pytest beállítása

A Pytest telepítése előtt érdemes hozzon létre egy virtuális környezetet hogy elszigetelje a tesztkörnyezetet, így elkerülheti az ütközéseket más csomagokkal és függőségekkel.

Virtuális környezet létrehozásához futtassa a következő parancsot a Pytest telepítése előtt.

python -m venv tesztek

Ezzel létrehoz egy új virtuális környezetet tesztek néven az aktuális könyvtárban. A környezet aktiválásához futtassa ezt a parancsot, ha Linux vagy Mac rendszert használ:

forrás tesztek/bin/aktiválás

Windows esetén futtassa ezt a parancsot:

tesztek\\Szkriptek\\aktiválás

A Pytest telepítéséhez használhatja a pip-et, a Python csomagkezelőt ezzel a paranccsal a terminálban:

pip install pytest

Ha nincs Pip, ne aggódjon; tudsz telepítse a Pip-et Windows, Mac és Linux rendszereken.

Futtassa a következő parancsot, hogy ellenőrizze, megfelelően telepítette-e a Pytestet.

pytest --version

Ennek vissza kell adnia a telepített verziószámot.

Az első teszt elkészítése

Tekintsük a következő függvényt, amely összead két számot, és visszaadja az eredményt.

defadd_numbers(a, b):
Visszatérés a + b

Számos dolog elromolhat ezzel a funkcióval. Fontolja meg például, mi történik, ha a függvényt nem numerikus értékekkel, például None vagy string típusú értékkel hívja meg. Ez néhány lehetséges éleset, amelyek a funkció meghibásodását okozhatják.

Az egyik első tesztnek ellenőriznie kell, hogy a függvény a várt eredményt adja-e vissza. Ehhez az assert kulcsszóval összehasonlíthatja a függvény tényleges kimenetét a várt kimenettel. Az add_numbers függvény esetében a tesztfüggvény így nézhet ki:

defteszt_számok hozzáadása():
állítja add_numbers(2, 3) == 5
állítja add_numbers(-1, 1) == 0
állítja add_numbers(0, 0) == 0

Ez a tesztfüggvény három assert utasítást tartalmaz, amelyek mindegyike összehasonlítja az add_numbers függvény kimenetét egy várt értékkel. Az első teszt azt ellenőrzi, hogy 2 és 3 összeadása 5-öt, a második teszt azt ellenőrzi, hogy -1 és 1 összeadása 0-t, a harmadik pedig azt, hogy 0 és 0 összeadása 0-t ad-e vissza.

Tesztek futtatása Pytest segítségével

Miután megírta a teszteket, a következő lépés a tesztek futtatása. Ehhez a Pytest segítségével keresse meg a tesztfájlt tartalmazó könyvtárat, és futtassa a pytest parancsot:

pytest

Ha minden a várt módon működik, megjelenik egy üzenet, amely jelzi, hogy az összes teszt sikeresen lezajlott. Ha azonban bármelyik állítás meghiúsul, a Pytest hibát jelez, és megmutatja a hibát okozó bemeneti értékeket.

Tegyük fel például, hogy a következő tesztfüggvényt futtatta az add_numbers függvényhez:

defteszt_számok hozzáadása():
állítja add_numbers(2, 3) == 6
állítja add_numbers(-1, 1) == 0
állítja add_numbers(0, 0) == 0

Az első állítás meghiúsul, mert a várt érték 6 volt, de a tényleges érték 5 (2 és 3 összege). A Pytest a következő üzenetet adja vissza:

Ez az üzenet megmutatja azokat a bemeneti értékeket, amelyek az értéket okozták, és azt is, hogy mi legyen a tényleges érték. Ez megkönnyíti a kódban lévő hibák gyors azonosítását és kijavítását.

Pytest.raises használata kivételek érvényesítésére

Most írjunk egy tesztet az add_numbers függvény egyik szélső esetének lefedésére. Ha nem numerikus argumentumot ad át a függvénynek, például a None-t, a Pythonnak TypeError kivételt kell előidéznie.

Már annak kellene lenned kivételek kezelése a Python-programokban, és tesztelheti, hogy a kód megfelelően emeli-e meg őket.

Ehhez másolja a következő tesztfüggvényt a fájlba. A pytest.raises környezetkezelőt használja annak ellenőrzésére, hogy az add_number függvény „Nincs” paraméterrel történő hívása TypeError kivételt okoz-e.

import pytest

defteszt_számok_hozzáadása_érvénytelen_bemenetekkel():
val vel pytest.raises (TypeError):
add_numbers(Egyik sem, 2)

Ezután futtassa a Pytestet a parancssorból. Ha a kivételt nem emelik ki, a teszt sikertelen lesz.

Továbbléphet, és ellenőrizheti a kivételüzenet részleteit. A környezetkezelő létrehoz egy ExceptionInfo objektumot a részletekkel.

Például ebben a tesztfüggvényben érvényesítse a kivételüzenetet a következőképpen:

defteszt_számok_hozzáadása_érvénytelen_bemenetekkel():
val vel pytest.raises(TypeError) mint exc_info:
add_numbers(Egyik sem, 2)

állítja exc_info.value.args[0] == "nem támogatott operandustípus(ok) +: 'NoneType' és 'int'"

Ha az üzenet nem egyezik a tesztben szereplővel, a Pytest hibát jelez.

A paraméterezett tesztelés használata több bemenet egyidejű tesztelésére

Több bemenettel rendelkező függvény manuális meghívása helyett:

defteszt_számok hozzáadása():
állítja add_numbers(2, 3) == 6
állítja add_numbers(-1, 1) == 0
állítja add_numbers(0, 0) == 0

A Pytest paraméterezett tesztelési funkciót biztosít, amely lehetővé teszi, hogy könnyebben elvégezze ugyanezt. Így írhatja át a fenti tesztfüggvényt:

import pytest

@pytest.mark.parametrize("a, b, várható", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
defteszt_számok hozzáadása(a, b, várható):
állítjaadd_numbers(a, b)== várható

Több teszt futtatása

Eddig csak két tesztet írt az add_numbers függvényhez. Az összetettebb, több tesztet tartalmazó függvények esetében érdemes lehet őket egy osztályba csoportosítani.

Például itt van, hogyan hozhat létre tesztosztályt az add függvényhez.

osztályTestAddFunction:
@pytest.mark.parametrize("a, b, várható", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
defteszt_kiegészítés_számokkal(én, a, b, elvárt):
állítja add_numbers (a, b) == várható

defteszt_számok_hozzáadása_érvénytelen_bemenetekkel(maga):
val vel pytest.raises (TypeError) mint exc_info:
add_numbers(Egyik sem, 2)
állítja exc_info.value.args[0] == "nem támogatott operandustípus(ok) +: 'NoneType' és 'int'"

Ne feledje, hogy az osztálynév elé a „Test” előtagot kell írnia, hogy a Pytest tesztosztályként azonosíthassa és futtathassa.

A Pytest számos funkcióval rendelkezik

A Pytest segítségével automatikusan ellenőrizheti, hogy a kód megfelelően működik. A Pytest számos egyéb szolgáltatást kínál, például rögzítőket, amelyek lehetővé teszik a tesztadatok beállítását és lebontását, valamint a tesztfunkciók metaadatainak beállításához szükséges jelöléseket.

Ezenkívül integrálhatja a Pytestet a CI-folyamatba, és automatikusan és folyamatosan futtathatja a teszteket, amikor módosítja a kódot.