Opsætning af en testpakke til din kode kan føles som en forhindring, du ikke er klar til, men dette bibliotek tager meget af belastningen.

Test er en væsentlig del af softwareudvikling. Det hjælper med at fange fejl tidligt og reducerer sandsynligheden for fejl ned ad linjen.

Pytest er en af ​​de mest populære testrammer til Python. Det lader dig skrive små og læsbare tests, der kan skaleres, efterhånden som din ansøgning vokser. Lær, hvordan du opsætter og bruger Pytest med din Python-kode.

Opsætning af Pytest

Før du installerer Pytest, er det bedst at skabe et virtuelt miljø at isolere dit testmiljø, så du kan undgå konflikter med andre pakker og afhængigheder.

For at oprette et virtuelt miljø skal du køre følgende kommando, før du installerer Pytest.

python -m venv tests

Dette vil oprette et nyt virtuelt miljø med navnet tests i din nuværende mappe. For at aktivere miljøet skal du køre denne kommando, hvis du er på Linux eller Mac:

kildetest/bin/aktiver

For Windows skal du køre denne kommando:

instagram viewer
test\\Scripts\\aktiver

For at installere Pytest kan du bruge pip, Python-pakkehåndteringen, med denne kommando i din terminal:

pip installer pytest

Hvis du ikke har Pip, så fortvivl ikke; du kan installere Pip på Windows, Mac og Linux.

Kør følgende kommando for at kontrollere, om du har installeret Pytest korrekt.

pytest --version

Dette skulle returnere det installerede versionsnummer.

Oprettelse af din første test

Overvej følgende funktion, der tilføjer to tal og returnerer resultatet.

deftilføje_numre(a, b):
Vend tilbage a + b

Flere ting kan gå galt med denne funktion. Overvej for eksempel, hvad der sker, hvis du kalder funktionen med ikke-numeriske værdier, såsom Ingen eller en værdi af typen streng. Dette er nogle af de potentielle edge-tilfælde, der kan få funktionen til at svigte.

En af de første test, du skriver, skal kontrollere, om funktionen returnerer det forventede resultat. For at gøre dette kan du bruge assert nøgleordet til at sammenligne det faktiske output af funktionen med det forventede output. I tilfælde af add_numbers-funktionen kan testfunktionen se sådan ud:

deftest_add_numbers():
hævde tilføje_numre(2, 3) == 5
hævde tilføje_numre(-1, 1) == 0
hævde tilføje_numre(0, 0) == 0

Denne testfunktion inkluderer tre assert-sætninger, som hver sammenligner outputtet af add_numbers-funktionen med en forventet værdi. Den første test kontrollerer, at tilføjelse af 2 og 3 returnerer 5, den anden test kontrollerer, at tilføjelse af -1 og 1 returnerer 0, og den tredje test kontrollerer, at tilføjelse af 0 og 0 returnerer 0.

Sådan køres tests med Pytest

Når du har skrevet dine tests, er næste trin at køre dem. For at gøre dette med Pytest skal du navigere til den mappe, der indeholder din testfil og køre pytest-kommandoen:

pytest

Hvis alt fungerer som forventet, vil du se en meddelelse, der indikerer, at alle test er bestået. Men hvis nogen af ​​påstandene mislykkes, vil Pytest rapportere en fejl og vise dig de inputværdier, der forårsagede fejlen.

Lad os for eksempel sige, at du kørte følgende testfunktion for funktionen add_numbers:

deftest_add_numbers():
hævde tilføje_numre(2, 3) == 6
hævde tilføje_numre(-1, 1) == 0
hævde tilføje_numre(0, 0) == 0

Den første påstand mislykkes, fordi den forventede værdi var 6, men den faktiske værdi var 5 (summen af ​​2 og 3). Pytest vil returnere følgende besked:

Denne meddelelse viser dig de inputværdier, der forårsagede værdien, og fortæller dig også, hvad den faktiske værdi skal være. Dette gør det nemt hurtigt at identificere og rette fejl i din kode.

Brug af Pytest.raises til at hævde undtagelser

Lad os nu skrive en test for at dække et af kanttilfældene af add_numbers-funktionen. Når du sender et ikke-numerisk argument som None til funktionen, bør Python rejse en TypeError-undtagelse.

Det burde du allerede være håndtering af undtagelser i dine Python-programmer, og du kan teste, at din kode også hæver dem korrekt.

For at gøre dette skal du kopiere følgende testfunktion i din fil. Den bruger konteksthåndteringen pytest.raises til at kontrollere, om kald af add_number-funktionen med "None" rejser en TypeError-undtagelse.

importere pytest

deftest_add_numbers_with_invalid_inputs():
med pytest.raises (TypeError):
tilføje_numre(Ingen, 2)

Kør derefter Pytest fra kommandolinjen. Hvis undtagelsen ikke hæves, vil testen mislykkes.

Du kan gå videre og kontrollere detaljerne i undtagelsesmeddelelsen. Kontekstmanageren producerer et ExceptionInfo-objekt med detaljerne.

For eksempel, i denne testfunktion skal du hævde undtagelsesmeddelelsen som denne:

deftest_add_numbers_with_invalid_inputs():
med pytest.raises(Typefejl) som exc_info:
tilføje_numre(Ingen, 2)

hævde exc_info.value.args[0] == "ikke-understøttet operandtype(r) for +: 'NoneType' og 'int'"

Hvis meddelelsen ikke stemmer overens med den i testen, vil Pytest indikere en fejl.

Sådan bruger du parametriseret test til at teste flere indgange på én gang

I stedet for manuelt at kalde en funktion med flere indgange som dette:

deftest_add_numbers():
hævde tilføje_numre(2, 3) == 6
hævde tilføje_numre(-1, 1) == 0
hævde tilføje_numre(0, 0) == 0

Pytest giver en parameteriseret testfunktion, der giver dig mulighed for at gøre det samme nemmere. Sådan kan du omskrive testfunktionen ovenfor:

importere pytest

@pytest.mark.parametrize("a, b, forventet", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
deftest_add_numbers(a, b, forventet):
hævdetilføje_numre(a, b)== forventet

Sådan kører du flere tests

Indtil videre har du kun skrevet to tests til funktionen add_numbers. For mere komplekse funktioner med flere test, kan du gruppere dem i en klasse.

For eksempel, her er, hvordan du ville oprette en testklasse for tilføjelsesfunktionen.

klasseTestAddFunction:
@pytest.mark.parametrize("a, b, forventet", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
deftest_tilføjelse_med_tal(selv, a, b, forventet):
hævde add_numbers (a, b) == forventet

deftest_add_numbers_with_invalid_inputs(selv):
med pytest.raises (TypeError) som exc_info:
tilføje_numre(Ingen, 2)
hævde exc_info.value.args[0] == "ikke-understøttet operandtype(r) for +: 'NoneType' og 'int'"

Bemærk, at du skal præfiksere klassenavnet med "Test", så Pytest kan identificere det som en testklasse og køre det.

Pytest har mange flere funktioner

Ved hjælp af Pytest kan du automatisk bekræfte, at din kode fungerer, som du forventer. Pytest tilbyder mange andre funktioner såsom armaturer, der giver dig mulighed for at opsætte og rive testdata og mærker til opsætning af metadata på dine testfunktioner.

Derudover kan du integrere Pytest i din CI-pipeline og begynde at køre test automatisk og kontinuerligt, når du ændrer din kode.