Koodi testikomplekti seadistamine võib tunduda takistusena, milleks te pole valmis, kuid see teek võtab palju pingutusi.

Testimine on tarkvaraarenduse oluline osa. See aitab vigu varakult tabada ja vähendab vigade tõenäosust.

Pytest on Pythoni jaoks üks populaarsemaid testimisraamistikke. See võimaldab teil kirjutada väikeseid ja loetavaid teste, mida saab rakenduse kasvades skaleerida. Siit saate teada, kuidas Pythonit oma Pythoni koodiga seadistada ja kasutada.

Pytesti seadistamine

Enne Pytesti installimist on parem seda teha luua virtuaalne keskkond testkeskkonna isoleerimiseks, et vältida konflikte teiste pakettide ja sõltuvustega.

Virtuaalse keskkonna loomiseks käivitage enne Pytesti installimist järgmine käsk.

python -m venv testid

See loob teie praeguses kataloogis uue virtuaalse keskkonna nimega testid. Keskkonna aktiveerimiseks käivitage see käsk, kui kasutate Linuxi või Maci:

allikatestid/bin/aktiveeri

Windowsi jaoks käivitage see käsk:

testid\\Skriptid\\aktiveerida

Pytesti installimiseks võite kasutada Pythoni paketihaldurit pip selle käsuga oma terminalis:

pip install pytest

Kui teil pole Pipi, ärge muretsege; sa saad installige Pip Windowsi, Maci ja Linuxi jaoks.

Käivitage järgmine käsk, et kontrollida, kas installisite Pytesti õigesti.

pytest --versioon

See peaks tagastama installitud versiooni numbri.

Esimese testi koostamine

Mõelge järgmisele funktsioonile, mis liidab kaks arvu ja tagastab tulemuse.

deflisa_numbrid(a, b):
tagasi a + b

Selle funktsiooniga võib mitu asja valesti minna. Näiteks mõelge, mis juhtub, kui kutsute funktsiooni mittenumbriliste väärtustega (nt None) või stringi tüüpi väärtusega. Need on mõned võimalikud servajuhtumid, mis võivad põhjustada funktsiooni ebaõnnestumise.

Üks esimesi kirjutatud teste peaks kontrollima, kas funktsioon tagastab oodatud tulemuse. Selleks saab kasutada assert märksõna, et võrrelda funktsiooni tegelikku väljundit eeldatava väljundiga. Funktsiooni add_numbers puhul võib testfunktsioon välja näha järgmine:

deftest_add_numbers():
väita add_numbers(2, 3) == 5
väita add_numbers(-1, 1) == 0
väita add_numbers(0, 0) == 0

See testfunktsioon sisaldab kolme kinnituslauset, millest igaüks võrdleb funktsiooni add_numbers väljundit eeldatava väärtusega. Esimene test kontrollib, et 2 ja 3 lisamine tagastab 5, teine ​​test kontrollib, et -1 ja 1 lisamine tagastab 0 ning kolmas test kontrollib, et 0 ja 0 lisamine tagastab 0.

Kuidas Pytestiga teste käivitada

Pärast testide kirjutamist on järgmine samm nende käivitamine. Selleks Pytestiga liikuge oma testfaili sisaldavasse kataloogi ja käivitage käsk pytest:

pytest

Kui kõik toimib ootuspäraselt, näete teadet, mis näitab, et kõik testid läbisid edukalt. Kui aga mõni väidetest ebaõnnestub, teatab Pytest veast ja näitab tõrke põhjustanud sisendväärtusi.

Oletame näiteks, et käivitasite funktsiooni add_numbers jaoks järgmise testfunktsiooni:

deftest_add_numbers():
väita add_numbers(2, 3) == 6
väita add_numbers(-1, 1) == 0
väita add_numbers(0, 0) == 0

Esimene väide ebaõnnestub, kuna eeldatav väärtus oli 6, kuid tegelik väärtus oli 5 (2 ja 3 summa). Pytest tagastab järgmise teate:

See teade näitab teile väärtuse põhjustanud sisendväärtusi ja ütleb teile, milline peaks olema tegelik väärtus. See muudab koodi vigade kiire tuvastamise ja parandamise lihtsaks.

Pytest.raises kasutamine erandite kinnitamiseks

Nüüd kirjutame testi, mis katab funktsiooni add_numbers ühe äärejuhtu. Kui edastate funktsioonile mittenumbrilise argumendi (nt None), peaks Python esile kutsuma TypeErrori erandi.

Sa peaksid juba olema Pythoni programmide erandite käsitlemineja saate testida, kas teie kood tõstab ka need õigesti.

Selleks kopeerige oma faili järgmine testfunktsioon. See kasutab kontekstihaldurit pytest.raises, et kontrollida, kas funktsiooni add_number kutsumine valikuga "Puudub" tekitab TypeErrori erandi.

importida pytest

deftest_lisa_numbreid_valede_sisenditega():
koos pytest.raises (TypeError):
add_numbers(Mitte ühtegi, 2)

Seejärel käivitage käsurealt Pytest. Kui erandit ei tehta, siis test ebaõnnestub.

Võite minna kaugemale ja kontrollida erandisõnumi üksikasju. Kontekstihaldur loob üksikasjadega ExceptionInfo objekti.

Näiteks selles testfunktsioonis kinnitage erandi teade järgmiselt:

deftest_lisa_numbreid_valede_sisenditega():
koos pytest.raises(Tüübiviga) nagu exc_info:
add_numbers(Mitte ühtegi, 2)

väita exc_info.value.args[0] == "toetamata operandi tüüp(id) + jaoks: "NoneType" ja "int""

Kui teade ei vasta testis olevale, annab Pytest märku ebaõnnestumisest.

Kuidas kasutada parameetritega testimist mitme sisendi korraga testimiseks

Selle asemel, et mitme sisendiga funktsiooni käsitsi välja kutsuda, tehke järgmist.

deftest_add_numbers():
väita add_numbers(2, 3) == 6
väita add_numbers(-1, 1) == 0
väita add_numbers(0, 0) == 0

Pytest pakub parameetritega testimise funktsiooni, mis võimaldab teil sama asja lihtsamalt teha. Ülaltoodud testfunktsiooni saate ümber kirjutada järgmiselt.

importida pytest

@pytest.mark.parametrize("a, b, oodatud", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
deftest_add_numbers(a, b, oodatud):
väitalisa_numbrid(a, b)== oodatud

Kuidas käivitada mitut testi

Seni olete funktsiooni add_numbers jaoks kirjutanud ainult kaks testi. Keerulisemate ja rohkemate testidega funktsioonide puhul võiksite need klassi rühmitada.

Näiteks siin on, kuidas saate luua lisafunktsiooni jaoks testklassi.

klassTestAddFunction:
@pytest.mark.parametrize("a, b, oodatud", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
deftest_lisa_numbritega(ise, a, b, oodatud):
väita lisa_arvud (a, b) == oodatakse

deftest_lisa_numbreid_valede_sisenditega(ise):
koos pytest.raises (TypeError) nagu exc_info:
add_numbers(Mitte ühtegi, 2)
väita exc_info.value.args[0] == "toetamata operandi tüüp(id) + jaoks: "NoneType" ja "int""

Pange tähele, et peate klassi nime ette lisama "Test", et Pytest saaks selle testklassina tuvastada ja seda käivitada.

Pytestil on palju rohkem funktsioone

Pytesti abil saate automaatselt kontrollida, kas kood töötab ootuspäraselt. Pytest pakub palju muid funktsioone, näiteks kinnitusvahendeid, mis võimaldavad teil seadistada ja lahti rebida testiandmeid ja märke testimisfunktsioonide metaandmete seadistamiseks.

Lisaks saate Pytesti integreerida oma CI-konveierisse ja alustada koodi muutmisel automaatselt ja pidevalt teste.