Než napíšeš další test, ověř si reducery bez integračního prostředí

U integračních testů se zaměřte na hranice systému: přístup k datům, komunikaci s externími službami a serializaci. Používejte skutečnou databázi, ideálně stejnou, jakou běží v produkci, ale s oddělenými testovacími daty. Nepodvádějte s transakcemi, které se po testu rollbackují — to sice zrychlí běh, ale neodhalí problémy s únikem spojení nebo s čistěním dat. Pro end-to-end testy vyberte jen ty nejdůležitější uživatelské cesty, třeba registraci, objednávku nebo úhradu. Více než deset takových testů začíná být neudržitelných.

Naopak REST je skvělý pro jednoduché, stabilní operace, které se často opakují. Pokud poskytujete veřejné API s jasně definovanými zdroji, jako jsou články, uživatelé nebo produkty, a klienti mají standardizované potřeby, REST je přehlednější. Snadno se verzuje, testuje a každý endpoint má jasný účel. Navíc se REST opírá o HTTP metody, což znamená, že automaticky dostáváte cachování, status kódy a další standardní mechanismy. To oceníte zejména u velkých systémů, kde je výkon a jednoduchost klíčová.

Prvním kritériem je povaha dat a jejich vztahů. Pokud máte hierarchická data nebo propojené entity, kde klient potřebuje různé podmnožiny polí, GraphQL vám ušetří spoustu práce. Klient si totiž požádá přesně o to, co potřebuje, a vy se nemusíte trápit s tvorbou desítek endpointů pro každou variantu. Typickým příkladem je mobilní aplikace, která potřebuje jen jméno a e-mail, zatímco webová verze chce i adresu a historii objednávek. S REST byste museli vytvořit dva endpointy nebo posílat zbytečně velká data.

Testování reducerů a async akcí v Reduxu obvykle evokuje nasazení celého integračního prostředí, ale často stačí čisté unit testy. Klíčové je zaměřit se na čisté funkce, které nemají vedlejší efekty. Reducer je čistá funkce, takže ho testujete jako každou jinou: vytvoříte výchozí stav, zavoláte akci a porovnáte výsledek. Pro async akce (thunky) potřebujete mockovat závislosti, ale ne celý Redux store.

Jak začít: pravidlo čtyř vrstev Nemusíte hned testovat všechno. Začněte u jádra aplikace — tam, kde sídlí nejvíce byznys logiky. Napište nejdřív testy pro nejrizikovější části, ne pro triviální gettery. U jednotkových testů si dejte pozor na přehnané mockování: když musíte nastavit deset mocků, abyste otestovali jednu metodu, je to signál, že je kód příliš provázaný, ne že píšete dobré testy. Ideální jednotkový test má jasný vstup, deterministický výstup a nezávisí na datech z reálné databáze.

Nakonec se naučte základy verzovacích nástrojů a psaní jednoduchých skriptů. Neznamená to, že musíte umět programovat jako vývojář. Ale schopnost procházet protokoly, spustit jednoduchý automatizovaný test nebo se zorientovat v terminálu je dnes téměř nezbytná. I kdybyste se chtěli věnovat pouze manuálnímu testování, tato dovednost vás odliší od ostatních uchazečů. Zkuste si najít online kurz, kde si vytvoříte vlastní mini projekt a propojíte ho s testovacími nástroji. S takovou přípravou už nejste úplný nováček.

Častým oříškem je testování více akcí, které běží paralelně. Místo reálného časovače použijte fake timers, abyste mohli řídit průběh Promise. Pomocí await vi.runAllTimersAsync() nebo podobné funkce simulujete dokončení asynchronních operací. Bez toho testy visí na reálném čase, což vede k flaky výsledkům. Nezapomeňte také na testování akcí, které nejsou thunky, ale jen obyčejné akce – ty se testují triviálně, jen jako tovární funkce vracející objekt.

Testovací pyramida bývá nejčastěji vykreslována jako tři patra: široká základna jednotkových testů, uprostřed testy integrační a na vrcholu malý počet testů end-to-end. Tahle představa je užitečná, ale v praxi ji týmy často berou příliš doslova. Mnohem lepší je chápat ji jako poměr rychlosti, spolehlivosti a nákladů na údržbu. Pokud testy v základně začnou zabíhat pomalu nebo se stanou křehkými, pyramida se deformuje a přestává plnit svůj účel.

Nejprve si připravte testovací prostředí bez integračních nástrojů. Použijte knihovnu jako Vitest nebo Jest, které umožňují simulovat dispatch a getState. Místo reálného store si vytvořte malou funkci, která napodobuje chování thunku: zavolá dispatch, počká na Promise a vrátí výsledek. Tím odpadá nutnost konfigurovat Redux DevTools nebo middleware, protože testujete pouze logiku akce.

Zásadní je také udělat z testů součást vývojového workflow, ne něco, co se spouští příležitostně. Zařaďte rychlé jednotkové testy do pre-commit hooků, integrační testy do CI po pushnutí a end-to-end testy do nočního běhu. Udržujte časy běhu pod kontrolou: když vám jednotkové testy trvají deset sekund, je to v pořádku, ale když pět minut, začněte je paralelizovat. Když se test stane nestabilním, raději ho přeskočte a opravte, než abyste ho mazali — ale mějte seznam takových přeskočených testů, aby se na ně nezapomnělo.

If you enjoyed this short article and you would like to get more information regarding další informace kindly see the webpage.

Scroll to Top