Pytest vs unittest: který přístup k testům zvolit

Aus Rettungsdienst-Wiki
Zur Navigation springen Zur Suche springen

Většina týmů se zasekne na tom, že každý člen pracuje přímo v hlavní větvi. Výsledkem jsou konflikty, přepsaná práce kolegy a hodiny strávené nad hledáním, kdo co rozbil. Řešení není složité: zaveďte krátké větve pro každou změnu a hlavní větev držte vždy funkční. Větev by měla žít maximálně dva dny. Čím déle ji držíte otevřenou, tím větší je riziko, že se vzdálí od zbytku kódu a sloučení bude bolet.

Na co si dát pozor: testy nesmí záviset na pořadí ani na datech, která zůstala z předchozího běhu. Pokud test zapisuje do souboru nebo do databáze, musí po sobě uklidit, jinak druhý běh selže z nesouvisejícího důvodu. Dále se vyhni volání skutečné sítě a externích služeb – nahraď je pomocí monkeypatch nebo jednoduchých fake objektů. Test, který padá kvůli výpadku cizí služby, přestane lidi bavit. A když test selže, nespravuj rovnou kód – nejdřív si přečti výpis, protože často je chyba v očekávané hodnotě, ne v logice.

Testování v Pythonu bývá první věc, kterou začátečník odkládá, protože se zdá jako práce navíc. Jenže právě pytest je navržený tak, aby se psaní testů podobalo psaní běžných funkcí. Žádné třídy, žádné speciální metody, žádné importy z unittest. Nainstaluje se jedním příkazem a spustí se příkazem pytest v adresáři projektu. To je celé nastavení.

Nikdy neslibujte termín, který jste si neověřili. Typická chyba je říct „to bude hotové do týdne" hned na prvním callu. Lepší je říct: „Odhaduji to na týden, ale potřebuji si projít zadání a do zítra vám potvrdím, jestli to platí." Tím získáte čas a zákazník ocení, že nejste unáhlený. Pokud termín potvrdíte až po analýze, máte větší šanci ho dodržet.

Na závěr: začni jedním testem pro funkci, kterou právě píšeš. Spusť ho, uvidíš červenou, oprav kód, uvidíš zelenou. Teprve pak přidej další. pytest není něco, co se nasazuje na hotový projekt; je to nástroj, který mění způsob, jakým o kódu přemýšlíš během psaní.

Na konci každé schůzky shrňte dohodu písemně. Stačí tři věty: co dodáte, do kdy a co k tomu potřebujete. Tím se vyhnete nedorozumění. Pokud zákazník trvá na nereálném termínu, řekněte jasně, co se stane, když ho přijmete: buď to bude mít vliv na kvalitu, nebo na jiné zakázky. Nechte ho rozhodnout. Odpovědnost za rozhodnutí pak nesete společně.

Python nabízí dva hlavní přístupy k testování: vestavěný modul unittest a knihovnu pytest. Zatímco unittest vychází z Javy a vyžaduje třídy a dědičnost, pytest stojí na jednoduchých funkcích a assertech. Rozdíl se projeví hned na prvním testu. V unittest napíšete metodu uvnitř třídy odvozené od TestCase a porovnání řešíte přes self.assertEqual. V pytestu stačí funkce a běžný příkaz assert. To je důvod, proč si pytest získal širokou oblibu.

Typická chyba je snaha vyřešit všechno na místě. Tým vybere pět problémů, u každého se dohodne úkol a za týden není hotové nic. Lepší je vzít jeden až dva konkrétní kroky, určit, kdo je udělá, a na příští schůzce začít tím, jestli se povedly. Pokud se opakovaně nedaří ani jeden krok, není problém v retrospektivě, ale v prioritách nebo v kapacitě týmu. To je legitimní zjištění, které patří na stůl, ne pod stůl.

Když se termín posouvá, řekněte to co nejdřív. Nečekejte, až bude pozdě. Zákazník nesnáší překvapení na poslední chvíli. Napište krátkou zprávu: „Narazili jsme na X, zpoždění bude Y dní, navrhuji Z." Vždy nabídněte řešení, ne jen problém. Můžete zkrátit rozsah, dodat část a zbytek později, nebo přidat zdroje. Zákazník pak vidí, že situaci řešíte, ne že se vymlouváte.

Odhady času jsou nejčastější zdroj konfliktů se zákazníky. Ne proto, že bychom neuměli pracovat, ale protože slibujeme termíny, které nedokážeme dodržet. Zákazník pak ztrácí důvěru a vy ztrácíte zakázku. Řešení není v lepším plánování, ale v lepší komunikaci. Tady je postup, jak mluvit o čase tak, aby to fungovalo.

Fixtures místo kopírování přípravy Jakmile testů přibude, začne se opakovat příprava – vytvoření databáze, načtení konfigurace, přihlášení klienta. Řešením jsou fixtures. Dekorátor @pytest.fixture označí funkci, jejíž návratovou hodnotu lze předat jako argument do testu. pytest ji zavolá před testem a uklidí po něm, pokud definuješ i kód pro úklid přes yield. Fixture mohou mít různé rozsahy – function, module, session – a je snadné je omylem nastavit příliš vysoko a způsobit, že se stav mezi testy míchá. Drž se výchozího rozsahu function, dokud nemáš měřený důvod pro jiný.

Parametrizace je druhá věc, kterou pytest zvládá lépe než ruční smyčky. Dekorátor @pytest.mark.parametrize předá testu několik sad vstupů a očekávaných výstupů. Každá sada se hlásí jako samostatný test, takže při pádu vidíš konkrétní kombinaci. Typická chyba je dávat do parametrů příliš mnoho odpovědnosti – test pak ověřuje pět věcí najednou a jeho selhání se špatně čte. Rozděl ho raději na dva menší.