Jump to content

Pytest: chyba, která vám ukradne hodiny času

From Babylon SIGNALIS Wiki

Co se stane, když podceníte správu závislostí Jakmile začnete přidávat knihovny pro práci se sítí nebo databází, přichází první velká překážka: konflikty verzí. Typická chyba je přidat knihovnu podle vzoru z internetu bez kontroly, zda odpovídá vaší verzi Androidu a minSdk. Výsledkem je pak chyba, že aplikace padá hned po spuštění, nebo dokonce neprojde kompilací. Aby se to nestalo, vždy čtěte dokumentaci knihovny a sledujte, jakou minimální verzi systému vyžaduje. Pokud váš projekt má nižší minSdk, buď ji zvyšte, nebo knihovnu nechte na později. Také se vyhněte zbytečným knihovnám – každá zvyšuje velikost aplikace a prodlužuje čas kompilace.

Aby byly testy přehledné, používejte konvenci pojmenování, která popisuje chování. Například „při úspěšném načtení dispatchneme setUser" nebo „při selhání dispatchneme setError". Tato struktura vám pomůže rychle identifikovat, co test ověřuje. Dále se vyplatí seskupovat testy podle akcí nebo reducerů do samostatných bloků, abyste udrželi pořádek. Pokud máte složitější logiku, zvažte rozdělení reduceru na menší části, které se snadněji testují. Redux vám umožňuje skládat reducery, takže využijte tuto možnost.

Věnujte pozornost také selektorům. Místo toho, abyste veškerou logiku výběru dat nechávali v komponentách, vytvořte si selektory, které z celého stavu vyberou pouze to, co komponenta potřebuje. Díky tomu se vyhnete přepočítávání při každém renderu. Používejte memoizaci, aby se selektor nespouštěl zbytečně, když se stav nezměnil. Pokud selektor vrací nové pole pokaždé, když se stav změní, může to způsobit zbytečné překreslování i tam, kde se data nezměnila.

Druhým krokem je nastavit si projekt správně hned od začátku. Vytvořte si prázdný projekt s prázdnou aktivitou, ne s šablonami, které generují zbytečný kód. Už od prvního dne si zvykněte na verzovací systém, ideálně git, a každou funkční změnu commitujte. Když to neuděláte, po třech dnech práce narazíte na chybu, kterou nebudete schopni vrátit zpět, a to vás bude stát hodiny hledání. Důležité je také používat emulátor – fyzické zařízení je sice rychlejší, ale emulátor vám umožní testovat různé velikosti obrazovek a systémové verze.

Další pastí je testování chybových stavů. Vždy testujte i scénář, kdy API volání selže. Vytvořte mock, který vyhodí chybu, a ověřte, že je dispatchnuta akce pro chybu. Také si dejte pozor na to, abyste nemuseli používat reálné časové prodlevy. Pokud používáte setTimeout, nahraďte ho falešnými hodinami, které test runner poskytuje. Tím se testy stanou deterministické a rychlé. Nezapomeňte také na to, že getState by mělo vracet vždy stejný stav, pokud ho v testu používáte, jinak se snadno stane, že testy začnou být náhodné.

Další praktická rada se týká testování. Nečekejte, až budete mít celou aplikaci hotovou, a začněte psát testy od prvního dne. Nejdřív jednoduché jednotkové testy pro logiku, poté instrumentované testy pro uživatelské rozhraní. Když to odložíte, po měsíci budete mít aplikaci, která funguje, ale žádnou změnu neuděláte bez obav, že něco rozbijete. A když aplikaci vydáte, uživatelé najdou chyby, které jste mohli odhalit dřív. Navíc testy vám pomohou pochopit, jak vaše vlastní třídy fungují, a to je k nezaplacení.

Když už máte základní testy, zamyslete se nad pokrytím okrajových případů. Typicky to jsou prázdné stavy, null hodnoty nebo neočekávané typy akcí. Reducer by měl vždy vrátit aktuální stav, pokud nezná akci. Tento případ testujte, protože mnoho implementací na to zapomíná a vrací undefined. U async akcí zkontrolujte, že dispatch není volán vícekrát, než je nutné, a že se chyby nepolykají. Všechny tyto testy nevyžadují žádné integrační prostředí, jen čistou práci s mocky a funkcí. Po napsání testů je spusťte v prostředí, které nezatěžuje prohlížeč nebo server, a máte hotovo.

Myslete také na kontext. Commitová zpráva není místo pro kompletní dokumentaci, ale měla by obsahovat odkazy na související úkoly nebo čísla ticketů, pokud je to ve vašem týmu zvykem. Důležité je, aby čtenář okamžitě pochopil, k čemu se změna vztahuje. Nepoužívejte ale zkratky bez vysvětlení – „oprava #123" neřekne nic, pokud čtenář nemá přístup k systému. Raději napište „oprava výpočtu daně (ticket #123)".

Začněte krátkým shrnutím v rozsahu maximálně padesáti znaků. Toto shrnutí by mělo vystihovat podstatu změny, ideálně ve formátu „když…, tak…" nebo „aby…". Například „aby se přihlášení nezaseklo, když API vrátí prázdný token" je mnohem užitečnější než „fix login". Dlouhé zprávy rozdělte na více řádků – první řádek je nadpis, další řádky jsou podrobnosti. Většina nástrojů zobrazí jen první řádek, takže ten musí být srozumitelný sám o sobě.