Nastavitev preskusne zbirke za vašo kodo se morda zdi ovira, na katero niste pripravljeni, vendar ta knjižnica zahteva veliko obremenitve.

Testiranje je bistveni del razvoja programske opreme. Pomaga zgodaj odkriti napake in zmanjša verjetnost napak v nadaljevanju.

Pytest je eno najbolj priljubljenih testnih ogrodij za Python. Omogoča vam pisanje majhnih in berljivih testov, ki se lahko povečajo, ko vaša aplikacija raste. Naučite se nastaviti in uporabljati Pytest s svojo kodo Python.

Nastavitev Pytesta

Preden namestite Pytest, je najbolje, da ustvarite virtualno okolje da izolirate svoje preskusno okolje, tako da se lahko izognete konfliktom z drugimi paketi in odvisnostmi.

Če želite ustvariti virtualno okolje, zaženite naslednji ukaz, preden namestite Pytest.

python -m venv testi

To bo ustvarilo novo virtualno okolje z imenom testi v vašem trenutnem imeniku. Če želite aktivirati okolje, zaženite ta ukaz, če uporabljate Linux ali Mac:

izvorni testi/bin/aktiviraj

Za Windows zaženite ta ukaz:

testi\\Skripte\\aktiviraj
instagram viewer

Če želite namestiti Pytest, lahko uporabite pip, upravitelja paketov Python, s tem ukazom v vašem terminalu:

pip namestite pytest

Če nimate Pipa, ne skrbite; ti lahko namestite Pip v Windows, Mac in Linux.

Zaženite naslednji ukaz, da preverite, ali ste Pytest pravilno namestili.

pytest --različica

To bi moralo vrniti nameščeno številko različice.

Ustvarjanje vašega prvega testa

Razmislite o naslednji funkciji, ki sešteje dve števili in vrne rezultat.

defdodaj_števila(a, b):
vrnitev a + b

Pri tej funkciji gre lahko več stvari narobe. Na primer, razmislite, kaj se zgodi, če pokličete funkcijo z neštevilskimi vrednostmi, kot je None ali vrednost tipa niz. To je nekaj možnih robnih primerov, ki lahko povzročijo odpoved funkcije.

Eden prvih testov, ki jih napišete, mora preveriti, ali funkcija vrne pričakovani rezultat. Če želite to narediti, lahko uporabite ključno besedo assert, da primerjate dejanski izhod funkcije s pričakovanim izhodom. V primeru funkcije add_numbers je testna funkcija lahko videti takole:

deftest_dodajanje_števil():
trditi dodaj_števila(2, 3) == 5
trditi dodaj_števila(-1, 1) == 0
trditi dodaj_števila(0, 0) == 0

Ta preizkusna funkcija vključuje tri trditvene izjave, od katerih vsaka primerja izhod funkcije add_numbers s pričakovano vrednostjo. Prvi preizkus preveri, ali seštevanje 2 in 3 vrne 5, drugi preizkus preveri, ali seštevanje -1 in 1 vrne 0, tretji preizkus pa preveri, ali seštevanje 0 in 0 vrne 0.

Kako izvajati teste s Pytestom

Ko ste napisali teste, je naslednji korak, da jih izvedete. Če želite to narediti s Pytestom, se pomaknite do imenika, ki vsebuje vašo testno datoteko, in zaženite ukaz pytest:

pytest

Če vse deluje po pričakovanjih, boste videli sporočilo, ki nakazuje, da so vsi testi uspešno opravljeni. Če pa katera od trditev ne uspe, bo Pytest javil napako in vam pokazal vhodne vrednosti, ki so povzročile napako.

Recimo, da ste zagnali naslednjo preskusno funkcijo za funkcijo add_numbers:

deftest_dodajanje_števil():
trditi dodaj_števila(2, 3) == 6
trditi dodaj_števila(-1, 1) == 0
trditi dodaj_števila(0, 0) == 0

Prva trditev ne bo uspela, ker je bila pričakovana vrednost 6, dejanska vrednost pa 5 (vsota 2 in 3). Pytest bo vrnil naslednje sporočilo:

To sporočilo prikazuje vhodne vrednosti, ki so povzročile vrednost, in vam tudi pove, kakšna bi morala biti dejanska vrednost. To olajša hitro prepoznavanje in odpravljanje napak v vaši kodi.

Uporaba Pytest.raises za uveljavljanje izjem

Zdaj pa napišimo preizkus, ki bo pokril enega od robnih primerov funkcije add_numbers. Ko v funkcijo posredujete neštevilski argument, kot je None, bi moral Python sprožiti izjemo TypeError.

Moral bi že biti obravnavanje izjem v vaših programih Pythonin lahko preizkusite, ali jih tudi vaša koda pravilno dviguje.

Če želite to narediti, kopirajte naslednjo preskusno funkcijo v datoteko. Uporablja upravitelja konteksta pytest.raises, da preveri, ali klic funkcije add_number z »None« povzroči izjemo TypeError.

uvoz pytest

deftest_dodajanje_števil_z_neveljavnimi_vnosi():
z pytest.raises (TypeError):
dodaj_števila(Noben, 2)

Nato zaženite Pytest iz ukazne vrstice. Če se izjema ne sproži, test ne bo uspel.

Lahko greste dlje in preverite podrobnosti sporočila o izjemi. Upravljalnik konteksta ustvari objekt ExceptionInfo s podrobnostmi.

Na primer, v tej preskusni funkciji potrdite sporočilo o izjemi takole:

deftest_dodajanje_števil_z_neveljavnimi_vnosi():
z pytest.raises(TypeError) kot exc_info:
dodaj_števila(Noben, 2)

trditi exc_info.value.args[0] == "nepodprte vrste operandov za +: 'NoneType' in 'int'"

Če se sporočilo ne ujema s tistim v testu, bo Pytest pokazal napako.

Kako uporabljati parametrizirano testiranje za testiranje več vhodov hkrati

Namesto ročnega klica funkcije z več vhodi, kot je ta:

deftest_dodajanje_števil():
trditi dodaj_števila(2, 3) == 6
trditi dodaj_števila(-1, 1) == 0
trditi dodaj_števila(0, 0) == 0

Pytest ponuja funkcijo parametriranega testiranja, ki vam omogoča, da naredite isto stvar lažje. Tukaj je opisano, kako lahko prepišete zgornjo testno funkcijo:

uvoz pytest

@pytest.mark.parametrize("a, b, pričakovano", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
deftest_dodajanje_števil(a, b, pričakovano):
trditidodaj_števila(a, b)== pričakovano

Kako zagnati več testov

Doslej ste napisali le dva testa za funkcijo add_numbers. Za bolj zapletene funkcije z več testi jih boste morda želeli združiti v razred.

Tukaj je na primer, kako bi ustvarili preskusni razred za funkcijo dodajanja.

razredTestAddFunction:
@pytest.mark.parametrize("a, b, pričakovano", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
defpreizkusni_seštevek_s_števili(jaz, a, b, pričakovano):
trditi add_numbers (a, b) == pričakovano

deftest_dodajanje_števil_z_neveljavnimi_vnosi(sebe):
z pytest.raises (TypeError) kot exc_info:
dodaj_števila(Noben, 2)
trditi exc_info.value.args[0] == "nepodprte vrste operandov za +: 'NoneType' in 'int'"

Upoštevajte, da morate imenu razreda dodati predpono »Test«, da ga lahko Pytest prepozna kot testni razred in zažene.

Pytest ima veliko več funkcij

Z uporabo Pytesta lahko samodejno preverite, ali vaša koda deluje, kot pričakujete. Pytest ponuja številne druge funkcije, kot so napeljave, ki vam omogočajo, da nastavite in odstranite testne podatke in oznake za nastavitev metapodatkov na vaših testnih funkcijah.

Poleg tega lahko Pytest integrirate v svoj cevovod CI in začnete izvajati teste samodejno in neprekinjeno, ko spremenite kodo.