Jak začít s pytestem a psát testy, které dávají smysl
Psaní testů patří k základním dovednostem každého vývojáře. V Pythonu je nejrozšířenější knihovnou pytest, která kombinuje jednoduchost se silnými funkcemi. Pokud s ní začínáte, stačí vám znát pár pravidel. Testy se píší jako obyčejné funkce, které začínají slovem test_, a jejich návratová hodnota se kontroluje pomocí příkazu assert. Žádné třídy ani dědičnost nejsou nutné, pytest si sám najde soubory a funkce podle pojmenování.
Pro samotnou správu závislostí používejte nástroj, který umožňuje uzamčení přesných verzí, nejen rozsahů. Vždy verzujte soubor se závislostmi, ať už se jedná o manifest nebo lockfile. Tento soubor by měl být součástí každého commitu, aby byla reprodukovatelnost buildů zaručena. Při aktualizaci knihovny pak postupujte podle principu nejmenšího kroku: nejprve aktualizujte opravné verze, otestujte, pak vedlejší a nakonec hlavní. Pamatujte, že aktualizace hlavní verze často znamená změnu chování, ne jen nové API. Proto si před takovým krokem vždy načtěte changelog a porovnejte rozdíly mezi verzemi.
Verzování kódu často začíná jako jednoduchá záležitost: commit, tag, release. Jakmile ale projekt začne používat více knihoven, které se vyvíjejí vlastním tempem, přestává stačit intuitivní přístup. Než se pustíte do samotné implementace, je nutné si ujasnit, jaké úrovně verzí vlastně potřebujete. Máte interní knihovny, které sdílíte mezi týmy, a zároveň externí závislosti? Pro každou úroveň pak platí jiná pravidla. Klíčové je oddělit verzi aplikace od verzí jednotlivých knihoven – jinak se brzy ztratíte v tom, která kombinace vlastně produkuje funkční celek.
Na závěr si osvojte návyk, že před každým vydáním aplikace provedete kontrolu všech závislostí. To znamená nejen ověřit, že existují novější verze, ale hlavně že aktuální kombinace je testovaná a stabilní. Pokud narazíte na problém, vraťte se k matici kompatibility a zjistěte, která změna způsobila kolizi. Pak už jen stačí rozhodnout, jestli budete aktualizovat obě knihovny současně, nebo si vystačíte s opravou v jedné z nich. Tento postup vám ušetří hodiny hledání chyb v produkci a udělá z verzování předvídatelný proces.
Na co si dát pozor při psaní testů Nejčastější chybou bývá testovat implementaci místo chování. Pokud test kontroluje, jak přesně funkce interně pracuje, stává se křehkým a každá změna kódu ho rozbije, i když je výsledek stále správný. Testujte tedy vstupy a výstupy, nikoliv vnitřní proměnné. Dalším častým problémem je používání reálných časů, náhodných hodnot nebo síťových volání přímo v testech – takové testy jsou pomalé a někdy i nespolehlivé. Řešením je tyto závislosti nahradit falešnými objekty, tzv. mocky, nebo alespoň testovat s pevně stanovenými daty.
Základní struktura projektu je jednoduchá: testy umístěte do adresáře tests a pojmenujte soubory test_nazev.py. Spuštění probíhá příkazem pytest v kořenovém adresáři. Pytest automaticky sbírá soubory začínající na test_ a funkce v nich. Pro první test stačí napsat funkci s assert, která porovná očekávaný výsledek se skutečným. Pokud test selže, pytest vypíše podrobné informace o tom, co se neshoduje, takže chybu rychle najdete.
Na závěr si osvojte práci s historií a sdílením. Historie požadavků vám umožní vrátit se k dřívějšímu volání, aniž byste ho museli znovu sestavovat. Pro týmovou spolupráci využijte možnost exportovat kolekci do sdíleného souboru nebo ji propojit s verzovacím systémem. Vyhnete se tak nesrovnalostem mezi členy týmu. Pamatujte také na to, že každý požadavek by měl mít popisný název a komentář, což oceníte při zpětné analýze.
Když v jednom projektu kombinujete více jazyků, narazíte na dvě základní úskalí: udržení konzistence terminologie a správu překladů bez zbytečné duplicity. Nejprve si proto definujte, které části kódu, dokumentace nebo uživatelského rozhraní budou jazykově závislé. Oddělte je do samostatných souborů nebo modulů, ať nemusíte při změně textu zasahovat do logiky aplikace. Ideální je vytvořit si složkovou strukturu, kde každý jazyk má vlastní adresář, ale sdílí stejné klíče pro překlady.
Nakonec si osvojte psaní testů jako běžnou součást vývoje. Když přidáváte novou funkci, napište testy dřív, než ji implementujete – tato technika se nazývá testování řízené vývojem (TDD). Pomůže vám to lépe promyslet návrh a vyhnout se zbytečným chybám. pytest je nástroj, který vám v tom pomůže, ale klíčová je vaše disciplína a pochopení, co testujete a proč.
Psaní testů bývá často odkládáno na později, ale s knihovnou pytest se z něj stane překvapivě rychlá a příjemná činnost. Na rozdíl od složitějších frameworků nabízí pytest jednoduchou syntaxi, která nevyžaduje psát třídy ani dědit z testovacích základů. Stačí obyčejné funkce, které začínají slovem test_, a pytest je automaticky najde a spustí. Díky tomu se dá testování naučit za odpoledne a postupně ho zapojit do běžného vývoje.