Důvody, proč psát jednotkové testy

Od Petr Zemek, 2014-06-20

Tento příspěvek je určen především programátorům, kteří zatím nevidí důvod, proč psát jednotkové testy (angl. unit tests). Stručně v něm zmiňuji důvody, kvůli kterým se jednotkové testy vyplatí.

Poznámka na začátek: Jednotkový test testuje zvolenou komponentu (funkce, třída, modul) v izolaci. Pokud komponenta komunikuje s jinými komponentami (čili na nich závisí), tak se většinou místo nich používají náhražky, jako stubs (bez překladu) a mocks (opět bez překladu). Důvodem je, že v jednotkových testech nás zajímá testování pouze jedné komponenty, kdy předpokládáme, že ostatní komponenty, s nimiž ta naše interaguje, fungují korektně. Nemusíme tak řešit chyby jiných komponent. Další výhodou je, že testy pak bývají rychlejší, protože např. místo skutečné databáze používáme třídu, která databázi simuluje. Pro testování více komponent dohromady slouží integrační testy.

Dost bylo řečí na úvod. Mezi důvody, proč psát jednotkové testy, patří z mého pohledu následující:

  • Ověření, že kód funguje tak, jak očekáváte. Když už napíšete kód, tak si chcete ověřit, že funguje tak, jak očekáváte. Právě k tomu lze využít jednotkové testy. Tento důvod jste asi všichni čekali :).
  • Prevence strachu ze změn. Kolikrát se vám již stalo, že jste chtěli změnit kód (oprava, refaktorování), ale měli jste strach, že něco rozbijete? Pokud máte kód pokryt jednotkovými testy, tak tento strach odpadá. Budete se při dělání změn cítit pohodlně, protože když už něco rozbijete, tak se to hned dozvíte.
  • Důvěra ke kódu. S tím, že se již nemusíte bát změn, souvisí taktéž větší důvěra ve váš kód. Jelikož jej máte pokrytý testy, tak máte mnohem větší důvěru, že funguje, než kdyby byl netestovaný.
  • Zamezení opakování chyb (regrese). Když narazíte na chybu, tak je vhodné si na ni hned napsat jednotkový test a pokusit se ji tak reprodukovat. Důvody: (1) Ujistíte, že chyba je tam, kdy se si myslíte. (2) Když se vám podaří test zprovoznit, tak víte, že jste chybu opravili. (3) Tím, že máte ve své sadě tento test si zajistíte, že se tato chyba již nikdy nebude opakovat. Mnohdy se totiž při absenci testů stává, že člověk chybu sice opraví, ale při dalších změnách ji do kódu znovu zavleče. Tím dochází k frustrující situaci, kdy se pořád dokola opakují a opravují tytéž chyby.
  • Automatizace. Místo toho, abyste si ručně spouštěli testy poházené různě po adresářích, se dá běh jednotkových testů snadno automatizovat. Jediným příkazem tak můžete provést překlad a spuštění jednotkových testů, ať už všech, nebo jen zvolené komponenty. Místo toho, abyste prováděli nudné manuální testování, se můžete věnovat vývoji.
  • Rychlý běh. Pokud se držíte toho, že jednotkové testy testují jednotlivé komponenty v izolaci, tak není problém, aby vám během jediné sekundy proběhlo tisíce testů. Jednotkové testy tak lze spouštět pravidelně před každým commitem.
  • Brzké zjištění problémů. Jednotkové testy patří mezi testy na nejnižší úrovni. Tím, že testují přímo dané komponenty, lze při jejich vývoji odhalit chyby velice brzy.
  • Větší produktivita. Z dlouhodobého hlediska jednotkové testy zvyšují produktivitu. Zatímco programátoři, kteří testy nepíšou, stráví většinu svého času neustálou opravou zavlečených chyb, vy se můžete věnovat vývoji nových vlastností (angl. features).
  • Jasně viditelný pokrok. Máte do své třídy přidat novou vlastnost. Napíšete si pro ni testy a vlastnost implementujete. To, že jste hotoví, poznáte snadno: testy vám prochází.
  • Možnost vývoje i přes neexistenci komponent, na kterých vaše komponenta závisí. Dejme tomu, že máte vyvíjet třídu, která ke své práci potřebuje jinou třídu, jež ale ještě nebyla implementovaná. Normálně byste byli nahraní, ale pomocí jednotkových testů a mocků můžete svou třídu implementovat bez čekání. Jednotkové testy totiž testují vaši třídu v izolaci.
  • Snadno testovatelné chování v různých situacích. Pomocí jednotkových testů lze jednoduše otestovat i situace, které by byl problém navodit při reálném běhu. Příkladem mohou být reakce na nejrůznější typy chyb.
  • Využití při reportování chyb. Když reportujete chybu, tak lze rovnou napsat a poslat jednotkový test, který neprochází. Z testu je ihned vidět, jaká je vstupní konfigurace (např. co je vstupem) a co je očekávaný výstup. Dále je hned vidět, kdy je chyba opravena: když test prochází. Programátor, který má danou komponentu na starosti tento způsob reportování chyb velmi ocení.
  • Dokumentace, jak kód používat. Jednotkové testy poskytují v jistém smyslu dokumentaci, jak testovaný kód používat. Pro programátora, kterému není jasné, jak se třída používá, se mohou hodit. Stačí se podívat na testy, z kterých je vidět, jaké je očekávané použití a využití dané třídy.

Pokud znáte další důvody, proč psát jednotkové testy, nezapomeňte se podělit do komentáře!

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.

Filtrované HTML (využíváno)

  • Povolené HTML značky: <a href hreflang> <em> <strong> <cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <table>
  • Zvýraznění syntaxe kódu lze povolit přes následující značky: <code>, <blockcode>, <bash>, <c>, <cpp>, <haskell>, <html>, <java>, <javascript>, <latex>, <perl>, <php>, <python>, <ruby>, <rust>, <sql>, <text>, <vim>, <xml>, <yaml>.
  • Řádky a odstavce se zalomí automaticky.
  • Webové a e-mailové adresy jsou automaticky převedeny na odkazy.
CAPTCHA
3 + 0 =
Vyřešte tento jednoduchý matematický příklad a vložte výsledek. Např. pro 1+3 vložte 4.
Nějak se mi tady rozmohl spam, takže poprosím o ověření.