První unit test krok za krokem: praktický návod
Základem každého testu je struktura AAA – Arrange, Act, Assert. V první fázi připravíte vstupní data, ve druhé zavoláte testovanou funkci a ve třetí porovnáte výsledek s očekáváním. Většina začátečníků dělá chybu, že všechny tři fáze smíchá dohromady. Test pak není čitelný a při jeho selhání nevíte, co se vlastně pokazilo. Držte se jednoduchého pravidla: jeden test = jedno chování. Pokud potřebujete ověřit pět věcí, napište pět testů.
Mezi časté chyby patří testování reducí přes celý store, což zbytečně zapojuje middleware a komplikuje ladění. Dále se stává, že testeři zapomenou na asynchronní povahu thunků a test skončí dřív, než se dispatch dokončí – vždy počkejte na promise. Také se vyplatí testovat akce, které používají getState, protože můžete snadno přehlédnout závislost na konkrétním stavu. Vždy si připravte mock getState s přesně tím stavem, který akce očekává, a ověřte, že z něj správně čte.
Na závěr si uvědomte, že odhad není závazek, ale pracovní hypotéza. Pokud se realita výrazně liší, komunikujte to včas a upravte plán. Díky tomu se váš odhad stane užitečným nástrojem pro plánování, nikoli zdrojem stresu. Postupem času a sběrem dat se vaše čísla stanou spolehlivějšími a tým získá důvěru v to, že odhady mají smysl.
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.
Častou chybou je odhadování „optimisticky" – tedy jen na základě čistého kódování bez přestávek, přepínání mezi úkoly nebo učení se nové technologie. Přepnutí kontextu stojí v průměru 10–15 minut, a pokud během dne přepnete desetkrát, ztratíte až dvě hodiny. Dále počítejte s časem na ladění a testování, které obvykle tvoří 20–30 % čistého času vývoje. Pokud tyto položky nepřidáte, odhad bude nepoužitelný.
Praktický postup začíná nastavením testovacího prostředí – stačí vám testovací běžec (např. Vitest nebo Jest) a knihovna pro testování redux logiky, pokud chcete mít po ruce helpery. Pro async akce si připravte mock funkce pro dispatch, která zaznamenává všechny volání do pole. Poté voláte async akci, počkáte na dokončení a porovnáte očekávané akce. Tento přístup nevyžaduje žádné integrační prostředí, protože nepotřebujete renderovat komponenty ani komunikovat se skutečným backendem. Vyhnete se tak nestabilitě testů a zrychlíte jejich běh.
Commit a kontrola historie Když máte soubory připravené, vytvořte commit pomocí git commit -m "popis změn". Zpráva by měla být krátká a vystihovat, co jste změnili – to se vám bude hodit při procházení historie. Pro zobrazení seznamu commitů použijte git log. Uvidíte hash (identifikátor), autora, datum a zprávu. Užitečný je také příkaz git status, který ukazuje, které soubory jsou změněné a které ještě nebyly přidány. Pokud omylem provedete commit s chybou, můžete jej opravit příkazem git commit --amend, který upraví poslední commit.
Testování Redux logiky nemusí být nutně svázané s nasazením celé aplikace. Reducery i async akce lze ověřit izolovaně, rychle a spolehlivě – stačí k tomu správně nastavené unit testy. Není potřeba spouštět celý React strom, mockovat HTTP požadavky ani obcházet CORS. Tento přístup vám dá okamžitou zpětnou vazbu a usnadní údržbu stavové logiky.
Při odhadu času na vývojový úkol se často soustředíme na viditelné činnosti – psaní kódu, tvorbu databáze nebo nastavení serveru. Skryté činnosti, jako jsou schůzky, e-mailová komunikace, code review nebo řešení neočekávaných chyb, však mohou tvořit až polovinu celkového času. Pokud je do odhadu nezahrnete, stanete se obětí vlastních slibů a termínů.
Praktickým nástrojem je tzv. „buffer" (rezerva). Do odhadu zahrňte tři úrovně rezervy: na chyby, na komunikaci a na změny požadavků. Například odhad čistého času 10 hodin: přidáte 20 % na chyby, 15 % na komunikaci a 10 % na změny. Výsledek: 10 + 2 + 1,5 + 1 = 14,5 hodiny. Rezerva není zbytečná – je to poctivý odhad rizik. Klient nebo vedení by měli vědět, že tato rezerva je součástí odhadu, a ne položkou navíc.
Na závěr: izolované testy reducers a async akcí vám dají jistotu, že stavová logika funguje, aniž byste potřebovali složité testovací prostředí. Stačí dodržet zásady čistých funkcí, mockovat async volání a věnovat pozornost okrajovým případům. Tento postup je rychlý, udržitelný a snadno se integruje do CI. Pokud narazíte na problém, vraťte se k základům – pravděpodobně jde o špatně definovaný mock nebo chybějící await v testu.