První unit test krok za krokem: praktický návod
Psaní prvního unit testu vypadá jako jednoduchý úkol, ale často skončí u frustrace a testů, které nic netestují. Nejde o to napsat co nejvíce kódu, ale pochopit, co chcete ověřit. Začněte u nejmenší funkce, která něco vrací a nemá vedlejší efekty. Ideální je čistá funkce, která ze stejného vstupu vždy vrátí stejný výstup. Než začnete psát test, položte si otázku: Co přesně má tato funkce dělat a co by se stalo, kdyby to nedělala?
Začněte tím, že si definujete tři oblasti, na které se budete ptát: co funguje, co nefunguje a co bychom chtěli zkusit. Tyto oblasti napište na tabuli nebo do sdíleného dokumentu a dejte každému 5–10 minut na tiché zapsání svých postřehů. Teprve poté otevřete diskusi. Tento postup zabrání tomu, aby se první řečník stal hlavním tématem a ostatní se k němu jen přidávali. Každý bod pak procházejte jednotlivě a ptejte se: „Co konkrétně jsi tím myslel?" nebo „Jak to vidíš, že bychom to mohli změnit?"
Když píšete kód, rozhodujete o tom, jak se uživatelé budou cítit. UI/UX design není jen o barvách a tlačítkách, ale o tom, jak lidé systém používají. Jako vývojář máte výhodu: můžete okamžitě převést návrh do funkčního prototypu a testovat ho. Začněte tím, že si osvojíte základní principy: konzistenci, hierarchii a zpětnou vazbu. Konzistence znamená, že podobné prvky vypadají a chovají se stejně. Hierarchie určuje, co je na obrazovce důležité. Zpětná vazba pak dává uživateli vědět, že se něco děje – třeba změnou barvy tlačítka po kliknutí.
Typickou chybou je, že vývojář po merge větve pokračuje dál v práci na jiných úkolech, ale zapomene smazat starou větev. To vede k hromadění mrtvých větví, které znepřehledňují repozitář. Větve, které jsou už začleněné, okamžitě mažte. Pokud potřebujete pracovat na stejném úkolu později, je lepší vytvořit novou větev z aktuálního mainu, než se vracet ke staré. Tím se vyhnete tomu, že by se do nové větve dostaly zastaralé změny, které už byly mezitím upraveny.
Nakonec se zaměřte na pojmenování testů. Název by měl popisovat očekávané chování, ne název funkce. Místo testAdd() pište testAddReturnsSumOfTwoNumbers nebo testAddThrowsWhenInputIsNegative. Když test selže, hned z názvu víte, co se rozbilo. Pokud máte problém vymyslet název, pravděpodobně nerozumíte tomu, co funkce dělá. V takovém případě se vraťte o krok zpět a nejprve si ujasněte chování. První test nemusí být dokonalý, ale musí být poctivý. Jakmile jednou projdete celým procesem, další testy půjdou rychleji.
Při psaní prvního testu se také vyplatí myslet na okrajové případy. Prázdný vstup, nulová hodnota, extrémně velké číslo nebo prázdný řetězec. Tyto případy často odhalí chyby, které běžné použití neukáže. Začněte s jedním šťastným scénářem, ale hned poté přidejte test pro neplatný vstup. Funkce by měla selhat elegantně, ne spadnout s nesrozumitelnou výjimkou. Pokud testujete funkci, která dělí, přidejte test pro dělení nulou. Pokud parsujete text, otestujte prázdný řetězec.
Jak mockovat závislosti a ověřit dispatch Použijte knihovnu pro testování, jako je Jest, ale princip funguje stejně i v jiných prostředích. Vytvořte si fiktivní store pomocí redux-mock-store, který zaznamenává všechny dispatchované akce. Do thunku pak vložíte funkci, která místo API vrátí předem definovaný objekt. Po zavolání akce zkontrolujete, jestli se v seznamu akcí objevily ty, které očekáváte. Nezapomeňte na asynchronní povahu: počkejte na dokončení pomocí async/await nebo Promise.resolve, jinak test skončí dřív, než se akce stihnou odeslat.
Třetí problém nastává, když test závisí na pořadí provedení nebo na sdíleném stavu. Unit testy musí být izolované a spustitelné v libovolném pořadí. Pokud váš test potřebuje databázi, soubor nebo síť, není to unit test, ale integrační test. Pro začátek se těmto závislostem vyhněte úplně. Pokud testovaná funkce používá čas, náhodu nebo externí službu, naučte se tyto závislosti předávat jako parametry. Tím získáte kontrolu nad vstupem a test bude deterministický.
Další praktický nástroj je metoda „Start – Stop – Continue". Každý člen týmu napíše jednu věc, kterou bychom měli začít dělat, jednu věc, kterou bychom měli přestat dělat, a jednu věc, kterou bychom měli dělat dál. Tyto tři kolonky pak slouží jako základ pro konkrétní akční kroky. Ke konci si vyberte jeden návrh z každé kolonky a přiřaďte k němu odpovědnou osobu a termín. Bez tohoto kroku zůstane retrospektiva jen povídáním a za dva týdny se vše vrátí do starých kolejí.
Jak bezpečně začlenit hotovou větev a nerozbít main Než začnete větev začleňovat, ujistěte se, že prošla testy a kontrolou kódu. Mnoho týmů používá takzvaný „pull request" s povinnou revizí od jiného vývojáře. Tím se výrazně snižuje riziko, že se do mainu dostane chyba. Před merge je také vhodné provést rebase a po něm spustit testy znovu, protože po přepsání historie se může chování změnit. Pokud používáte merge commit, držte ho vždy jako poslední a neprovádějte žádné další úpravy do větve po začlenění.