Jak správně strukturovat testy pomocí testovací pyramidy

From Rikkiepedia
Jump to navigation Jump to search

Práce na projektu, který kombinuje více programovacích jazyků, je dnes běžná. Typická kombinace zahrnuje backend v Javě nebo Pythonu, frontend v TypeScriptu a šablony v HTML s CSS. Když si ale neupravíte vývojové prostředí, čeká vás peklo s přepínáním kontextů, špatným zvýrazňováním syntaxe a nefunkčním doplňováním kódu. Základem je pochopit, že IDE není univerzální nástroj, ale skládačka, kterou musíte vědomě poskládat pro každý jazyk zvlášť.

Testovací pyramida není jen módní pojem, ale praktický nástroj, který vám pomůže udržet náklady na testování pod kontrolou a zároveň zajistit vysokou kvalitu kódu. Mnoho týmů ji ale chápe špatně – buď píší příliš mnoho jednotkových testů, nebo naopak spoléhají hlavně na end-to-end testy, které jsou pomalé a křehké. V tomto článku si ukážeme, jak pyramidu skutečně využít v každodenní práci.

Druhým častým problémem je formátování. Pokud máte v jednom projektu Python a JavaScript, každý má jiný standard (například PEP 8 a Prettier). V nastavení IDE si pro každý jazyk definujte příslušný formátovač a zapněte „format on save". Pozor na konflikt s automatickým importem – často se stává, že IDE vloží import z jiného jazyka, což způsobí chybu. Řešením je zakázat automatické importy v souborech, které nepatří do daného jazyka.

Na co si dát pozor: nepište testy jen pro pokrytí kódu – pokrytí 80 % je k ničemu, pokud testujete jen triviální větve. Zaměřte se na rizikové části aplikace. Také se vyvarujte testovacích dat, která jsou závislá na pořadí spuštění. Každý test by měl fungovat samostatně a připravovat si vlastní data. A pokud vaše end-to-end testy selhávají náhodně, nestrkejte hlavu do písku – opravte příčinu, jinak ztratíte důvěru v celou sadu.

Při růstu codebase sledujte dva varovné signály: když jednotkové testy začnou vyžadovat složité mockování (např. pět úrovní mocků), je to známka špatné architektury – testy vás tlačí k refaktoringu. Když integrační testy začnou být pomalé a nestabilní (flaky), rozdělte je podle domén nebo použijte testovací kontajnery, ale neodstraňujte je. Důležité je také testy pravidelně profilovat – pokud jeden integrační test trvá minutu, zatímco ostatní sekundy, podívejte se, jestli nezpůsobuje zbytečné čekání na síti nebo na disku.

Nejčastější chyby v praxi a jak se jim vyhnout První chybou je psát jednotkové testy, které testují implementaci, ne chování. Když pak změníte vnitřní strukturu metody, testy se zbytečně rozpadnou. Zaměřte se na vstupy a výstupy, ne na to, jak je funkce napsaná. Druhým problémem je přehnané používání mocků – pokud mockujete vše, test pak neověřuje skutečnou spolupráci, ale jen vaše předpoklady. Používejte mocky jen pro hranice systému, jako je databáze nebo externí API.

Praktický postup: začněte u jednotkových testů pro kritické obchodní logiky (např. výpočty, validace). Poté přidejte integrační testy pro práci s databází a propojení s dalšími službami. End-to-end testy si nechte až na konec – a to jen pro hlavní cesty, jako je přihlášení, vytvoření objednávky nebo placení. Dbejte na to, aby každý test byl nezávislý a rychlý – pomalá sada testů demotivuje a tým ji přestane spouštět.

Jak najít poměr, který dává smysl Místo striktního pravidla 70/30 se zaměřte na kritičnost a rychlost. Každý test, který běží déle než vteřinu, by měl být integrační a měl by pokrývat skutečný uživatelský scénář. Jednotkové testy si nechte pro algoritmy, validace, výpočty a transformace dat – tam, kde je chyba drahá a kde chcete rychlou zpětnou vazbu. Pro začátek si vypište deset nejdůležitějších toků aplikace (např. registrace, platba, export dat) a pro každý napište jeden integrační test. Okolo toho pak stavte jednotkové testy pro všechny větve a hraniční případy, které v těchto tocích existují.

V praxi se osvědčuje zavést tři úrovně testů: rychlé jednotkové (spouštěné při každé změně), středně rychlé integrační (spouštěné v CI před mergem) a pomalé end-to-end (spouštěné jen před releasem). Tím zajistíte, že vývojář dostane rychlou zpětnou vazbu, ale zároveň máte jistotu, že klíčové scénáře fungují. Častým omylem je míchat tyto úrovně do jedné sady – pak se testy spouští zbytečně dlouho a vývojáři je začnou obcházet.

Pro praktické cvičení si vytvořte jednoduchou aplikaci, která zobrazuje seznam úkolů. Použijte SwiftUI a @State pro správu dat. Přidejte možnost přidávat a mazat položky. Tím si osvojíte základní principy: vazbu dat na rozhraní, předávání dat mezi obrazovkami a práci s uživatelským vstupem. Během vývoje narazíte na to, že je nutné řešit i správu souborů nebo ukládání dat. Pro začátek stačí použít UserDefaults pro jednoduché nastavení, ale pro složitější data sáhněte po Core Data nebo SwiftData, které jsou součástí systému.