V živote programátora dojde ku situácií, kedy začne čítať o testoch, a neviem ako vy, ale keď som sa s tým stretol prvý krát, netušil som, načo to je. Ako som tak na to začal narážať častejšie, porozumel som síce načo to je, ale neporozumel som ako ich správne písať – čo testovať. Tento príspevok by mal pomôcť všetkým, ktorý buď nevedia prečo ich písať, alebo nevedia ako ich písať.
Čo sú automatizované testy?
Poznáte to – napíšete kód, potom ho spustíte, nastavíte nejak premenné (prípadne vstupy), počkáte si na výsledok a overíte, či sa zhoduje s tým, čo máte v hlave. No a myšlienka je v tom – prečo to nezautomatizovať? Prečo nenapísať, aký výsledok z funkcie očakávate pri daných nastaveniach? A preto vznikli testy. Popravde, vysvetlil som to tak rýchlo, až sa pýtam sám seba, či to potrebovalo vlastný nadpis :).
Výhody testovania
Život je príliš krátky, na písanie testov.
– hlupák
Testovanie má hneď niekoľko výhod:
- Viete, na čom ste – viete na koľko % máte daný script hotový, či funguje, alebo nie. Ak prechádza všetkými testami, môžete si byť istý, že s celkom bude dobre zapadať.
- Šetrí to čas – horeuvedený citát je asi najčastejší protiargument, s ktorým sa stretávam. Avšak je mylný. Ručné testovanie prebieha niekoľko sekúnd a môže trvať aj niekoľko minút, zatiaľ čo automatické testy trvajú pár milisekúnd. Ak script obsahuje chybu, testami nato príde okamžite. Ak sa ku scriptu vraciate, s tým, že potrebujete upraviť nejakú funkciu, akú máte istotu, že neohrozíte, nejakú inú kritickú časť projektu? S dobre napísanými testami, máte 100% istotu. Testy vám ušetria skutočne hromadu času.
- Radosť z programovania – váš script práve prešiel všetkými testami, možno neveríte ale je to super pocit!
- Dokumentácia – najhoršie na dokumentácií je, keď je stará, alebo nie je. Lenže testy sa píšu spolu s kódom (alebo pred ním), takže nemôžu byť staré. Ak nimi script prechádza, stačí sa na ne pozrieť a viete, ako ho používať.
- Triedi myšlienky – pri písaní testov si v hlave utriedite, čo potrebuje a ako to chcete použiť.
Ako ich písať?
Ako som už spomenul, moje začiatky neboli práve slávne, testy som pchal do funkcie a testoval, či mi do nej chodia premenné v správnom tvare. Dnes už viem, že to nemá riešiť test, to má riešiť samotná funkcia. Testy slúžia na otestovanie veľkých celkov – funkcií a tried. Testy simulujú ich volanie z vonku na štandardné (očakávané) ale aj chybné vstupy a overujú, či sa testovaná jednotka zachovaná tak, ako chceme. Veľmi dobrou radou je písať testy ešte pred samotným kódom. Tak si utriedite v hlave, ako to má fungovať, viete, ako overíte výsledky výstupov a rovnako vám to pomáha aj v motivácií, pretože viete, že 3 metódy v danej triede už máte hotové a ďalšie 2 vám ešte treba spraviť. Každý test by mal byť celok, nepredpokladajte spustenie jedného testu po druhom. Každý test by si mal inicializovať to, čo potrebuje a vyčistiť, s čím pracoval.
Problémy s testovaním
Niekedy nie je jednoduché písať testy. Napríklad v prípade komunikácie medzi Serverom->Klientom (AJAX, …). V takom prípade je veľmi dobrým nápadom, simulovať odpoveď servera. V JS sa to môže vyriešiť napríklad prepísaním funkcie obsluhujúcej AJAX tak, aby vracala predom pripravené odpovede, pre potreby testovania. Ušetríte tým čas strávený čakaním na serverovú odpoveď a tiež pripravíte script na prácu s dobrou aj zlou odpoveďou.
Tiež som narazil na problém s ukladaním dát. Funkcia ukladá dáta a treba overovať, č ich správne uložila a pracovať s týmito dátami ďalej. Náročná vec na testovanie. Problém, ktorému som čelil bola práve databáza. Ak by som použil tú, na ktorej som skúšal svoju aplikáciu, musel by som ju buď po každom teste zmazať, čo je neprípustné, alebo by som musel testy písať veľmi opatrne, s ohľadom na existujúce dáta, čo naozaj nie je dobrý nápad. Riešením bolo vytvoriť novú databázu, za účelom testovania. Táto mohla byť zakaždým vymazaná, zatiaľ čo pôvodná ostala nedotknutá.
Čím testovať?
Verím tomu, že pre každý jazyk už existuje nejaký dobrý nástroj na testovanie. Pre moje účely mi v C++ veľmi dobre vystačil Catch. Pre JavaScript používam Mocha. Pre C som si napísal svoj vlastný testovací script. Podľa čoho určujem, či je to dobrý nástroj? V prvom rade komunitou. Čím väčšia komunita nástroj využíva, tým viac sa s ním stretnete. Používať práve najpoužívanejší testovací nástroj vám umožní čítať testy ostatných rýchlo a tiež môžete predpokladať, že je overený. Druhým veľkým kritériom je jednoduchosť použitia, niekedy je na škodu mať príliš veľa funkcií, inokedy vám niektoré funkcie chýbajú, môže sa tiež stať, že testy sa zapisujú neuveriteľne komplikovane. S testovacím nástrojom budete pracovať veľa, zvoľte si taký, s ktorým sa vám bude pracovať dobre. V poslednom rade pozerám na dokumentáciu. Aby ste vedeli využiť silu testovacieho nástroja, potrebuje mu rozumieť a to sa bez dobrej dokumentácie nedá.
Záver
Dúfam, že som vás navnadil k písaniu testov. V niektorom z ďalších blogpostov by som sa rád zameral na písanie testovateľného serverového kódu v JavaScripte.