Att ställa in en testsvit för din kod kan kännas som ett hinder du inte är redo för, men det här biblioteket tar mycket av påfrestningen.

Testning är en viktig del av mjukvaruutveckling. Det hjälper till att fånga buggar tidigt och minskar sannolikheten för fel längre fram.

Pytest är ett av de mest populära testramverken för Python. Det låter dig skriva små och läsbara tester som kan skalas i takt med att din applikation växer. Lär dig hur du ställer in och använder Pytest med din Python-kod.

Konfigurera Pytest

Innan du installerar Pytest är det bäst att skapa en virtuell miljö för att isolera din testmiljö, så att du kan undvika konflikter med andra paket och beroenden.

För att skapa en virtuell miljö, kör följande kommando innan du installerar Pytest.

python -m venv tester

Detta kommer att skapa en ny virtuell miljö som heter tester i din nuvarande katalog. För att aktivera miljön, kör det här kommandot om du använder Linux eller Mac:

källtest/bin/aktivera

För Windows, kör det här kommandot:

instagram viewer
tester\\skript\\aktivera

För att installera Pytest kan du använda pip, Python-pakethanteraren, med detta kommando i din terminal:

pip installera pytest

Om du inte har Pip, oroa dig inte; du kan installera Pip på Windows, Mac och Linux.

Kör följande kommando för att kontrollera om du installerade Pytest korrekt.

pytest --version

Detta bör returnera det installerade versionsnumret.

Skapa ditt första test

Tänk på följande funktion som lägger till två tal och returnerar resultatet.

defadd_numbers(a, b):
lämna tillbaka a + b

Flera saker kan gå fel med denna funktion. Tänk till exempel på vad som händer om du anropar funktionen med icke-numeriska värden som None eller ett värde av typen sträng. Det här är några av de potentiella edge-fallen som kan orsaka att funktionen misslyckas.

Ett av de första testerna du skriver bör kontrollera om funktionen returnerar det förväntade resultatet. För att göra detta kan du använda nyckelordet assert för att jämföra den faktiska produktionen av funktionen med den förväntade outputen. När det gäller funktionen add_numbers kan testfunktionen se ut så här:

deftest_add_numbers():
hävda add_numbers(2, 3) == 5
hävda add_numbers(-1, 1) == 0
hävda add_numbers(0, 0) == 0

Den här testfunktionen innehåller tre påståendesatser, som var och en jämför utdata från add_numbers-funktionen med ett förväntat värde. Det första testet kontrollerar att addering av 2 och 3 ger 5, det andra testet kontrollerar att addering av -1 och 1 ger 0, och det tredje testet kontrollerar att addering av 0 och 0 returnerar 0.

Hur man kör tester med Pytest

När du har skrivit dina test är nästa steg att köra dem. För att göra detta med Pytest, navigera till katalogen som innehåller din testfil och kör kommandot pytest:

pytest

Om allt fungerar som förväntat kommer du att se ett meddelande som indikerar att alla tester har godkänts. Men om något av påståendena misslyckas kommer Pytest att rapportera ett fel och visa dig indatavärdena som orsakade felet.

Låt oss till exempel säga att du körde följande testfunktion för funktionen add_numbers:

deftest_add_numbers():
hävda add_numbers(2, 3) == 6
hävda add_numbers(-1, 1) == 0
hävda add_numbers(0, 0) == 0

Det första påståendet kommer att misslyckas eftersom det förväntade värdet var 6, men det faktiska värdet var 5 (summan av 2 och 3). Pytest kommer att returnera följande meddelande:

Det här meddelandet visar de ingångsvärden som orsakade värdet och berättar också vad det faktiska värdet ska vara. Detta gör det enkelt att snabbt identifiera och åtgärda fel i din kod.

Använda Pytest.raises för att hävda undantag

Låt oss nu skriva ett test för att täcka ett av kantfallen för add_numbers-funktionen. När du skickar ett icke-numeriskt argument som None till funktionen, bör Python skapa ett TypeError-undantag.

Det borde du redan vara hantera undantag i dina Python-program, och du kan testa att din kod höjer dem korrekt också.

För att göra detta, kopiera följande testfunktion i din fil. Den använder kontexthanteraren pytest.raises för att kontrollera om anrop av add_number-funktionen med "None" ger upphov till ett TypeError-undantag.

importera pytest

deftest_add_numbers_with_invalid_inputs():
med pytest.raises (TypeError):
add_numbers(Ingen, 2)

Kör sedan Pytest från kommandoraden. Om undantaget inte tas upp kommer testet att misslyckas.

Du kan gå längre och kontrollera detaljerna i undantagsmeddelandet. Kontexthanteraren producerar ett ExceptionInfo-objekt med detaljerna.

Till exempel, i den här testfunktionen, hävda undantagsmeddelandet så här:

deftest_add_numbers_with_invalid_inputs():
med pytest.raises(Skrivfel) som ex_info:
add_numbers(Ingen, 2)

hävda exc_info.value.args[0] == "ostödda operandtyper för +: 'NoneType' och 'int'"

Om meddelandet inte stämmer överens med det i testet kommer Pytest att indikera ett misslyckande.

Hur man använder parametriserad testning för att testa flera ingångar samtidigt

Istället för att manuellt anropa en funktion med flera ingångar så här:

deftest_add_numbers():
hävda add_numbers(2, 3) == 6
hävda add_numbers(-1, 1) == 0
hävda add_numbers(0, 0) == 0

Pytest tillhandahåller en parameteriserad testfunktion som låter dig göra samma sak lättare. Så här kan du skriva om testfunktionen ovan:

importera pytest

@pytest.mark.parametrize("a, b, förväntat", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
deftest_add_numbers(a, b, förväntat):
hävdaadd_numbers(a, b)== förväntat

Hur man kör flera tester

Hittills har du bara skrivit två tester för funktionen add_numbers. För mer komplexa funktioner med fler test, kanske du vill gruppera dem i en klass.

Till exempel, här är hur du skulle skapa en testklass för add-funktionen.

klassTestAddFunction:
@pytest.mark.parametrize("a, b, förväntat", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
deftest_tillägg_med_siffror(själv, a, b, förväntat):
hävda add_numbers (a, b) == förväntat

deftest_add_numbers_with_invalid_inputs(själv):
med pytest.raises (TypeError) som ex_info:
add_numbers(Ingen, 2)
hävda exc_info.value.args[0] == "ostödda operandtyper för +: 'NoneType' och 'int'"

Observera att du måste prefixet klassnamnet med "Test" så att Pytest kan identifiera den som en testklass och köra den.

Pytest har många fler funktioner

Med Pytest kan du automatiskt verifiera att din kod fungerar som du förväntar dig. Pytest erbjuder många andra funktioner såsom fixturer som låter dig ställa in och riva ner testdata och markeringar för att ställa in metadata på dina testfunktioner.

Dessutom kan du integrera Pytest i din CI-pipeline och börja köra tester automatiskt och kontinuerligt när du ändrar din kod.