Het opzetten van een testsuite voor uw code kan een hindernis zijn waar u nog niet klaar voor bent, maar deze bibliotheek neemt veel van de spanning weg.
Testen is een essentieel onderdeel van softwareontwikkeling. Het helpt bugs vroegtijdig op te sporen en verkleint de kans op fouten in de loop van de tijd.
Pytest is een van de meest populaire testframeworks voor Python. Hiermee kunt u kleine en leesbare tests schrijven die kunnen worden geschaald naarmate uw toepassing groeit. Leer hoe u Pytest instelt en gebruikt met uw Python-code.
Pytest instellen
Voordat u Pytest installeert, kunt u dit het beste doen creëer een virtuele omgeving om uw testomgeving te isoleren, zodat u conflicten met andere pakketten en afhankelijkheden kunt vermijden.
Om een virtuele omgeving te creëren, voert u de volgende opdracht uit voordat u Pytest installeert.
python -m venv-tests
Hiermee wordt een nieuwe virtuele omgeving met de naam tests gemaakt in uw huidige map. Om de omgeving te activeren, voert u deze opdracht uit als u Linux of Mac gebruikt:
source testen/bin/activeren
Voer voor Windows deze opdracht uit:
testen\\Scripts\\activeren
Om Pytest te installeren, kunt u pip, de Python-pakketbeheerder, gebruiken met deze opdracht in uw terminal:
pip installeer pytest
Maak je geen zorgen als je Pip niet hebt; jij kan installeer Pip op Windows, Mac en Linux.
Voer de volgende opdracht uit om te controleren of u Pytest correct hebt geïnstalleerd.
pytest --versie
Dit zou het geïnstalleerde versienummer moeten retourneren.
Uw eerste test maken
Beschouw de volgende functie die twee getallen optelt en het resultaat retourneert.
defvoeg_nummers toe(een, b):
opbrengst een + b
Er kunnen verschillende dingen misgaan met deze functie. Bedenk bijvoorbeeld wat er gebeurt als u de functie aanroept met niet-numerieke waarden zoals Geen of een waarde van het type tekenreeks. Dit zijn enkele van de mogelijke randgevallen die ervoor kunnen zorgen dat de functie mislukt.
Een van de eerste tests die u schrijft, moet controleren of de functie het verwachte resultaat retourneert. Om dit te doen, kunt u het sleutelwoord assert gebruiken om de werkelijke uitvoer van de functie te vergelijken met de verwachte uitvoer. In het geval van de functie add_numbers kan de testfunctie er als volgt uitzien:
deftest_add_nummers():
beweren add_numbers(2, 3) == 5
beweren add_numbers(-1, 1) == 0
beweren add_numbers(0, 0) == 0
Deze testfunctie bevat drie assert-statements, die elk de uitvoer van de functie add_numbers vergelijken met een verwachte waarde. De eerste test controleert of het optellen van 2 en 3 5 oplevert, de tweede test controleert of het optellen van -1 en 1 0 oplevert, en de derde test controleert of het optellen van 0 en 0 0 oplevert.
Tests uitvoeren met Pytest
Nadat u uw tests hebt geschreven, is de volgende stap om ze uit te voeren. Om dit met Pytest te doen, navigeert u naar de map met uw testbestand en voert u de opdracht pytest uit:
pytest
Als alles werkt zoals verwacht, ziet u een bericht dat aangeeft dat alle tests met succes zijn doorstaan. Als een van de beweringen echter mislukt, rapporteert Pytest een fout en toont het u de invoerwaarden die de fout hebben veroorzaakt.
Stel dat u bijvoorbeeld de volgende testfunctie hebt uitgevoerd voor de functie add_numbers:
deftest_add_nummers():
beweren add_numbers(2, 3) == 6
beweren add_numbers(-1, 1) == 0
beweren add_numbers(0, 0) == 0
De eerste bewering mislukt omdat de verwachte waarde 6 was, maar de werkelijke waarde 5 was (de som van 2 en 3). Pytest retourneert het volgende bericht:
Dit bericht toont u de invoerwaarden die de waarde hebben veroorzaakt en vertelt u ook wat de werkelijke waarde zou moeten zijn. Dit maakt het gemakkelijk om fouten in uw code snel te identificeren en op te lossen.
Pytest.raises gebruiken om uitzonderingen te bevestigen
Laten we nu een test schrijven om een van de randgevallen van de functie add_numbers te dekken. Wanneer u een niet-numeriek argument zoals None aan de functie doorgeeft, zou Python een TypeError-uitzondering moeten genereren.
Dat zou je al moeten zijn omgaan met uitzonderingen in uw Python-programma's, en u kunt testen of uw code ze ook correct verhoogt.
Kopieer hiervoor de volgende testfunctie in uw bestand. Het gebruikt de contextmanager pytest.raises om te controleren of het aanroepen van de functie add_number met "None" een TypeError-uitzondering veroorzaakt.
importeren pytest
deftest_add_numbers_with_invalid_inputs():
met pytest.raises (TypeError):
add_numbers(Geen, 2)
Voer vervolgens Pytest uit vanaf de opdrachtregel. Als de exception niet wordt verhoogd, zal de test mislukken.
U kunt verder gaan en de details van het uitzonderingsbericht controleren. De contextmanager produceert een ExceptionInfo-object met de details.
In deze testfunctie bevestigt u bijvoorbeeld het uitzonderingsbericht als volgt:
deftest_add_numbers_with_invalid_inputs():
met pytest.raises(Typefout) als exc_info:
add_numbers(Geen, 2)
beweren exc_info.waarde.args[0] == "niet-ondersteunde operandtype(s) voor +: 'NoneType' en 'int'"
Als het bericht niet overeenkomt met het bericht in de test, geeft Pytest een fout aan.
Testen met parameters gebruiken om meerdere ingangen tegelijk te testen
In plaats van handmatig een functie aan te roepen met meerdere invoer zoals deze:
deftest_add_nummers():
beweren add_numbers(2, 3) == 6
beweren add_numbers(-1, 1) == 0
beweren add_numbers(0, 0) == 0
Pytest biedt een geparametriseerde testfunctie waarmee u hetzelfde gemakkelijker kunt doen. Hier leest u hoe u de bovenstaande testfunctie kunt herschrijven:
importeren pytest
@pytest.mark.parametriseren("a, b, verwacht", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
deftest_add_nummers(a, b, verwacht):
bewerenvoeg_nummers toe(een, b)== verwacht
Meerdere tests uitvoeren
Tot nu toe heb je slechts twee tests geschreven voor de functie add_numbers. Voor meer complexe functies met meer tests, wilt u ze misschien in een klas groeperen.
Hier ziet u bijvoorbeeld hoe u een testklasse maakt voor de add-functie.
klasTestToevoegenFunctie:
@pytest.mark.parametrize("a, b, verwacht", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
deftest_toevoeging_met_nummers(zelf, a, b, verwacht):
beweren add_numbers (a, b) == verwacht
deftest_add_numbers_with_invalid_inputs(zelf):
met pytest.raises (TypeError) als exc_info:
add_numbers(Geen, 2)
beweren exc_info.waarde.args[0] == "niet-ondersteunde operandtype(s) voor +: 'NoneType' en 'int'"
Merk op dat u de klassenaam moet laten voorafgaan door "Test", zodat Pytest deze kan identificeren als een testklasse en deze kan uitvoeren.
Pytest heeft veel meer functies
Met behulp van Pytest kunt u automatisch controleren of uw code werkt zoals u verwacht. Pytest biedt vele andere functies, zoals armaturen waarmee u testgegevens kunt instellen en afbreken en markeringen voor het instellen van metadata op uw testfuncties.
Bovendien kunt u Pytest in uw CI-pijplijn integreren en automatisch en doorlopend testen uitvoeren wanneer u uw code wijzigt.