Unit testing

Wikipedia: Unit testing

Další typy testů

Integration (kombinace různých modulů), GUI (chování grafického rozhraní), installation (postup pro instalaci), regression (ověření předchozích bug fixů, změny konfigurace, apod.), security, atd.

Test-driven development

Vývojový cyklus podle test-driven development:

  1. Přidat test pro novou funkčnost
  2. Spustit všechny testy, nový test samozřejmě selže.
  3. Implementovat co nejjednodušší kód, který zajistí splnění všech testů. (V této fázi nový kód ani nemusí být obecný, může řešit jen konkrétní případ daný testem.)
  4. Ověřit, že všechny testy projdou bez chyb.
  5. Refaktorování kódu dle potřeby. V průběhu pomocí testů ověřovat, že nedošlo ke změně chování.
    • příklady refaktorování:
      • přesun kódu na logičtější místo
      • odstranění duplicitního kódu
      • přejmenování proměnných, funkcí, tříd
      • rozdělení funkcí a metod na menší části (to ale často znamená přidání nového testu, neboť každá funkce či metoda by měla být testovaná samostatně)
      • změna hierarchie dědičnosti mezi třídami
  6. (volitelně) Ověřit kvalitu kódu pomocí programů jako např. clang-tidy a clang-format.
  7. (volitelně) Commitovat změny do systému pro správu kódu (např. git).

Tyto kroky se opakují pro každou novou funkčnost, kterou je třeba v programu implementovat.

Změny a testy by měly být malé a inkrementální a commitované samostatně:

Rozšířením tohoto přístupu je behavior-driven development, kde se pro specifikaci očekávaného chování používá doménově specifický jazyk.

Knihovny pro testování v C++

Existuje spousta knihoven, my použijeme Catch2, protože se nemusí složitě instalovat (poskytuje two-file variantu).