47.18.2. Testování datového modelu

47.18.2.1. fixtures
47.18.2.2. Pomocné testovací metody
47.18.2.3. Testování validátorů

Datový model testujeme unit testy. Pro každý datový model máme jeden soubor s testy v adresáři test/unit/ jenž je pojmenován podle vzoru

model_test.rb

Používáme také „fixtures“, datové záznamy definované v textovém souboru. Ten se nachází v adresáři test/fixtures/ a jemnuje se po datové tabulce do níž se záznamy v něm definované zapisují.

Aby se nám dále snadno pracovalo, uvedeme si konkrétní příklad. Mějme tabulku jenž je definována/vytvářena sql příkazem

CREATE TABLE hosts (
        id      SERIAL PRIMARY KEY,
        name    VARCHAR(24) UNIQUE --natural primary key
);

Pro tuto tabulku hosts máme vytvořen model Host. Připravíme si tedy nejdříve „fixtures“ v souboru pojmenovaném po této tabulce, tedy test/fixtures/hosts.yml. Původní, vygenerovaný, obsah nahradíme svými dvěma pojmenovanými záznamy.

sunrise:
  id: 1
  name: sunrise

yoda:
  id: 2
  name: yoda

v našm příkladě mi pěkně vyšlo, že záznamy pojmenovávám stejným jménem které je v sloupečku/poli name. Jméno záznamu nemá jiný význam, než že je pod ním daný záznam přístupný v době testování. Mohl uvedené fixtures napsat také takto

prvni_stroj:
  id: 1
  name: sunrise

dalsi_stroj:
  id: 2
  name: yoda

Fixtures máme hotové, a můžeme přistoupit k testování. V souboru test/unit/host_test.rb máme po vytvoření jednoduchý, prázdný, test test_truth. Tento můžeme odstranit, protože uvedeme vlastní testy. Jako první otestujeme naše fixtures, zdali je máme ke dispozici.

    # Are all fixtures presented?
    def test_fixtures_presence
        assert_kind_of Host, hosts(:sunrise)
        assert_kind_of Host, hosts(:yoda)
    end

Testujeme zdali fixtures existují a jsou daného typu, vyhovují našemu modelu. Po napsání tohoto prvního testu jej již můžeme spustit. Použijeme příkaz

$ rake test:units

Testy proběhnou bez chyby. V této chvíli jsme se dopustili malého prohřešku na metodologii extreémního programování, přesněji části TDD (Test Driven Development). Měli jsme nejdříve napsat test test_fixtures_presence a teprve po neúspěšnýh testech upravit soubor s fixtures.

Nyní přistoupíme k testování základních operací nad modelem. Jedná se o operace Create, Read, Update a Delete. Někdy jsou dohromady nazývány také CRUD. Náš test se tedy bude jmenovat test_crud. Napíšeme si tedy jeho kostru, prázdnou metodu s komentáři na jejichž místo budeme psát kód.

    def test_crud
        # Create
        # Read
        # Update
        # Delete
    end

Nejdříve tedy vytvoření záznamu. V prvním příkazu si vytvoříme nový záznam jež má v poli name řetězec joshua a v druhém řádku jej uložíme do databáze.

        # Create
        joshua = Host.new(:name => 'joshua')
        assert joshua.save

Po dopsání uvedených dvou řádků můžeme, a taky to doporučuji, opět spustit testy. Měly by proběhnout bez chybičky. Pokud nějaká nastala, máme problém k řešení. V tomto okamžiku mě napadá že by mohl nastat problém zápisu do databáze, například pro nedostatečná oprávnění, případně z tuctu dalších důvodů. Protože ovšem náš test uspěl, přikročíme k napsání dalšího. Budeme testovat čtění. V prvním příkazu načítáme z tabulky náš záznam, identifikovaný číslem id. Využijeme toho, že v objektu jsohua máme zapsáno jeho id. V následujících dvou řádcích srovnáváme obsah pole name s hodnotou jenž očekáváme.

        # Read
        host = Host.find(joshua.id)
        assert_equal joshua.name, host.name
        assert_equal 'joshua', host.name

Spustíme testy. Opět žádná chybička. Můžeme tedy napsat test pro změnu záznamu. V naší tabulce máme jen jeden sloupec s daty, takže skusíme u již nalezeného stroje joshua jenž je uložen v proměnné host změnit jeho jméno například na hola. To provedeme prvním příkazem. Ve druhém ttestujeme že zápis proběhl bez problémů.

        # Update
        host.name = 'hola'
        assert host.save

Pokud proběhl test bez problémů, můžeme napsat v této metodě poslední test. Test mazání záznamu. Využijeme toho že máme od předchozích testů v proměnné host vytvořený záznam a ten smažeme.

        # Delete
        assert host.destroy

Pokud i teď proběhnou všechny testy bez problému máme otestovánu a zaručenu základní funkcionalitu datového modelu. Před tím než se budeme věnovat další činnosti, je vhodné zaslat všechny změny do subversion repositáře.

Licence Creative Commons
Tento dokument Ruby, jehož autorem je Radek Hnilica, podléhá licenci Creative Commons Uveďte autora-Nevyužívejte dílo komerčně-Zachovejte licenci 3.0 Česká republika .