První unit test krok za krokem: praktický návod
Jednou z nejužitečnějších funkcí Gitu je možnost vracet se zpět. Pokud chcete vrátit změny v souboru, který ještě nebyl commitnut, použijte git checkout -- soubor.txt. Tím se soubor vrátí do stavu z posledního commitu. Pokud jste již provedli commit a chcete jej zrušit, použijte git revert – ten vytvoří nový commit, který změny z předchozího vrátí zpět. Vyhnete se tak přepisování historie, což je důležité, pokud s projektem pracuje více lidí.
Na co si dát pozor při psaní testů Nejčastější chybou bývá testovat implementaci místo chování. Pokud test kontroluje, jak přesně funkce interně pracuje, stává se křehkým a každá změna kódu ho rozbije, i když je výsledek stále správný. Testujte tedy vstupy a výstupy, nikoliv vnitřní proměnné. Dalším častým problémem je používání reálných časů, náhodných hodnot nebo síťových volání přímo v testech – takové testy jsou pomalé a někdy i nespolehlivé. Řešením je tyto závislosti nahradit falešnými objekty, tzv. mocky, nebo alespoň testovat s pevně stanovenými daty.
Na závěr si vyzkoušejte rozšíření programu: přidejte dotaz na věk a vypište ho společně s pozdravem. Tím si procvičíte práci s číselnými datovými typy, jako je int. Pozor na to, že Console.ReadLine() vrací vždy řetězec, takže věk budete muset převést pomocí int.Parse() nebo bezpečnějšího int.TryParse(). Druhá metoda je vhodnější, protože nezpůsobí výjimku, když uživatel zadá neplatný vstup. Toto cvičení vám pomůže pochopit, jak funguje převod mezi typy, a to je základ pro každou složitější aplikaci.
Časté chyby, které vás připraví o smysl testů První typická chyba je testování implementace místo chování. Když testujete, že funkce volá jinou funkci s určitými argumenty, svazujete si ruce pro budoucí refaktoring. Test by měl selhat pouze tehdy, když se změní výsledek, ne když se změní vnitřní struktura kódu. Druhá častá chyba je psaní testů, které projdou i bez testované funkce. Typicky jde o testy, které kontrolují jen to, že funkce nevyhodí výjimku, ale nekontrolují návratovou hodnotu. Takový test je k ničemu.
Když testy začnete spouštět častěji, oceníte výběr testů podle názvu nebo značky. Pytest umožňuje spouštět jen vybrané soubory, funkce nebo celé adresáře. Lze také vynechat pomalé testy pomocí značek a spouštět je zvlášť. To se hodí, když máte testy, které vyžadují databázi nebo externí služby – ty pak nemusíte pouštět při každé změně kódu, ale jen před nasazením.
Psaní prvního unit testu vypadá jako jednoduchý úkol, ale často skončí u frustrace a testů, které nic netestují. Nejde o to napsat co nejvíce kódu, ale pochopit, co chcete ověřit. Začněte u nejmenší funkce, která něco vrací a nemá vedlejší efekty. Ideální je čistá funkce, která ze stejného vstupu vždy vrátí stejný výstup. Než začnete psát test, položte si otázku: Co přesně má tato funkce dělat a co by se stalo, kdyby to nedělala?
Psaní testů bývá často odkládáno na později, ale s knihovnou pytest se z něj stane překvapivě rychlá a příjemná činnost. Na rozdíl od složitějších frameworků nabízí pytest jednoduchou syntaxi, která nevyžaduje psát třídy ani dědit z testovacích základů. Stačí obyčejné funkce, které začínají slovem test_, a pytest je automaticky najde a spustí. Díky tomu se dá testování naučit za odpoledne a postupně ho zapojit do běžného vývoje.
Na závěr si zvykněte testy psát průběžně, ne až na konci projektu. Začněte s jednoduchou funkcí a postupně přidávejte další. Pokud narazíte na chybu, napište nejdříve test, který ji reprodukuje, a teprve poté opravujte kód. Tento postup vám ušetří spoustu času a zajistí, že se chyba už nevrátí. Až si osvojíte základy, podívejte se na pokročilejší funkce pytestu, jako jsou fixture s rozsahem, conftest.py nebo pluginy – ale to už je jiný příběh.
V praxi pomáhá kombinace: použijte SQL pro části aplikace, které vyžadují komplexní vztahy a transakce, a NoSQL pro objemová a flexibilní data. Například e-shop může mít objednávky v SQL, ale katalog produktů s mnoha atributy v dokumentové databázi. Takové oddělení usnadní škálování i údržbu. Před nasazením si ale vždy připravte vývojové prostředí s ostrými daty a otestujte si chování při výpadku uzlu – to je okamžik, kdy se projeví rozdíly mezi konzistencí a dostupností. Vyberte si nástroj, který odpovídá vašim požadavkům na správu, monitorování a podporu v týmu, protože kvalitní technologie bez schopného týmu je jen složitý systém.
Relace a tabulky jsou pro spoustu aplikací pohodlné, ale ne vždy představují optimální řešení. Když narazíte na objemy dat, které přesahují možnosti jednoho serveru, nebo na datový model, který se do tabulek nevejde bez krkolomných konstrukcí, je na místě se porozhlédnout po NoSQL. Nemusí jít hned o kompletní přepis systému; stačí pochopit, kde jsou hranice klasického SQL a co nabízí alternativní přístupy.