Nastavení testovací sady pro váš kód se může zdát jako překážka, na kterou nejste připraveni, ale tato knihovna vyžaduje hodně námahy.
Testování je nezbytnou součástí vývoje softwaru. Pomáhá včas odhalit chyby a snižuje pravděpodobnost chyb.
Pytest je jedním z nejpopulárnějších testovacích frameworků pro Python. Umožňuje vám psát malé a čitelné testy, které se mohou škálovat s růstem vaší aplikace. Naučte se, jak nastavit a používat Pytest s kódem Python.
Nastavení Pytestu
Před instalací Pytestu je nejlepší vytvořit virtuální prostředí izolovat vaše testovací prostředí, abyste se mohli vyhnout konfliktům s jinými balíčky a závislostmi.
Chcete-li vytvořit virtuální prostředí, spusťte před instalací Pytestu následující příkaz.
testy python -m venv
Tím se ve vašem aktuálním adresáři vytvoří nové virtuální prostředí s názvem testy. Chcete-li aktivovat prostředí, spusťte tento příkaz, pokud používáte Linux nebo Mac:
test zdroje/bin/aktivovat
V systému Windows spusťte tento příkaz:
testy\\Skripty\\aktivovat
Chcete-li nainstalovat Pytest, můžete použít pip, správce balíčků Pythonu, s tímto příkazem ve vašem terminálu:
pip install pytest
Pokud Pip nemáte, nebojte se; můžeš nainstalovat Pip na Windows, Mac a Linux.
Spusťte následující příkaz a zkontrolujte, zda jste Pytest nainstalovali správně.
pytest --verze
To by mělo vrátit číslo nainstalované verze.
Vytvoření prvního testu
Zvažte následující funkci, která sečte dvě čísla a vrátí výsledek.
defpřidat_čísla(a, b):
vrátit se a + b
S touto funkcí se může pokazit několik věcí. Zvažte například, co se stane, když funkci zavoláte s nečíselnými hodnotami, jako je Žádná nebo hodnotou typu řetězec. Toto jsou některé z potenciálních okrajových případů, které mohou způsobit selhání funkce.
Jeden z prvních testů, které napíšete, by měl zkontrolovat, zda funkce vrací očekávaný výsledek. Chcete-li to provést, můžete použít klíčové slovo statement k porovnání skutečného výstupu funkce s očekávaným výstupem. V případě funkce add_numbers může testovací funkce vypadat takto:
deftest_add_numbers():
tvrdit přidat_čísla(2, 3) == 5
tvrdit přidat_čísla(-1, 1) == 0
tvrdit přidat_čísla(0, 0) == 0
Tato testovací funkce obsahuje tři příkazy claim, z nichž každý porovnává výstup funkce add_numbers s očekávanou hodnotou. První test zkontroluje, že přidání 2 a 3 vrátí 5, druhý test zkontroluje, že přidání -1 a 1 vrátí 0 a třetí test zkontroluje, že přidání 0 a 0 vrátí 0.
Jak spouštět testy s Pytestem
Po napsání testů je dalším krokem jejich spuštění. Chcete-li to provést pomocí Pytest, přejděte do adresáře obsahujícího váš testovací soubor a spusťte příkaz pytest:
pytest
Pokud vše funguje podle očekávání, zobrazí se zpráva oznamující, že všechny testy prošly úspěšně. Pokud však některé z tvrzení selže, Pytest ohlásí chybu a ukáže vám vstupní hodnoty, které selhání způsobily.
Řekněme například, že jste spustili následující testovací funkci pro funkci add_numbers:
deftest_add_numbers():
tvrdit přidat_čísla(2, 3) == 6
tvrdit přidat_čísla(-1, 1) == 0
tvrdit přidat_čísla(0, 0) == 0
První tvrzení se nezdaří, protože očekávaná hodnota byla 6, ale skutečná hodnota byla 5 (součet 2 a 3). Pytest vrátí následující zprávu:
Tato zpráva vám ukáže vstupní hodnoty, které hodnotu způsobily, a také vám řekne, jaká by měla být skutečná hodnota. To usnadňuje rychlou identifikaci a opravu chyb v kódu.
Použití Pytest.raises k uplatnění výjimek
Nyní napíšeme test, který pokryje jeden z okrajových případů funkce add_numbers. Když předáte funkci nečíselný argument jako None, Python by měl vyvolat výjimku TypeError.
Už byste měli být zpracování výjimek ve vašich programech Pythona můžete otestovat, že je váš kód vyvolává také správně.
Chcete-li to provést, zkopírujte do souboru následující testovací funkci. Používá kontextového manažera pytest.raises ke kontrole, zda volání funkce add_number s „None“ vyvolá výjimku TypeError.
import pytest
deftest_add_numbers_with_invalid_inputs():
s pytest.raises (TypeError):
přidat_čísla(Žádný, 2)
Poté spusťte Pytest z příkazového řádku. Pokud výjimka není vyvolána, test se nezdaří.
Můžete jít dále a zkontrolovat podrobnosti zprávy o výjimce. Správce kontextu vytvoří objekt ExceptionInfo s podrobnostmi.
Například v této testovací funkci potvrďte zprávu o výjimce takto:
deftest_add_numbers_with_invalid_inputs():
s pytest.raises(TypeError) tak jako exc_info:
přidat_čísla(Žádný, 2)
tvrdit exc_info.value.args[0] == "nepodporované typy operandů pro +: 'NoneType' a 'int'"
Pokud se zpráva neshoduje se zprávou v testu, Pytest oznámí selhání.
Jak používat parametrizované testování k testování více vstupů najednou
Místo ručního volání funkce s více vstupy, jako je tento:
deftest_add_numbers():
tvrdit přidat_čísla(2, 3) == 6
tvrdit přidat_čísla(-1, 1) == 0
tvrdit přidat_čísla(0, 0) == 0
Pytest poskytuje funkci parametrizovaného testování, která vám umožní dělat stejnou věc snadněji. Zde je návod, jak můžete přepsat testovací funkci výše:
import pytest
@pytest.mark.parametrize("a, b, očekáváno", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
deftest_add_numbers(a, b, očekáváno):
tvrditpřidat_čísla(a, b)== očekáváno
Jak spustit více testů
Doposud jste napsali pouze dva testy pro funkci add_numbers. Pro složitější funkce s více testy je možná budete chtít seskupit do třídy.
Zde je například popsáno, jak byste vytvořili testovací třídu pro funkci add.
třídaTestAddFunction:
@pytest.mark.parametrize("a, b, očekáváno", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
deftest_sčítání_s_čísly(já, a, b, očekáváno):
tvrdit add_numbers (a, b) == očekáváno
deftest_add_numbers_with_invalid_inputs(já):
s pytest.raises (TypeError) tak jako exc_info:
přidat_čísla(Žádný, 2)
tvrdit exc_info.value.args[0] == "nepodporované typy operandů pro +: 'NoneType' a 'int'"
Všimněte si, že před název třídy musíte přidat „Test“, aby ji Pytest mohl identifikovat jako testovací třídu a spustit ji.
Pytest má mnohem více funkcí
Pomocí Pytestu můžete automaticky ověřit, že váš kód funguje tak, jak očekáváte. Pytest nabízí mnoho dalších funkcí, jako jsou přípravky, které vám umožňují nastavit a odstranit testovací data a značky pro nastavení metadat vašich testovacích funkcí.
Kromě toho můžete Pytest integrovat do svého kanálu CI a spustit testy automaticky a nepřetržitě, když změníte svůj kód.