11. Testování

Testování

Osnova cvičení

  • Zkusíte vymyslet testovací případy pro knihovnu, ke které máte pouze hlavičkové soubory (black box testing),
  • Zkusíte vymyslet vstupní testovací data pro otestování pokrytí kódu pomocí nástroje lcov.

Příprava prostředí

Pro část 1 nebudete potřebovat nic nového. Pro část 2 si potřebujete stáhnout nástroj lcov, pokud jste na vlastních počítačích. Pokud jste na stolních laboratorních počítačích, musíte nabootovat na Linux Bookworm, na Ubuntu 22.04 nástroj lcov není.

Instalace pro různé OS

  • Ubuntu:
    sudo apt install lcov
    
  • Fedora:
    sudo dnf install lcov
    
  • MacOS:
    brew install lcov
    

Část 1 (Black box module testing)

Stáhněte si projekt 11-blackbox.zip.

Budete testovat správnost implementace bankomatu, k jehož logice a správě dostupných uživatelů ale nemáte přístup, máte jedině přístup k hlavičkovému souboru, který definuje operace nad bankomatem (takzvaný "interface").

Vašim úkolem je vymyslet testovací případy, které otestují správnost implementace bankomatu. Implementace bankomatu má stav, je tedy potřeba dělat operace na bankomatu v konkrétním pořadí (v reálu se nejdříve autorizuje uživatel dle pinu, poté vybere peníze).

Specifikace interface bankomatu

Nad bankomatem jsou specifikovány struktury a funkce v hlavičkovém souboru atm.h. Bankomat má oprávněné uživatele podle jejich ID a pinu. V našem případě bankomat pouze podporuje dva uživatele

  • user_id = 20, pin = 4555, balance = 1234,
  • user_id = 30, pin = 9105, balance = 305.

Pravidla fungování bankomatu:

  • k vybrání peněz je potřeba se nejdříve autorizovat správným ID a pinem,
  • jestliže existující uživatel zadá pin 3x, je zablokován, a jakákoli následující přihlášení jsou neplatná (uživatel je stále zablokován),
  • autorizorizovaný uživatel může prohlížet zůstatek jeho konta a také vybírat peníze, jestliže se pokusí vybrat větší zůstatek, než má na účtě, nic se nevybere a zůstatek zůstává stejný.

Bankomat je identifikován datovým typem atm_psy_t. Jedná se o ukazatel na strukturu, k jejíž členům nemáte přístup (tzv. opaque typ) a slouží pouze pro předávání do funkcí operující nad tímto typem (tzv. metody).

Projekt obsahuje Makefile, hlavičkový soubor (atm.h) definující interface bankomatu, samotnou implementaci bankomatu v souboru atm*.o a také soubor testenv.c, ve kterém doplníte testovací případy. Soubor testenv.c obsahuje příklad testovacího scénaře, kde se snaží do konta dostat nezaregistrovaný uživatel.

ℹ️ Testovací případy musí být funkce, která je typu bool(*)(atm_psy_t*), tedy funkce vracející bool bez parametrů. Funkce vrací true, jestliže případ prošel, false jinak. Použijte macro TEST_CASE, se kterém zavoláte příslušný testovací scénář.

⚠️ Musíte upravit Makefile, aby se slinkovala správná implementace bankomatu. Překlady jsou hotové jak pro x86 Linux, tak pro Apple ARM MacOS. Stolní počítače v učebně mají x86 Linux.

Část 2 (White box testing s nástrojem lcov)

Nejdříve si nainstalujte lcov, viz výše. Stáhněte si projekt 11-lcov-whitebox.zip.

Program je jednoduchá hra v bludišti. Aby se hra spustila, musí existovat soubor mazeconf.txt, ve kterém je definice bludiště. Formát bludiště je následující

  1. První řádka: velikost bludiště n (jedno celé číslo)
  2. Další řádky: definice bludiště samotného. Jedná se o n řádek, každá řádka obsahuje n znaků. Každá řádka je oddělena newline.
  3. Poslední řádka: dvě čísla - pozice x a y, kde bude začínat hráč.

Definice bludiště může obsahovat následující znaky:

  • .: místo, kde se hráč může pohybovat,
  • @: překážka, kam uživatel nemůže jít,
  • *: třešnička.

Hráč nemůže začínat mimo hranice bludiště, na překážce či na třešničce. Po úspěšném načtení bludiště uživatel zadává příkazy w/a/s/d (pohyb v bludišti). Jakýkoli jiný příkaz skončí hru. Každý příkaz je oddělen enterem.

Váš úkol

Rozbalte .zip s jednoduchou hrou a projekt přeložte. Vyzkoušejte si hru zahrát. K projektu máte soubor základní bludiště mazeconf.txt, kde je bludiště o velikosti 13x13, a začínající pozice x=2, y=2. Program tento soubor úšpěšně načte a zkuste si hru zahrát.

Váš úkol je si prohlédnout soubor maze.c a zamyslet se, jak musíte modifikovat bludiště v mazeconf.txt, abyste pokryli všechny případy, které kontrolují špatný formát bludiště (špatně zadaná pozice hráče, špatné délky řádky, atp.).

Také si zkuste hru zahrát a pokrýt všechny řádky ve funkci

static void gameloop(char *maze, int mazedim, int startx, int starty),

kde běží herní smyčka. Zamyslete se nad všemi podmínkami, které zaručují správnost implementace.

K dispozici máte Makefile s následujícími pravidly:

  • all: zkompiluje program,
  • run: spustí hru, ale nevygeneruje coverage report,
  • lcov: spustí hru a vygeneruje coverage report.

Report by se měl po více spuštěních sám aktualizovat, interaktivní změnou bludiště v souboru mazeconf.txt a samotnou hrou můžete pozorovat změny v pokrytí řádek.

ℹ️ Report je ve formátu .html, který musíte otevřít v prohlížeči. Z příkazové řádky lze report otevřít pomocí firefox coverage_html/index.html (nebo také pomocí xdg-open coverage_html/index.html, popř. open coverage_html/index.html pro MacOS).