{"id":91,"date":"2016-10-16T08:41:04","date_gmt":"2016-10-16T06:41:04","guid":{"rendered":""},"modified":"2018-09-17T21:51:48","modified_gmt":"2018-09-17T19:51:48","slug":"nerobte-to-nepreskakujte-jednotkove-testy","status":"publish","type":"post","link":"https:\/\/spireng.sk\/en\/nerobte-to-nepreskakujte-jednotkove-testy\/","title":{"rendered":"Nerobte to. Nepreskakujte jednotkov\u00e9 testy!"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"imgp_img\" style=\"float: left; margin: 2px 5px;\" src=\"\/sites\/default\/files\/imagepicker\/1\/sd4f654sd.gif\" alt=\"Obr\u00e1zok\" width=\"200\" height=\"171\" \/>O automatick\u00fdch testoch som na svojom blogu pop\u00edsal u\u017e ve\u013ea. Aj o tom, \u017ee existuje nieko\u013eko ich kateg\u00f3ri\u00ed. \u010co som zatia\u013e nespomenul, je zn\u00e1ma <a href=\"http:\/\/martinfowler.com\/bliki\/TestPyramid.html\">pyram\u00edda automatick\u00fdch testov<\/a>. T\u00e1 hovor\u00ed, ko\u013eko z ka\u017edej kateg\u00f3rie testov by ste mali v projekte ma\u0165, aj kde za\u010da\u0165 (pyram\u00eddy sa zo z\u00e1sady buduj\u00fa odspodu smerom hore). Boli \u010dasy, ke\u010f som na t\u00fato pyram\u00eddu pozeral ako na kus te\u00f3rie. Ale po sk\u00fasenostiach z nieko\u013ek\u00fdch projektov ju za\u010d\u00ednam bra\u0165 ve\u013emi seri\u00f3zne. Mal som toti\u017e mo\u017enos\u0165 za\u017ei\u0165 projekty, kde sa rozhodli si zjednodu\u0161i\u0165 \u017eivot. A presko\u010dili prv\u00fa vrstvu \u2013 jednotkov\u00e9 testy.<!--more--><!--break--><\/p>\n<p>Najprv by bolo asi dobr\u00e9 poveda\u0165, \u010do vlastne t\u00fa pyram\u00eddu tvor\u00ed. \u00daplne dole s\u00fa jednotkov\u00e9 testy \u2013 unit testy. Tie s\u00fa p\u00edsan\u00e9 \u010dasto v rovnakom programovacom jazyku ako samotn\u00fd k\u00f3d. Hlavn\u00e1 my\u0161lienka jednotkov\u00fdch testov je, \u017ee jeden test by mal testova\u0165 pr\u00e1ve jednu met\u00f3du v jednej triede. Ak\u00fdko\u013evek in\u00fd k\u00f3d, ktor\u00fd by sa mohol spusti\u0165, by mal by\u0165 izolovan\u00fd pomocou tzv. mockovania.<\/p>\n<p>Nad jednotkov\u00fdmi testami s\u00fa testy slu\u017eieb (hovor\u00ed sa im tie\u017e API testy alebo integra\u010dn\u00e9 testy). Ich \u00falohou je testova\u0165 cel\u00fa s\u00fastavu objektov a hlavne to, \u010di tieto objekty spr\u00e1vne spolupracuj\u00fa (to je d\u00f4le\u017eit\u00fd bod na zapam\u00e4tanie \u2013 o chv\u00ed\u013eu sa dostaneme k tomu, pre\u010do). S\u00fa to testy, ktor\u00e9 sa \u010dasto sp\u00fa\u0161\u0165aj\u00fa vo\u010di API k\u00f3du alebo vo\u010di vonkaj\u0161iemu rozhraniu (REST, SOAP \u2026) servera.<\/p>\n<p>\u0160pi\u010dku pyram\u00eddy tvoria UI testy. Tie testuj\u00fa komplet aplik\u00e1ciu vr\u00e1tane pou\u017e\u00edvate\u013esk\u00e9ho rozhrania. \u010casto sa tu pracuje s n\u00e1strojmi, v ktor\u00fdch je mo\u017en\u00e9 testy nahra\u0165 a potom ho znova prehra\u0165 pri\u010dom program nie len klik\u00e1 (p\u00ed\u0161e) do testovan\u00e9ho programu ale aj overuje stav obrazovky.<\/p>\n<p>Fajn, tak v \u010dom je probl\u00e9m? Probl\u00e9m je v tom, \u017ee automatick\u00e9 testovanie je s\u00fa\u010das\u0165ou budovania kvality v aplik\u00e1cii. A pr\u00e1ce na kvalite sa odre\u017e\u00fa z projektu ako prv\u00e9, ke\u010f treba \u0161etri\u0165. V takom pr\u00edpade to ale m\u00f4\u017ee vyzera\u0165, \u017ee existuje rie\u0161enie. Ve\u010f namiesto postupn\u00e9ho p\u00edsania jednotkov\u00fdch testov pre XYZ tried sa nap\u00ed\u0161e nieko\u013eko integra\u010dn\u00fdch testov \u2013 jednotkov\u00e9 testy sa presko\u010dia. Integra\u010dn\u00e9 testy toti\u017e sp\u00fa\u0161\u0165aj\u00fa k\u00f3d nieko\u013ek\u00fdch tried naraz a tak ho de-facto testuj\u00fa. Na \u010do sa potom babra\u0165 s podrobn\u00fdm testovan\u00edm? Videl som nieko\u013eko projektov, kde tak\u00fdto pr\u00edstup utopil <span style=\"background: transparent;\">continuous<\/span> integration server v \u010dervenom mori failed buildov.<\/p>\n<p>Na vysvetlenie, pre\u010do je to zle, sa pok\u00fasim pou\u017ei\u0165 metaforu. Predstavte si, \u017ee va\u0161ou \u00falohou je zo s\u00fa\u010diastok zostavi\u0165 auto a potom ho otestova\u0165 (teda \u010di na\u0161tartujete a auto sa pohne). A predstavte si, \u017ee by ste to robili tak, \u017ee by ste to auto zlo\u017eili z jednotkov\u00fdch s\u00fa\u010diastok bez toho, aby ste sa na nich poriadne pozreli a potom by ste ho sk\u00fasili na\u0161tartova\u0165. Proste by ste naslepo brali s\u00fa\u010diastku za s\u00fa\u010diastkou a auto skladali.<\/p>\n<p>Pri prvom pokuse by auto nenasko\u010dilo, lebo v motore je nie\u010do zle. Tak by ste ho postupne rozoberali, a\u017e k\u00fdm by ste nena\u0161li chybn\u00fa s\u00fa\u010diastku, opravili ju a potom ho znova zlo\u017eili a sk\u00fasili na\u0161tartova\u0165 (op\u00e4\u0165 bez kontroly ostatn\u00fdch s\u00fa\u010diastok). Ak by ste pri mont\u00e1\u017ei ka\u017ed\u00fa s\u00fa\u010diastku kontrolovali, tak by ste t\u00fa chybn\u00fa na\u0161li hne\u010f a s\u00fa\u010diastku opravili. Ke\u010f\u017ee ale testujete v\u0161etky s\u00fa\u010diastky \u0161tartom motora, tak moment kedy sa dozved\u00e1te, \u017ee nie\u010do (v prvom momente ani neviete \u010do) je zle je vtedy, ke\u010f u\u017e je auto zlo\u017een\u00e9.<\/p>\n<p>Vymen\u00edte teda s\u00fa\u010diastku, op\u00e4\u0165 auto zlo\u017e\u00edte a sk\u00fa\u0161ate \u0161tartova\u0165. Op\u00e4\u0165 nejde. Asi tam niekde bude e\u0161te nejak\u00e1 chyba. Keby ste len vedeli, kde presne. Toti\u017e jedin\u00e1 inform\u00e1cia \u010do m\u00e1te je, \u017ee motor ne\u0161tartuje. A tak v\u00e1m neost\u00e1va ni\u010d in\u00e9, len motor rozobra\u0165 znova a h\u013eada\u0165 to, \u010do je zl\u00e9. Ru\u010d\u00edm v\u00e1m za to, \u017ee v tomto momente v\u00e1m motiv\u00e1cia nie\u010do \u010falej automaticky testova\u0165 za\u010dne rap\u00eddne klesa\u0165. Vitajte v svete jednotkov\u00e9-testy-nem\u00e1me-testujeme-rovno-API projektov.<\/p>\n<p>Ono to na prv\u00fd poh\u013ead vyzer\u00e1 stra\u0161ne super. Jedn\u00fdm testom m\u00e1m toho stra\u0161ne ve\u013ea otestovan\u00e9. Probl\u00e9m je v tom, \u017ee integra\u010dn\u00e9 testy s\u00fa len doplnkom jednotkov\u00fdch testov, nie ich n\u00e1hradou. \u00da\u010delom integra\u010dn\u00fdch testov toti\u017e nie je testova\u0165 to, \u010di trieda funguje spr\u00e1vne, ale to, \u010di triedy medzi sebou spr\u00e1vne spolupracuj\u00fa. Ale to m\u00e1 zmysel testova\u0165 len vtedy, ak viete, \u017ee jeho jednotliv\u00e9 \u010dasti dobre funguj\u00fa.<\/p>\n<p>Aj napriek tomu by sa mohlo st\u00e1le zda\u0165, \u017ee integra\u010dn\u00e9 testy vedia z \u010dasti nahradi\u0165 jednotkov\u00e9. Ve\u010f v kone\u010dnom d\u00f4sledku sp\u00fa\u0161\u0165aj\u00fa k\u00f3d a overuj\u00fa nejak\u00fd v\u00fdsledok. Probl\u00e9m je, \u017ee testovanie nejakej v\u00e4\u010d\u0161ej \u010dasti syst\u00e9mu nie je jednoduch\u00e1 \u010dinnos\u0165 a cenou za to je, \u017ee tieto testy maj\u00fa svoje nev\u00fdhody:<\/p>\n<p>1. nastavovanie prostredia pred spusten\u00edm \u2013 \u010dasto s\u00fa to testy, ktor\u00e9 v kone\u010dnom d\u00f4sledku pracuj\u00fa s datab\u00e1zou, tak\u017ee im treba pripravi\u0165 datab\u00e1zu so spr\u00e1vnymi \u00fadajmi. U\u017e toto samo o sebe je celkom v\u00fdzva pre automatiz\u00e1ciu. Okrem toho to m\u00f4\u017eu by\u0165 r\u00f4zne konfigura\u010dn\u00e9 s\u00fabory alebo multimedi\u00e1lne \u00fadaje niekde na disku. Nejak\u00e9 nastavenia vy\u017eaduj\u00fa aj jednotkov\u00e9 testy, ale tie nastavenia s\u00fa pre jeden test omnoho jednoduch\u0161ie a v\u00e4\u010d\u0161inou in-memory, kde sa daj\u00fa jednoducho vyrobi\u0165 aj uprata\u0165.<\/p>\n<p>2. nehovoria v \u010dom presne je probl\u00e9m \u2013 pri chyb\u00e1ch tieto testy \u010dasto skon\u010dia s nie\u010dim tak\u00fdm ako \u201e<span style=\"background: transparent;\">slu\u017eba nevr\u00e1til<\/span><span style=\"background: transparent;\">a<\/span><span style=\"background: transparent;\"> \u017eiadnu objedn\u00e1vku aj ke\u010f mal<\/span><span style=\"background: transparent;\">a<\/span><span style=\"background: transparent;\"> vr\u00e1ti\u0165 4 z\u00e1znamy<\/span>\u201c. Alebo \u201ez\u00e1pis \u00fadajov pou\u017e\u00edvate\u013ea zlyhal\u201c. V\u00e1m neost\u00e1va ni\u010d in\u00e9 len pozrie\u0165 log alebo sk\u00fasi\u0165 test spusti\u0165 v lok\u00e1lnom v\u00fdvojovom prostred\u00ed. Niekedy to m\u00f4\u017ee by\u0165 v\u00e4\u010d\u0161ia mno\u017eina tried, ktor\u00e9 mus\u00edte skontrolova\u0165 k\u00fdm n\u00e1jdete t\u00fa, ktor\u00e1 m\u00e1 probl\u00e9m. Naproti tomu v\u00e1m jednotkov\u00fd test (ak ich p\u00ed\u0161ete tak, ako sa m\u00e1) povie \u201emet\u00f3da X v triede Y vr\u00e1tila zl\u00fd v\u00fdsledok\u201c. A v\u00e1m ost\u00e1va max 100 riadkov k\u00f3du (d\u00fafam, \u017ee v\u00e4\u010d\u0161ie met\u00f3dy nem\u00e1te), ktor\u00fd treba prezrie\u0165.<\/p>\n<p>3. trvaj\u00fa dlho \u2013 \u010dastokr\u00e1t to b\u00fdva sp\u00f4soben\u00e9 t\u00fdm, \u017ee je potrebn\u00e9 pred ka\u017ed\u00fdm testom nastavi\u0165 prostredie (pripravi\u0165 \u00fadaje) a potom po sebe zase uprata\u0165. A to \u010dasto vy\u017eaduje z\u00e1pisy na disk, \u010do je pomal\u00e1 \u010dinnos\u0165. Alebo sa m\u00f4\u017eete vyda\u0165 inou cestou a urobi\u0165 jednu datab\u00e1zu nad ktorou pust\u00edte postupne v\u0161etky testy. Vtedy ale v\u00fdsledok predch\u00e1dzaj\u00faceho testu ovplyv\u0148uje tie nasleduj\u00face. Je to ako ke\u010f sa pok\u00fasite hasi\u0165 ohe\u0148 olejom. Naproti tomu jednotkov\u00e9 testy be\u017eia v pam\u00e4ti a za nieko\u013eko sek\u00fand ich viete spusti\u0165 aj nieko\u013eko stoviek. Tu je d\u00f4le\u017eit\u00e9 poveda\u0165 o \u017eeleznom pravidle, \u017ee pri <span style=\"background: transparent;\">continu<\/span><span style=\"background: transparent;\">o<\/span><span style=\"background: transparent;\">u<\/span><span style=\"background: transparent;\">s<\/span> integration by server mal da\u0165 odpove\u010f o v\u00fdsledku integrovania posledn\u00fdch zmien do 10 min\u00fat. Pri integra\u010dn\u00fdch testoch m\u00f4\u017ee by\u0165 toto dos\u0165 \u0165a\u017ek\u00e9 dosiahnu\u0165.<\/p>\n<p>4. nestr\u00e1\u017eia \u0161trukt\u00faru k\u00f3du \u2013 integra\u010dn\u00e9 testy testuj\u00fa rozhranie. Je im jedno ak\u00e9 \u0161pagety vo vn\u00fatri m\u00e1te, ak rozhranie vr\u00e1ti v\u00fdsledok. Jednotkov\u00e9 s\u00fa opa\u010dn\u00fd pr\u00edpad \u2013 n\u00fatia v\u00e1s vytv\u00e1ra\u0165 mal\u00e9 jedno\u00fa\u010delov\u00e9 met\u00f3dy, pou\u017e\u00edva\u0165 medzi objektami slab\u0161ie v\u00e4zby at\u010f. Je ve\u013emi \u0165a\u017ek\u00e9 ma\u0165 aplik\u00e1ciu pokryt\u00fa jednotkov\u00fdmi testami a pri tom ma\u0165 n\u00edzku kvalitu k\u00f3du (aj ke\u010f \u2013 ruku na srdce \u2013 videl som u\u017e aj nie\u010do tak\u00e9)<\/p>\n<p>5. upravovanie pri zmene k\u00f3du je komplikovanej\u0161ie \u2013 ak zmen\u00edm triedu A a ona m\u00e1 jednotkov\u00fd test (triedu Atest), tak viem presne, ktor\u00fd jednotkov\u00fd test m\u00e1m upravi\u0165. Ale ako zist\u00edm, ktor\u00e9 integra\u010dn\u00e9 testy v kone\u010dnom d\u00f4sledku sp\u00fa\u0161\u0165aj\u00fa triedu A a ktor\u00e9 z nich m\u00e1m upravi\u0165? Ve\u013ea \u0161\u0165astia pri h\u013eadan\u00ed.<\/p>\n<p>Napriek tomu v\u0161etk\u00e9mu s\u00fa integra\u010dn\u00e9 testy povinn\u00e1 s\u00fa\u010das\u0165 automaticky testovan\u00e9ho projektu. Dok\u00e1\u017eu toti\u017e perfektne plni\u0165 svoj \u00fa\u010del \u2013 testova\u0165, \u010di triedy spr\u00e1vne funguj\u00fa ako syst\u00e9m. Ale v \u010dase, ke\u010f u\u017e be\u017eia, by k\u00f3d mal ma\u0165 za sebou jednotkov\u00e9 testy a teda viete, \u017ee z ve\u013ekej pravdepodobnosti ka\u017ed\u00e1 trieda rob\u00ed to, \u010do v\u00fdvoj\u00e1r zam\u00fd\u0161\u013eal. D\u00f4le\u017eit\u00e9 je postupova\u0165 po pyram\u00edde testovania odspodu nahor.<\/p>\n<p>Ako som spom\u00ednal, videl som nieko\u013eko projektov, ktor\u00e9 presko\u010dili jednotkov\u00e9 testy (\u201e \u2026 je s t\u00fdm ve\u013ea pr\u00e1ce. Cez jMeter to otestujeme r\u00fdchlej\u0161ie v\u0161etko naraz \u2026\u201c) a veselo za\u010dali zav\u00e1dza\u0165 integra\u010dn\u00e9 testy. V\u00fdsledok bol, \u017ee vznikla sada testov, ktor\u00e1 trvala ve\u013emi dlho a \u010dasto padala (st\u00e1le dookola pad\u00e1 ten ist\u00fd test, pri\u010dom ale pr\u00ed\u010dina je in\u00e1). Zostavovac\u00ed server je \u010dasto \u010derven\u00fd (v d\u00f4sledku \u010doho \u013eudia str\u00e1caj\u00fa citlivos\u0165 na \u010derven\u00fa farbu na jeho dashboarde) a upravova\u0165 tie testy dost\u00e1vaj\u00fa v\u00fdvoj\u00e1ri za trest.<\/p>\n<p>A najhor\u0161\u00edm d\u00f4sledkom toho v\u0161etk\u00e9ho je, \u017ee ak niekto za\u017eil len tak\u00e9to projekty, tak m\u00e1 jednoducho pocit, \u017ee automatick\u00e9 testy s\u00fa nezmysel (a ja sa mu nediv\u00edm). A preto rada na z\u00e1ver: ak nie je \u010das p\u00edsa\u0165 jednotkov\u00e9 testy, tak ich nepreskakujte. Ak nem\u00f4\u017eete ma\u0165 jednotkov\u00e9, tak potom rad\u0161ej \u017eiadne. Integra\u010dn\u00e9 testy bez jednotkov\u00fdch s\u00fa ako dom bez z\u00e1kladov \u2013 bude sa otriasa\u0165 a r\u00faca\u0165. Ak m\u00e1te aspo\u0148 nejak\u00fd \u010das, tak vytipujte kritick\u00e9 \u010dasti v aplik\u00e1cii a pre tie nap\u00ed\u0161te jednotkov\u00e9 testy. Je v\u017edy lep\u0161ie ma\u0165 50 jednotkov\u00fdch testov ako 5 integra\u010dn\u00fdch.<\/p>","protected":false},"excerpt":{"rendered":"<p>O automatick\u00fdch testoch som na svojom blogu pop\u00edsal u\u017e ve\u013ea. Aj o tom, \u017ee existuje nieko\u013eko ich kateg\u00f3ri\u00ed. \u010co som zatia\u013e nespomenul, je zn\u00e1ma pyram\u00edda automatick\u00fdch testov. T\u00e1 hovor\u00ed, ko\u013eko z ka\u017edej kateg\u00f3rie testov by ste mali v projekte ma\u0165, aj kde za\u010da\u0165 (pyram\u00eddy sa zo z\u00e1sady buduj\u00fa odspodu smerom hore). Boli \u010dasy, ke\u010f som [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":["post-91","post","type-post","status-publish","format-standard","hentry","category-vyvoj-softveru"],"_links":{"self":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/91","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/comments?post=91"}],"version-history":[{"count":1,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/91\/revisions"}],"predecessor-version":[{"id":139,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/91\/revisions\/139"}],"wp:attachment":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/media?parent=91"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/categories?post=91"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/tags?post=91"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}