Unit testy reducerů a async akcí: izolovaně, rychle a spolehlivě
Do hlavního kódu si připravte proměnnou typu string pro jméno a pak pomocí Console.ReadLine() načtěte vstup. Pozor na to, že Console.ReadLine() vrací vždy text, takže pokud chcete číslo, musíte ho převést. Například int.Parse(Console.ReadLine()) – ale to je častý zdroj chyb. Když uživatel zadá místo čísla písmeno, aplikace spadne. Proto je lepší použít int.TryParse, která vrátí true nebo false a vy tak můžete ošetřit špatný vstup. Tohle je přesně ten moment, kdy spousta začátečníků propadne frustraci.
Měření pokrytí testy patří mezi nejčastěji používané metriky kvality kódu. Na první pohled vypadá jednoduše: stačí spustit nástroj, který projde zdrojový kód a spočítá, kolik řádků, větví nebo funkcí bylo při testech vykonáno. Výsledek v procentech pak působí jako objektivní ukazatel. Jenže samotné číslo vám neřekne, jestli testy skutečně chrání před chybami, nebo jen mechanicky procházejí kódem. Než začnete hodnoty interpretovat, měli byste vědět, co přesně měříte a kde jsou limity této metriky.
Jak na to: jednoduchá technika Start-Stop-Continue Nejlepší je začít metodou, kterou všichni znají a která nevyžaduje žádné pomůcky. Každý člen napíše na tři sloupce: co by měl tým začít dělat, co přestat dělat a v čem pokračovat. Důležité je pravidlo: každý bod musí být konkrétní, ne obecný komentář. Místo „zlepšit komunikaci" napište „každé ráno 5 minut sdílet, na čem dělám". Pak hlasujte tečkami – každý má tři hlasy na nejpalčivější položky. Vyberte jednu akci z každého sloupce a dohodněte, kdo ji zajistí a do kdy. Tím se vyhnete klasické chybě: retrospektiva skončí, ale nikdo neví, co se bude dít dál.
Začněte tím, že si ujasníte rozdíl mezi testováním na emulátoru a na reálném zařízení. Emulátor je rychlý a levný, ale neodhalí problémy s výkonem, s GPS, s fotoaparátem nebo s citlivostí dotykové obrazovky. Pro prvotní ověření logiky aplikace ho používejte, ale před vydáním vždy testujte na minimálně pěti reálných zařízeních s různými verzemi operačního systému a různým rozlišením.
Nezapomínejte ani na paměť a výdrž baterie. Aplikace, která v pozadí drží náročné procesy, dokáže vybít telefon za hodinu. Sledujte spotřebu energie a paměti pomocí vestavěných profilovacích nástrojů ve vývojovém prostředí. Pokud zjistíte, že aplikace drží více než 100 MB paměti při minimálním používání, pravděpodobně máte únik paměti, který se projeví až po delším běhu.
Praktickým přístupem je kombinovat měření pokrytí s analýzou mutací, která do kódu záměrně vnáší chyby a kontroluje, jestli je testy odhalí. Taková zpětná vazba je mnohem cennější než samotné procento. Udržujte pokrytí jako orientační ukazatel, ne jako dogma. Pro nový kód si nastavte rozumný minimální limit, ale u staršího kódu ho nezvyšujte násilně. Místo toho postupně doplňujte testy tam, kde dochází k nejčastějším chybám nebo kde je složitá logika. A nezapomeňte, že pokrytí nic neříká o tom, zda testy běží rychle a spolehlivě. Pomalé a flaky testy, které občas selžou bez zjevné příčiny, snižují důvěru v celou sadu, i když pokrytí ukazuje vysoká čísla.
Když procenta rostou, ale chyby zůstávají Narazíte na situace, kdy pokrytí dosahuje vysokých hodnot, ale regrese se stále objevují. Typickou příčinou jsou testy, které ověřují jen implementaci, ne chování. Pokud test volá funkci s předem připravenými daty a kontroluje, že se vrátí očekávaná hodnota, ale neověřuje okrajové případy, chybové stavy nebo interakce s jinými částmi systému, pokrytí řádků bude vysoké a kvalita nízká. Dalším častým problémem je snaha o 100% pokrytí za každou cenu. Vývojáři pak píší testy, které jen procházejí kódem bez reálných asercí, nebo dokonce testy, které uměle zvyšují čísla pomocí volání funkcí bez ověření výsledku.
Pokrytí přestává být užitečné ve chvíli, kdy se stane cílem samo o sobě. Když tým diskutuje o tom, jak zvýšit procento z 85 na 90, místo aby řešil, které rizikové části kódu nejsou otestované, je to varovný signál. Stejně tak když je pokrytí používáno jako jediné kritérium pro schválení pull requestu, vede to k formálním úpravám, které nemají vliv na spolehlivost. Místo honění čísel se zaměřte na testování kritických a často měněných částí. Pokud máte systém s mnoha vnějšími závislostmi, pokrytí řádků u integračních testů vypovídá málo o tom, jestli je spolupráce komponent správná.
Základním krokem je vybrat správný typ pokrytí. Nejčastěji se setkáte s pokrytím řádků, které je snadné spočítat a snadno se prezentuje. Větší výpovědní hodnotu má pokrytí větví, protože odhaluje, jestli byly testovány obě možnosti u podmínek, a pokrytí podmínek, které kontroluje jednotlivé logické výrazy. Pro nový kód si nastavte cíl alespoň pro pokrytí větví; jen řádky vás nechají ve slepé uličce, protože můžete mít 80 % řádků a přitom polovinu rozhodovacích cest netestovanou. Důležité je měřit pokrytí na úrovni jednotek, nikoli jen na úrovni celého systému, a výsledky ukládat do historie, abyste viděli trend.