Testisarjan määrittäminen koodillesi voi tuntua esteeltä, johon et ole valmis, mutta tämä kirjasto vaatii paljon rasitusta.
Testaus on olennainen osa ohjelmistokehitystä. Se auttaa havaitsemaan virheet varhaisessa vaiheessa ja vähentää virheiden todennäköisyyttä.
Pytest on yksi Pythonin suosituimmista testauskehyksistä. Sen avulla voit kirjoittaa pieniä ja luettavia testejä, jotka voivat skaalata sovelluksesi kasvaessa. Opi määrittämään Pytest ja käyttämään sitä Python-koodisi kanssa.
Pytestin määrittäminen
Ennen Pytestin asentamista on parasta luoda virtuaalinen ympäristö eristääksesi testiympäristösi, jotta voit välttää ristiriidat muiden pakettien ja riippuvuuksien kanssa.
Luo virtuaaliympäristö suorittamalla seuraava komento ennen Pytestin asentamista.
python -m venv -testit
Tämä luo uuden virtuaalisen ympäristön, jonka nimi on testit nykyiseen hakemistoosi. Aktivoi ympäristö suorittamalla tämä komento, jos käytät Linuxia tai Macia:
lähdetestit/bin/aktivointi
Windowsissa, suorita tämä komento:
testit\\Scripts\\aktivoida
Pytestin asentamiseen voit käyttää pip, Python-pakettien hallintaa tällä komennolla terminaalissasi:
pip asennus pytest
Jos sinulla ei ole Pipia, älä huoli; sinä pystyt asenna Pip Windowsiin, Maciin ja Linuxiin.
Suorita seuraava komento tarkistaaksesi, asensitko Pytestin oikein.
pytest -- versio
Tämän pitäisi palauttaa asennettu versionumero.
Ensimmäisen testin luominen
Harkitse seuraavaa funktiota, joka lisää kaksi numeroa ja palauttaa tuloksen.
defadd_numbers(a, b):
palata a + b
Useat asiat voivat mennä pieleen tämän toiminnon kanssa. Mieti esimerkiksi, mitä tapahtuu, jos kutsut funktiota ei-numeerisilla arvoilla, kuten Ei mitään, tai arvolla, jonka tyyppi on merkkijono. Nämä ovat joitakin mahdollisia reunatapauksia, jotka voivat aiheuttaa toiminnon epäonnistumisen.
Yhden ensimmäisistä kirjoittamistasi testeistä tulee tarkistaa, palauttaako funktio odotetun tuloksen. Voit tehdä tämän käyttämällä assert-avainsanaa vertaamaan funktion todellista tulosta odotettua tulosta. Add_numbers-funktion tapauksessa testifunktio saattaa näyttää tältä:
deftesti_lisää_numerot():
väittää add_numbers(2, 3) == 5
väittää add_numbers(-1, 1) == 0
väittää add_numbers(0, 0) == 0
Tämä testifunktio sisältää kolme väitelausetta, joista jokainen vertaa add_numbers-funktion tulosta odotettuun arvoon. Ensimmäinen testi tarkistaa, että 2 ja 3 lisääminen palauttaa 5, toinen testi tarkistaa, että -1 ja 1 lisääminen palauttaa 0, ja kolmas testi tarkistaa, että 0 ja 0 lisääminen palauttaa 0.
Testien suorittaminen Pytestillä
Kun olet kirjoittanut testit, seuraava vaihe on suorittaa ne. Voit tehdä tämän Pytestillä siirtymällä testitiedoston sisältävään hakemistoon ja suorittamalla pytest-komento:
pytest
Jos kaikki toimii odotetulla tavalla, näet viestin, joka osoittaa, että kaikki testit läpäisivät onnistuneesti. Jos jokin väitteistä kuitenkin epäonnistuu, Pytest ilmoittaa virheestä ja näyttää syötearvot, jotka aiheuttivat epäonnistumisen.
Oletetaan esimerkiksi, että suoritit seuraavan testifunktion add_numbers-funktiolle:
deftesti_lisää_numerot():
väittää add_numbers(2, 3) == 6
väittää add_numbers(-1, 1) == 0
väittää add_numbers(0, 0) == 0
Ensimmäinen väite epäonnistuu, koska odotettu arvo oli 6, mutta todellinen arvo oli 5 (2:n ja 3:n summa). Pytest palauttaa seuraavan viestin:
Tämä viesti näyttää syötearvot, jotka aiheuttivat arvon, ja kertoo myös, mikä todellisen arvon tulisi olla. Tämän ansiosta koodin virheet on helppo tunnistaa ja korjata nopeasti.
Pytest.raisesin käyttäminen poikkeuksien vahvistamiseen
Kirjoita nyt testi, joka kattaa yhden add_numbers-funktion reunatapauksista. Kun välität funktiolle ei-numeerisen argumentin, kuten Ei mitään, Pythonin pitäisi herättää TypeError-poikkeus.
Sinun pitäisi jo olla poikkeuksien käsittely Python-ohjelmissasi, ja voit testata, että myös koodisi nostaa ne oikein.
Tee tämä kopioimalla tiedostoosi seuraava testifunktio. Se käyttää pytest.raises kontekstinhallintaa tarkistaakseen, aiheuttaako add_number-funktion kutsuminen "Ei mitään" TypeError-poikkeuksen.
tuonti pytest
deftestaa_lisää_numeroita_virheellisten_syötteiden kanssa():
kanssa pytest.raises (TypeError):
add_numbers(Ei mitään, 2)
Suorita sitten Pytest komentoriviltä. Jos poikkeusta ei nosteta, testi epäonnistuu.
Voit mennä pidemmälle ja tarkistaa poikkeusviestin tiedot. Kontekstinhallinta tuottaa ExceptionInfo-objektin yksityiskohtineen.
Vahvista esimerkiksi tässä testifunktiossa poikkeusviesti näin:
deftestaa_lisää_numeroita_virheellisten_syötteiden kanssa():
kanssa pytest.raises(Tyyppivirhe) kuten exc_info:
add_numbers(Ei mitään, 2)
väittää exc_info.value.args[0] == "ei-tuettu operandityyppi(t) +:lle "NoneType" ja "int""
Jos viesti ei vastaa testin viestiä, Pytest ilmoittaa epäonnistumisesta.
Kuinka käyttää parametroitua testausta useiden tulojen testaamiseen kerralla
Sen sijaan, että kutsuisit manuaalisesti funktiota, jossa on useita tuloja, kuten tämä:
deftesti_lisää_numerot():
väittää add_numbers(2, 3) == 6
väittää add_numbers(-1, 1) == 0
väittää add_numbers(0, 0) == 0
Pytest tarjoaa parametroidun testausominaisuuden, jonka avulla voit tehdä saman asian helpommin. Näin voit kirjoittaa yllä olevan testifunktion uudelleen:
tuonti pytest
@pytest.mark.parametrize("a, b, odotettu", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
deftesti_lisää_numerot(a, b, odotettu):
väittääadd_numbers(a, b)== odotettavissa
Kuinka suorittaa useita testejä
Tähän mennessä olet kirjoittanut vain kaksi testiä add_numbers-funktiolle. Jos haluat monimutkaisempia toimintoja, joissa on enemmän testejä, voit ryhmitellä ne luokkaan.
Esimerkiksi näin voit luoda testiluokan add-funktiolle.
luokkaaTestAddFunction:
@pytest.mark.parametrize("a, b, odotettu", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
deftesti_lisäys_numeroiden kanssa(itse, a, b, odotettu):
väittää add_numbers (a, b) == odotettavissa
deftestaa_lisää_numeroita_virheellisten_syötteiden kanssa(itse):
kanssa pytest.raises (TypeError) kuten exc_info:
add_numbers(Ei mitään, 2)
väittää exc_info.value.args[0] == "ei-tuettu operandityyppi(t) +:lle "NoneType" ja "int""
Huomaa, että sinun on liitettävä luokan nimeen "Test", jotta Pytest voi tunnistaa sen testiluokaksi ja suorittaa sen.
Pytestissä on monia muita ominaisuuksia
Pytestin avulla voit automaattisesti varmistaa, että koodisi toimii odotetulla tavalla. Pytest tarjoaa monia muita ominaisuuksia, kuten kiinnittimiä, joiden avulla voit määrittää ja purkaa testitietoja ja merkkejä testitoimintojesi metatietojen määrittämiseksi.
Lisäksi voit integroida Pytestin CI-putkeen ja aloittaa testien suorittamisen automaattisesti ja jatkuvasti, kun muutat koodiasi.