Postavljanje testnog skupa za vaš kod može se činiti kao prepreka za koju niste spremni, ali ova biblioteka iziskuje mnogo napora.

Testiranje je bitan dio razvoja softvera. Pomaže u ranom otkrivanju grešaka i smanjuje vjerojatnost grešaka.

Pytest je jedan od najpopularnijih okvira za testiranje za Python. Omogućuje vam pisanje malih i čitljivih testova koji se mogu skalirati kako vaša aplikacija raste. Naučite kako postaviti i koristiti Pytest sa svojim Python kodom.

Postavljanje Pytesta

Prije instaliranja Pytesta, najbolje je stvoriti virtualno okruženje kako biste izolirali svoje testno okruženje, tako da možete izbjeći sukobe s drugim paketima i ovisnostima.

Da biste stvorili virtualno okruženje, pokrenite sljedeću naredbu prije instaliranja Pytesta.

python -m venv testovi

Ovo će stvoriti novo virtualno okruženje pod nazivom testovi u vašem trenutnom direktoriju. Da biste aktivirali okruženje, pokrenite ovu naredbu ako ste na Linuxu ili Macu:

izvorni testovi/bin/aktivacija

Za Windows pokrenite ovu naredbu:

instagram viewer
testovi\\Skripte\\aktivirati

Da biste instalirali Pytest, možete koristiti pip, Python upravitelj paketa, s ovom naredbom u vašem terminalu:

pip instaliraj pytest

Ako nemate Pip, ne brinite; možeš instalirajte Pip na Windows, Mac i Linux.

Pokrenite sljedeću naredbu da provjerite jeste li ispravno instalirali Pytest.

pytest --verzija

Ovo bi trebalo vratiti broj instalirane verzije.

Izrada vašeg prvog testa

Razmotrite sljedeću funkciju koja zbraja dva broja i vraća rezultat.

defzbroj_brojeva(a, b):
povratak a + b

Nekoliko stvari može poći po zlu s ovom funkcijom. Na primjer, razmislite što se događa ako pozovete funkciju s nenumeričkim vrijednostima kao što je Ništa ili vrijednosti tipa niz. Ovo su neki od mogućih rubnih slučajeva koji mogu uzrokovati kvar funkcije.

Jedan od prvih testova koje napišete trebao bi provjeriti vraća li funkcija očekivani rezultat. Da biste to učinili, možete upotrijebiti ključnu riječ assert za usporedbu stvarnog izlaza funkcije s očekivanim izlazom. U slučaju funkcije add_numbers, testna funkcija može izgledati ovako:

deftest_dodavanje_brojeva():
tvrditi zbroji_brojeve(2, 3) == 5
tvrditi zbroji_brojeve(-1, 1) == 0
tvrditi zbroji_brojeve(0, 0) == 0

Ova testna funkcija uključuje tri izjave assert, od kojih svaka uspoređuje izlaz funkcije add_numbers s očekivanom vrijednošću. Prvi test provjerava daje li zbrajanje 2 i 3 5, drugi test provjerava daje li zbrajanje -1 i 1 0, a treći test provjerava vraća li zbrajanje 0 i 0 0.

Kako izvoditi testove pomoću Pytesta

Nakon što ste napisali svoje testove, sljedeći korak je njihovo pokretanje. Da biste to učinili pomoću Pytesta, dođite do direktorija koji sadrži vašu testnu datoteku i pokrenite naredbu pytest:

pytest

Ako sve radi prema očekivanjima, vidjet ćete poruku koja pokazuje da su svi testovi uspješno prošli. Međutim, ako bilo koja od tvrdnji ne uspije, Pytest će prijaviti pogrešku i pokazati vam ulazne vrijednosti koje su uzrokovale neuspjeh.

Na primjer, recimo da ste pokrenuli sljedeću testnu funkciju za funkciju add_numbers:

deftest_dodavanje_brojeva():
tvrditi zbroji_brojeve(2, 3) == 6
tvrditi zbroji_brojeve(-1, 1) == 0
tvrditi zbroji_brojeve(0, 0) == 0

Prva tvrdnja neće uspjeti jer je očekivana vrijednost bila 6, ali je stvarna vrijednost bila 5 (zbroj 2 i 3). Pytest će vratiti sljedeću poruku:

Ova poruka vam pokazuje ulazne vrijednosti koje su uzrokovale vrijednost i također vam govori koja bi stvarna vrijednost trebala biti. To olakšava brzo prepoznavanje i ispravljanje pogrešaka u vašem kodu.

Korištenje Pytest.raises to Assert Exceptions

Sada napišimo test koji će pokriti jedan od rubnih slučajeva funkcije add_numbers. Kada funkciji proslijedite nenumerički argument kao što je None, Python bi trebao pokrenuti iznimku TypeError.

Već bi trebao biti rukovanje iznimkama u vašim Python programima, a možete testirati i da li ih vaš kod ispravno podiže.

Da biste to učinili, kopirajte sljedeću testnu funkciju u svoju datoteku. Koristi upravitelj konteksta pytest.raises za provjeru izaziva li pozivanje funkcije add_number s "None" iznimku TypeError.

uvoz pytest

deftest_dodavanje_brojeva_s_nevažećim_unosima():
s pytest.raises (TypeError):
zbroji_brojeve(Nijedan, 2)

Zatim pokrenite Pytest iz naredbenog retka. Ako se iznimka ne pokrene, test neće uspjeti.

Možete ići dalje i provjeriti detalje poruke o iznimci. Upravitelj konteksta proizvodi ExceptionInfo objekt s detaljima.

Na primjer, u ovoj testnoj funkciji potvrdite poruku o iznimci ovako:

deftest_dodavanje_brojeva_s_nevažećim_unosima():
s pytest.raises(TypeError) kao exc_info:
zbroji_brojeve(Nijedan, 2)

tvrditi exc_info.value.args[0] == "nepodržani tip(ovi) operanda za +: 'NoneType' i 'int'"

Ako poruka ne odgovara onoj u testu, Pytest će pokazati neuspjeh.

Kako koristiti parametrizirano testiranje za testiranje više ulaza odjednom

Umjesto ručnog pozivanja funkcije s višestrukim unosima poput ovog:

deftest_dodavanje_brojeva():
tvrditi zbroji_brojeve(2, 3) == 6
tvrditi zbroji_brojeve(-1, 1) == 0
tvrditi zbroji_brojeve(0, 0) == 0

Pytest pruža parametriziranu značajku testiranja koja vam omogućuje lakše obavljanje iste stvari. Evo kako možete prepisati gornju testnu funkciju:

uvoz pytest

@pytest.mark.parametrize("a, b, očekivano", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
deftest_dodavanje_brojeva(a, b, očekivano):
tvrditizbroj_brojeva(a, b)== očekivano

Kako pokrenuti više testova

Do sada ste napisali samo dva testa za funkciju add_numbers. Za složenije funkcije s više testova, možda ćete ih htjeti grupirati u klasu.

Na primjer, evo kako biste stvorili testnu klasu za funkciju dodavanja.

razredaTestAddFunction:
@pytest.mark.parametrize("a, b, očekivano", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
deftest_zbrajanje_s_brojevima(ja, a, b, očekivano):
tvrditi zbroj_brojeva (a, b) == očekivano

deftest_dodavanje_brojeva_s_nevažećim_unosima(sebe):
s pytest.raises (TypeError) kao exc_info:
zbroji_brojeve(Nijedan, 2)
tvrditi exc_info.value.args[0] == "nepodržani tip(ovi) operanda za +: 'NoneType' i 'int'"

Imajte na umu da prije naziva klase trebate staviti "Test" kako bi Pytest mogao identificirati klasu za testiranje i pokrenuti je.

Pytest ima mnogo više značajki

Koristeći Pytest, možete automatski provjeriti da vaš kod radi kako očekujete. Pytest nudi mnoge druge značajke kao što su fixture koje vam omogućuju da postavite i srušite testne podatke i oznake za postavljanje metapodataka na vašim testnim funkcijama.

Osim toga, možete integrirati Pytest u svoj CI cjevovod i pokrenuti testove automatski i kontinuirano kada promijenite svoj kod.