Å sette opp en testpakke for koden din kan føles som et hinder du ikke er klar for, men dette biblioteket tar mye av belastningen.
Testing er en viktig del av programvareutvikling. Det hjelper med å fange opp feil tidlig og reduserer sannsynligheten for feil langs linjen.
Pytest er et av de mest populære testrammene for Python. Den lar deg skrive små og lesbare tester som kan skaleres etter hvert som søknaden din vokser. Lær hvordan du setter opp og bruker Pytest med Python-koden.
Sette opp Pytest
Før du installerer Pytest, er det best å lage et virtuelt miljø for å isolere testmiljøet ditt, slik at du kan unngå konflikter med andre pakker og avhengigheter.
For å lage et virtuelt miljø, kjør følgende kommando før du installerer Pytest.
python -m venv tester
Dette vil opprette et nytt virtuelt miljø kalt tester i din nåværende katalog. For å aktivere miljøet, kjør denne kommandoen hvis du er på Linux eller Mac:
kildetester/bin/aktiver
For Windows, kjør denne kommandoen:
tester\\skript\\aktiver
For å installere Pytest kan du bruke pip, Python-pakkebehandleren, med denne kommandoen i terminalen din:
pip installer pytest
Hvis du ikke har Pip, ikke bekymre deg; du kan installer Pip på Windows, Mac og Linux.
Kjør følgende kommando for å sjekke om du installerte Pytest riktig.
pytest --versjon
Dette skal returnere det installerte versjonsnummeret.
Lag din første test
Tenk på følgende funksjon som legger til to tall og returnerer resultatet.
defadd_numbers(a, b):
komme tilbake a + b
Flere ting kan gå galt med denne funksjonen. Tenk for eksempel på hva som skjer hvis du kaller funksjonen med ikke-numeriske verdier som Ingen eller en verdi av typen streng. Dette er noen av de potensielle edge-tilfellene som kan føre til at funksjonen mislykkes.
En av de første testene du skriver bør sjekke om funksjonen returnerer det forventede resultatet. For å gjøre dette kan du bruke assert nøkkelordet for å sammenligne den faktiske utgangen av funksjonen med den forventede utgangen. Når det gjelder add_numbers-funksjonen, kan testfunksjonen se slik ut:
deftest_legg til_tall():
hevde add_numbers(2, 3) == 5
hevde add_numbers(-1, 1) == 0
hevde add_numbers(0, 0) == 0
Denne testfunksjonen inkluderer tre assert-setninger, som hver sammenligner utdataene fra add_numbers-funksjonen med en forventet verdi. Den første testen kontrollerer at å legge til 2 og 3 returnerer 5, den andre testen kontrollerer at å legge til -1 og 1 returnerer 0, og den tredje testen kontrollerer at å legge til 0 og 0 returnerer 0.
Hvordan kjøre tester med Pytest
Etter at du har skrevet testene dine, er neste trinn å kjøre dem. For å gjøre dette med Pytest, naviger til katalogen som inneholder testfilen og kjør kommandoen pytest:
pytest
Hvis alt fungerer som forventet, vil du se en melding som indikerer at alle testene er bestått. Men hvis noen av påstandene mislykkes, vil Pytest rapportere en feil og vise deg inngangsverdiene som forårsaket feilen.
La oss for eksempel si at du kjørte følgende testfunksjon for funksjonen add_numbers:
deftest_legg til_tall():
hevde add_numbers(2, 3) == 6
hevde add_numbers(-1, 1) == 0
hevde add_numbers(0, 0) == 0
Den første påstanden vil mislykkes fordi forventet verdi var 6, men den faktiske verdien var 5 (summen av 2 og 3). Pytest vil returnere følgende melding:
Denne meldingen viser deg inngangsverdiene som forårsaket verdien og forteller deg også hva den faktiske verdien skal være. Dette gjør det enkelt å raskt identifisere og fikse feil i koden din.
Bruke Pytest.raises for å hevde unntak
La oss nå skrive en test for å dekke et av kanttilfellene til add_numbers-funksjonen. Når du sender et ikke-numerisk argument som None til funksjonen, bør Python generere et TypeError-unntak.
Det burde du allerede være håndtering av unntak i Python-programmene dine, og du kan teste at koden din hever dem riktig også.
For å gjøre dette, kopier følgende testfunksjon i filen. Den bruker kontekstbehandleren pytest.raises for å sjekke om å kalle add_number-funksjonen med "Ingen" gir et TypeError-unntak.
import pytest
deftest_add_numbers_with_invalid_inputs():
med pytest.raises (TypeError):
add_numbers(Ingen, 2)
Kjør deretter Pytest fra kommandolinjen. Hvis unntaket ikke oppheves, vil testen mislykkes.
Du kan gå videre og sjekke detaljene i unntaksmeldingen. Kontekstbehandlingen produserer et ExceptionInfo-objekt med detaljene.
For eksempel, i denne testfunksjonen, hevder unntaksmeldingen slik:
deftest_add_numbers_with_invalid_inputs():
med pytest.raises(TypeError) som exc_info:
add_numbers(Ingen, 2)
hevde exc_info.value.args[0] == "ustøttede operandtype(r) for +: 'NoneType' og 'int'"
Hvis meldingen ikke samsvarer med den i testen, vil Pytest indikere en feil.
Hvordan bruke parametrisert testing for å teste flere innganger samtidig
I stedet for manuelt å kalle en funksjon med flere innganger som dette:
deftest_legg til_tall():
hevde add_numbers(2, 3) == 6
hevde add_numbers(-1, 1) == 0
hevde add_numbers(0, 0) == 0
Pytest gir en parameterisert testfunksjon som lar deg gjøre det samme enklere. Slik kan du skrive om testfunksjonen ovenfor:
import pytest
@pytest.mark.parametrize("a, b, forventet", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
deftest_legg til_tall(a, b, forventet):
hevdeadd_numbers(a, b)== forventet
Hvordan kjøre flere tester
Så langt har du bare skrevet to tester for add_numbers-funksjonen. For mer komplekse funksjoner med flere tester, kan det være lurt å gruppere dem i en klasse.
For eksempel, her er hvordan du oppretter en testklasse for add-funksjonen.
klasseTestAddFunction:
@pytest.mark.parametrize("a, b, forventet", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
deftest_tillegg_med_tall(selv, a, b, forventet):
hevde add_numbers (a, b) == forventet
deftest_add_numbers_with_invalid_inputs(selv):
med pytest.raises (TypeError) som exc_info:
add_numbers(Ingen, 2)
hevde exc_info.value.args[0] == "ustøttede operandtype(r) for +: 'NoneType' og 'int'"
Merk at du må prefiksere klassenavnet med "Test" slik at Pytest kan identifisere den som en testklasse og kjøre den.
Pytest har mange flere funksjoner
Ved å bruke Pytest kan du automatisk bekrefte at koden din fungerer som du forventer. Pytest tilbyr mange andre funksjoner som inventar som lar deg sette opp og rive ned testdata og merker for å sette opp metadata på testfunksjonene dine.
I tillegg kan du integrere Pytest i CI-pipeline og begynne å kjøre tester automatisk og kontinuerlig når du endrer koden.