Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

4 návyky, které rozhodují o kvalitě testů v NUnit

From CrabCodex

Jednotná konfigurace projektu není o tom, že všichni mají stejný soubor. Je o tom, že každý spustí projekt stejně, bez ohledu na to, zda pracuje na Windows, macOS nebo Linuxu. Pokud se to nedaří, začnou vznikat rozdíly, které se projeví až ve chvíli, kdy je potřeba něco nasadit nebo opravit. Prvním krokem je ujasnit si, co vše má být sdílené: nastavení editoru, závislosti, formátování kódu, kontejnery, proměnné prostředí, skripty pro build a testy. Ne každá položka patří do repozitáře – některé věci jsou osobní preference a jejich vynucování zbytečně vytváří odpor.

Pro začátek tedy stačí málo: popsat současný tok změny, vybrat jednu aplikaci, zautomatizovat cestu do produkce, zavést měření a domluvit se na společné odpovědnosti. Zbytek je postupné zlepšování, které nikdy nekončí. Kdo slibuje, že DevOps nasadí za týden a hotovo, buď lže, nebo nepochopil, že jde o způsob práce, ne o projekt s koncem.

Pokrytí má smysl jako trend, ne jako absolutní práh. Sleduj, jestli dlouhodobě roste u rizikových částí, a jestli klesá tam, kde se přestává testovat. Pokud číslo stagnuje, ale přibývají chyby úložné prostory v malém bytě produkci, je něco špatně v návrhu testů, ne v jejich počtu. V takové chvíli je lepší investovat do testů integračních a do testů na úrovni chování než do dalšího zvyšování procenta. Pokrytí je nástroj, ne cíl.

Čtvrtý návyk je práce s výjimkami a parametrizací. Pro očekávané výjimky používejte Assert.Throws nebo Assert.That s Throws.TypeOf, nikdy ne obalení do try-catch s prázdným blokem. Parametrizované testy s [TestCase] nebo [TestCaseSource] ušetří desítky metod a zpřehlední hraniční hodnoty. Pozor ale na přílišnou abstrakci: pokud parametr mění i logiku testu, ne jen vstup, patří zvlášť. Nakonec testy pravidelně spouštějte lokálně i v rámci sestavení, jinak ztratí smysl. Test, který se nespouští, je jen komentář s horší syntaxí.

Testování jednotek v C# s NUnit vypadá na první pohled jednoduše: napíšete metodu, ozdobíte ji atributem [Test], spustíte runner a hotovo. Jenže rozdíl mezi sadou testů, která vám vydrží roky, a sadou, kterou po měsíci přestanete spouštět, netkví v syntaxi. Tkví v návycích, které se kolem psaní testů vytvoří. Následující čtyři zásady pokrývají většinu problémů, na které při práci s NUnit narazíte.

Základní dělení je na permisivní a copyleftové. Permisivní licence, jako MIT, Apache 2.0 nebo BSD, dovolují kód použít i v uzavřeném produktu. Copyleftové, jako GPL nebo AGPL, vyžadují, aby odvozené dílo zůstalo pod stejnou licencí. Pokud chcete, aby váš kód někdo zabudoval do placeného programu a nic nemusel zveřejňovat, copyleft je pro vás špatná volba. Pokud naopak chcete, aby se úpravy vrátily komunitě, permisivní licence vám to neuhlídá.

Když si pletete licenci s modelem vývoje Open source není totéž co veřejný repozitář. Kód bez licence není volně použitelný, i když je na očích. Bez explicitní licence platí autorské právo v plné síle a nikdo kromě autora s ním nesmí nic dělat. Další častá záměna je mezi open source a „source available" licencemi, které jen omezují komerční využití. Ty nejsou open source, i když se tak tváří. Přečtěte si vždy celý text licence, ne jen její název.

Třetí návyk se týká asercí. NUnit nabízí Assert.That s omezeními (constraints), která jsou čitelnější a poskytují lepší chybové zprávy než starší Assert.AreEqual. Pište Assert.That(vysledek, Is.EqualTo(5)) a při selhání dostanete přesnou hodnotu očekávanou i skutečnou. U kolekcí použijte Is.EquivalentTo, pokud nezáleží na pořadí, a Is.Ordered, pokud záleží. Častá chyba je testovat více věcí v jednom testu. Když první aserce selže, o zbytku se nic nedozvíte. Rozdělte je do samostatných testů, i když to znamená více metod.

Praktický postup: nejdřív zjistěte, jestli projekt, na kterém stavíte, už nějakou licenci má. Pokud ano, musí být kompatibilní s tou vaší. GPL a Apache 2.0 se například kombinovat nedají. Potom zkontrolujte, jestli nepoužíváte knihovnu s copyleftem v uzavřeném produktu. To je nejčastější právní problém, na který firmy narazí až při auditu. Pokud si nejste jistí, zvolte permisivní licenci a přidejte do repozitáře soubor s jejím plným zněním.

První návyk se týká izolace. Každý test musí být nezávislý na pořadí, v jakém ho runner spustí, a nesmí měnit stav, který ovlivní ostatní testy. V praxi to znamená, že sdílená data nevytváříte v jednorázovém setupu na úrovni třídy, pokud je testy pouze čtou a nikdy nemění. Jakmile test zapisuje do statické kolekce, do souboru nebo do databáze, potřebuje vlastní instanci. NUnit k tomu nabízí atributy [SetUp] a [TearDown], které se volají před a po každém testu, nikoli před a po celé třídě. Záměna těchto úrovní je nejčastější příčina testů, které procházejí samostatně, ale padají ve skupině.