Testování
Bezkonkurenčně nejpoužívanějším frameworkem pro testování v Node.js je jest, který má hromadu funkcionalit a doporučuji jej použít pro větší projekty. Pro jednoduchost my použijeme ava.
Velmi populární je také kombinace knihoven
mochaachai.
Nainstalujeme balíček ava jako vývojovou závislost (testy spouštíme pouze při vývoji, ne za běhu aplikace):
V package.json upravíme skript test:
Otestujeme, zda vše funguje:
Jelikož nemáme napsané žádné testy, ava nemůže žádné spustit. Vytvoříme si adresář tests, kde budou soubory končící na příponu .spec.js (nebo .test.js), kam budeme jednotlivé testy psát.
specje zkratka pro specification – testy slouží jako specifikace toho, jak by se program měl chovat.
Jednotkové testy (unit tests)
V dnešní době se jednotkové testy těší velké popularitě. Netestují celý program, ale pouze jeho jednotky (malé kousky). Jednotka může být funkce, třída nebo skupina funkcí/tříd. Jednotkové testy jsou nejvhodnější, pokud testujeme kód, který má vstup, výstup a žádné vedlejší efekty (komunikace s databází, webový server, manipulace se soubory atd.).
Vytvoříme si soubor tests/unit.spec.js:
Pomocí npm run test spustíme testy a ava nám vrátí informaci, že testy procházejí. Zkuste změnit jedno true na false a znovu vyzkoušet npm run test.
ava nabízí několik funkcí na testování hodnot:
Test Driven Development (TDD)
Při psaní jednotkových testů je možné praktikovat TDD – nejprve píšeme testy a pak teprve kód. Vyzkoušíme si to na funkci FizzBuzz.
Máme napsaný test a pomocí npm run test vyzkoušíme, zda implementace stačí. Funkce by měla vrátit 1, ale vrátí undefined. To je jednoduché napravit:
Nyní testy procházejí a můžeme napsat další:
Spustíme testy a zjistíme, že vrací 1 místo 2. Opravíme:
Testy opět fungují. Ale tato funkce ještě neimplementuje FizzBuzz algoritmus. Napíšeme další test:
A opravujeme co nejjednodušším způsobem:
Postupně přidáváme testy pro 5, 6, 10, 15 atd., až se dostaneme ke korektnímu kódu:
Nyní už nejsme schopni vymyslet žádný test, který by neprocházel, a tak víme, že je funkce korektní.
Integrační a akceptační testy
I přesto, že jednotkové testování je super, u webových aplikací často nestačí. Většinu věcí, co naše aplikace dělá, jsou vedlejší efekty (databáze, HTTP server), což pro jednotkové testy není vhodné.
Testy by měly testovat veřejné rozhraní aplikace. U naší Todo aplikace jsou to HTTP požadavky na vstupu a HTML na výstupu. K testování celku nám pomůže knihovna supertest.
Abychom mohli aplikaci testovat jako celek, musíme ji extrahovat do samostatného souboru src/app.js a oddělit ji od spuštění serveru (app.listen).
index.js pak bude vypadat takto:
Testovací databáze
Při testování nechceme ovlivňovat produkční data. Využijeme tedy testovací databázi v paměti (:memory:). Upravíme knexfile.js:
V src/db.js pak zajistíme výběr správné konfigurace:
Testování Todos
Vytvoříme si tests/todos.spec.js. Pomocí funkcí beforeEach a afterEach zajistíme čistý stav databáze pro každý test:
Tímto způsobem testujeme reálné rozhraní aplikace a ověřujeme, že se data správně vypisují do HTML.
