{"id":37666,"date":"2019-10-31T22:18:55","date_gmt":"2019-10-31T19:18:55","guid":{"rendered":"https:\/\/prohoster.info\/blog\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-vtoraya\/"},"modified":"2019-10-31T22:18:55","modified_gmt":"2019-10-31T19:18:55","slug":"unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-vtoraya","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-vtoraya","title":{"rendered":"Unit testy v S\u00daBDB \u2013 jak to d\u011bl\u00e1me ve Sportmasteru, \u010d\u00e1st druh\u00e1","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i>Prvn\u00ed \u010d\u00e1st \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/464335\/\">zde<\/a><\/noindex>.<\/i><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/465047\/\"><img decoding=\"async\" alt=\"Unit testy v S\u00daBDB \u2013 jak to d\u011bl\u00e1me ve Sportmasteru, \u010d\u00e1st druh\u00e1\" src=\"\/wp-content\/uploads\/2019\/09\/b9fb8c934885abdf3ef928bfd75bdc2a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>P\u0159edstavte si situaci. Stoj\u00edte p\u0159ed \u00fakolem vyvinout novou funkci. M\u00e1te n\u011bjak\u00e9 materi\u00e1ly od sv\u00fdch p\u0159edch\u016fdc\u016f. Pokud p\u0159edpokl\u00e1d\u00e1me, \u017ee nem\u00e1te \u017e\u00e1dn\u00e9 mor\u00e1ln\u00ed z\u00e1vazky, jak byste se zachovali?<\/p>\n<p>Nej\u010dast\u011bji jsou v\u0161echny star\u00e9 materi\u00e1ly zapomenuty a v\u0161e za\u010d\u00edn\u00e1 znovu. Nikdo nem\u00e1 r\u00e1d prohrabov\u00e1n\u00ed se v ciz\u00edm k\u00f3du, a pokud m\u00e1te \u010das, pro\u010d se nezam\u011b\u0159it na vytvo\u0159en\u00ed vlastn\u00ed syst\u00e9mu? Toto je typick\u00fd p\u0159\u00edstup, a do zna\u010dn\u00e9 m\u00edry je spr\u00e1vn\u00fd. Ale v na\u0161em projektu jsme se rozhodli jinak. Z\u00e1kladem budouc\u00edho syst\u00e9mu automatick\u00e9ho testov\u00e1n\u00ed jsme postavili na materi\u00e1lech o unit-testov\u00e1n\u00ed na utPLSQL od p\u0159edch\u016fdc\u016f a pot\u00e9 jsme za\u010dali pracovat v n\u011bkolika paraleln\u00edch sm\u011brech.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<ol>\n<li><b>Obnova star\u00fdch unit-test\u016f.<\/b> Pod obnovou se rozum\u00ed p\u0159izp\u016fsoben\u00ed test\u016f sou\u010dasn\u00e9mu stavu syst\u00e9mu loajality a p\u0159izp\u016fsoben\u00ed test\u016f standard\u016fm utPLSQL. <\/li>\n<li><b>\u0158e\u0161en\u00ed probl\u00e9mu s porozum\u011bn\u00edm, kter\u00e9 konkr\u00e9tn\u011b metody a procesy m\u00e1me pokryt\u00e9 automatick\u00fdmi testy. <\/b>Je t\u0159eba tuto informaci bu\u010f m\u00edt v hlav\u011b, nebo vyvozovat z\u00e1v\u011bry p\u0159\u00edmo na z\u00e1klad\u011b k\u00f3du automatick\u00fdch test\u016f. Proto jsme se rozhodli vytvo\u0159it katalog. Ka\u017ed\u00e9mu automatick\u00e9mu testu jsme p\u0159i\u0159adili unik\u00e1tn\u00ed mnemonick\u00fd k\u00f3d, vytvo\u0159ili jsme popis a zaznamenali nastaven\u00ed (nap\u0159. v jak\u00fdch podm\u00ednk\u00e1ch by m\u011bl b\u00fdt spu\u0161t\u011bn, nebo co by se m\u011blo st\u00e1t, pokud spu\u0161t\u011bn\u00ed testu neusp\u011bje). V podstat\u011b jsme vyplnili metadata o automatick\u00fdch testech a um\u00edstili tato metadata do standardn\u00edch tabulek sch\u00e9matu utPLSQL.<\/li>\n<li><b>Stanoven\u00ed strategie roz\u0161\u00ed\u0159en\u00ed, tj. v\u00fdb\u011br funkcionality, kter\u00e1 bude podl\u00e9hat ov\u011b\u0159ov\u00e1n\u00ed automatick\u00fdmi testy.<\/b> Rozhodli jsme se zam\u011b\u0159it na t\u0159i v\u011bci: nov\u00e9 \u00fapravy syst\u00e9mu, incidenty z produkce a kl\u00ed\u010dov\u00e9 procesy syst\u00e9mu. T\u00edmto zp\u016fsobem se vyv\u00edj\u00edme paraleln\u011b s vyd\u00e1n\u00edm, co\u017e zaji\u0161\u0165uje jeho vy\u0161\u0161\u00ed kvalitu, z\u00e1rove\u0148 roz\u0161i\u0159ujeme objem regresn\u00edch test\u016f a zaji\u0161\u0165ujeme spolehlivost syst\u00e9mu v kritick\u00fdch m\u00edstech. Prvn\u00edm takov\u00fdm \u00fazk\u00fdm m\u00edstem byl proces rozd\u011blov\u00e1n\u00ed slev a bonus\u016f podle \u00fa\u010dtu.<\/li>\n<li><b>Samoz\u0159ejm\u011b jsme se pustili do v\u00fdvoje nov\u00fdch automatick\u00fdch test\u016f. <\/b>Jedn\u00edm z prvn\u00edch \u00fakol\u016f p\u0159i vyd\u00e1n\u00ed byla evaluace v\u00fdkonu p\u0159edem definovan\u00fdch v\u00fdb\u011br\u016f v\u011brnostn\u00edho syst\u00e9mu. V na\u0161em projektu m\u00e1me blok pevn\u00fdch SQL dotaz\u016f, kter\u00e9 vyb\u00edraj\u00ed z\u00e1kazn\u00edky podle podm\u00ednek. Nap\u0159\u00edklad z\u00edskat seznam v\u0161ech z\u00e1kazn\u00edk\u016f, jejich\u017e posledn\u00ed n\u00e1kup byl v konkr\u00e9tn\u00edm m\u011bst\u011b, nebo seznam z\u00e1kazn\u00edk\u016f, jejich\u017e pr\u016fm\u011brn\u00e1 \u010d\u00e1stka n\u00e1kupu je vy\u0161\u0161\u00ed ne\u017e ur\u010dit\u00e9 hodnoty. Naps\u00e1n\u00edm automatick\u00fdch test\u016f jsme ov\u011b\u0159ili p\u0159edem definovan\u00e9 v\u00fdb\u011bry, zaznamenali referen\u010dn\u00ed hodnoty v\u00fdkonu a nav\u00edc jsme provedli z\u00e1t\u011b\u017eov\u00e9 testov\u00e1n\u00ed.<\/li>\n<li><b>Pr\u00e1ce s automatick\u00fdmi testy by m\u011bla b\u00fdt pohodln\u00e1<\/b>. Nej\u010dast\u011bji se prov\u00e1d\u011bj\u00ed dva \u00fakony: spu\u0161t\u011bn\u00ed automatick\u00fdch test\u016f a vytvo\u0159en\u00ed testovac\u00edch dat. Tak v na\u0161em syst\u00e9mu vznikly dva pomocn\u00e9 moduly: modul pro spu\u0161t\u011bn\u00ed a modul pro generov\u00e1n\u00ed dat.\n<p>Modul pro spu\u0161t\u011bn\u00ed je prezentov\u00e1n jako jedna univerz\u00e1ln\u00ed procedura s jedn\u00edm vstupn\u00edm textov\u00fdm parametrem. Jako parametr lze p\u0159ed\u00e1vat mnemonick\u00fd k\u00f3d automatick\u00e9ho testu, n\u00e1zev bal\u00ed\u010dku, n\u00e1zev testu, nastaven\u00ed automatick\u00e9ho testu nebo rezervovan\u00e9 kl\u00ed\u010dov\u00e9 slovo. Procedura vyb\u00edr\u00e1 a spou\u0161t\u00ed v\u0161echny automatick\u00e9 testy, kter\u00e9 spl\u0148uj\u00ed podm\u00ednky.<\/p>\n<p>Modul pro generov\u00e1n\u00ed dat je prezentov\u00e1n jako bal\u00ed\u010dek, ve kter\u00e9m je pro ka\u017ed\u00fd objekt testovan\u00e9ho syst\u00e9mu (tabulka v DB) vytvo\u0159ena speci\u00e1ln\u00ed procedura, kter\u00e1 do n\u00ed vkl\u00e1d\u00e1 data. V t\u00e9to procedu\u0159e jsou maxim\u00e1ln\u011b vypln\u011bny v\u00fdchoz\u00ed hodnoty, co\u017e umo\u017e\u0148uje vytv\u00e1\u0159en\u00ed objekt\u016f doslova jedn\u00edm kliknut\u00edm. A pro usnadn\u011bn\u00ed pou\u017e\u00edv\u00e1n\u00ed byly vytvo\u0159eny \u0161ablony vytv\u00e1\u0159en\u00fdch dat. Nap\u0159\u00edklad vytvo\u0159it z\u00e1kazn\u00edka ur\u010dit\u00e9ho v\u011bku s testovac\u00edm telefonem a uskute\u010dn\u011bn\u00fdm n\u00e1kupem.<\/li>\n<li><b>Automatick\u00e9 testy by m\u011bly b\u00fdt spou\u0161t\u011bny a fungovat za rozumn\u00fd \u010das pro v\u00e1\u0161 syst\u00e9m. <\/b>Proto byl organizov\u00e1n ka\u017edodenn\u00ed no\u010dn\u00ed b\u011bh, na jeho\u017e z\u00e1klad\u011b se vytv\u00e1\u0159\u00ed zpr\u00e1va o v\u00fdsledc\u00edch a rozes\u00edl\u00e1 se cel\u00e9mu v\u00fdvojov\u00e9mu t\u00fdmu prost\u0159ednictv\u00edm firemn\u00edho e-mailu. Po obnoven\u00ed star\u00fdch automatick\u00fdch test\u016f a vytvo\u0159en\u00ed nov\u00fdch \u010dinil celkov\u00fd \u010das b\u011bhu 30 minut. Takov\u00e1 v\u00fdkonnost v\u0161echny uspokojovala, proto\u017ee spu\u0161t\u011bn\u00ed prob\u00edhalo mimo pracovn\u00ed dobu.\n<p>Na optimalizaci rychlosti pr\u00e1ce bylo t\u0159eba zapracovat. Aktualizace syst\u00e9mu loajality se prov\u00e1d\u00ed v produkci v noci. V r\u00e1mci jedn\u00e9 z releas\u016f bylo nutn\u00e9 v noci urgentn\u011b prov\u00e9st zm\u011bny. P\u016flhodinov\u00e9 \u010dek\u00e1n\u00ed na v\u00fdsledky automatizovan\u00fdch test\u016f ve t\u0159i hodiny r\u00e1no neud\u011blalo odpov\u011bdn\u00e9ho za release \u0161\u0165astn\u00fdm (srde\u010dn\u00fd pozdrav Alexejovi Vasyukovovi!), a n\u00e1sleduj\u00edc\u00ed r\u00e1no bylo na na\u0161i syst\u00e9m vy\u0159\u010deno mnoho pozitivn\u00edch slov. Ale po v\u00fdsledc\u00edch byla nastavena p\u011btiminutov\u00e1 norma na pr\u00e1ci.<\/p>\n<p>Pro urychlen\u00ed v\u00fdkonu jsme vyu\u017eili dv\u011b metody: automatizovan\u00e9 testy za\u010daly b\u011b\u017eet ve t\u0159ech paraleln\u00edch vl\u00e1knech, co\u017e je velmi pohodln\u00e9 d\u00edky architektu\u0159e na\u0161eho syst\u00e9mu loajality. A vzdali jsme se p\u0159\u00edstupu, kdy automatizovan\u00fd test nevytv\u00e1\u0159\u00ed testovac\u00ed data s\u00e1m, ale sna\u017e\u00ed se naj\u00edt v syst\u00e9mu n\u011bco vhodn\u00e9ho. Po proveden\u00ed zm\u011bn se celkov\u00fd \u010das pr\u00e1ce zkr\u00e1til na 3-4 minuty.<\/li>\n<li><b>Projekt s automatizovan\u00fdmi testy je t\u0159eba um\u011bt nasadit na r\u016fzn\u00fdch prost\u0159ed\u00edch.<\/b> Na za\u010d\u00e1tku jsme se pokusili napsat vlastn\u00ed batiky, ale uk\u00e1zalo se, \u017ee ru\u010dn\u011b napsan\u00e1 automatizovan\u00e1 instalace je tot\u00e1ln\u00ed katastrofa, a obr\u00e1tili jsme se k pr\u016fmyslov\u00fdm \u0159e\u0161en\u00edm. Vzhledem k tomu, \u017ee v projektu je velmi mnoho p\u0159\u00edmo k\u00f3du (p\u0159edev\u0161\u00edm uchov\u00e1v\u00e1me k\u00f3d automatizovan\u00fdch test\u016f) a velmi m\u00e1lo dat (hlavn\u00edmi daty jsou metadata o automatizovan\u00fdch testech), bylo implementace Liquibase do projektu velmi jednoduch\u00e9.\n<p>Je to nez\u00e1visl\u00e1 na datab\u00e1zi knihovna s otev\u0159en\u00fdm zdrojov\u00fdm k\u00f3dem pro sledov\u00e1n\u00ed, spr\u00e1vu a aplikaci zm\u011bn sch\u00e9matu datab\u00e1ze. \u0158\u00edd\u00ed se prost\u0159ednictv\u00edm p\u0159\u00edkazov\u00e9ho \u0159\u00e1dku nebo r\u00e1mc\u016f typu Apache Maven. Princip fungov\u00e1n\u00ed Liquibase je dost jednoduch\u00fd. M\u00e1me uspo\u0159\u00e1dan\u00fd projekt, kter\u00fd se skl\u00e1d\u00e1 ze zm\u011bn nebo skript\u016f, kter\u00e9 je t\u0159eba aplikovat na c\u00edlov\u00fd server, a \u0159\u00edd\u00edc\u00edch soubor\u016f, kter\u00e9 ur\u010duj\u00ed, v jak\u00e9m po\u0159ad\u00ed a s jak\u00fdmi parametry je t\u0159eba tyto zm\u011bny instalovat. <\/p>\n<p>Na \u00farovni DB se vytv\u00e1\u0159\u00ed speci\u00e1ln\u00ed tabulka, ve kter\u00e9 Liquibase uchov\u00e1v\u00e1 log zm\u011bn. Ka\u017ed\u00e1 zm\u011bna m\u00e1 vypo\u010d\u00edtan\u00fd hash, kter\u00fd se ka\u017ed\u00fdm pokusem porovn\u00e1v\u00e1 mezi projektem a stavem v datab\u00e1zi. D\u00edky Liquibase snadno aplikuje zm\u011bny na\u0161eho syst\u00e9mu na jak\u00fdkoli kontur. Automatizovan\u00e9 testy se nyn\u00ed spou\u0161t\u00ed na testovac\u00edch a produktov\u00fdch kontur\u00e1ch, stejn\u011b jako na kontejnerech (osobn\u00edch kontur\u00e1ch v\u00fdvoj\u00e1\u0159\u016f).<\/li>\n<\/ol>\n<p><img decoding=\"async\" alt=\"Unit testy v S\u00daBDB \u2013 jak to d\u011bl\u00e1me ve Sportmasteru, \u010d\u00e1st druh\u00e1\" src=\"\/wp-content\/uploads\/2019\/09\/4306f6c33543d38f5d8b77f67e22e247.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTak\u017ee, poj\u010fme si promluvit o v\u00fdsledc\u00edch aplikace na\u0161eho syst\u00e9mu unit-testov\u00e1n\u00ed. <\/p>\n<ol>\n<li>Samoz\u0159ejm\u011b, v prvn\u00ed \u0159ad\u011b jsme p\u0159esv\u011bd\u010deni, \u017ee jsme za\u010dali vyv\u00edjet kvalitn\u011bj\u0161\u00ed software. Automatizovan\u00e9 testy se spou\u0161t\u00ed denn\u011b a po ka\u017ed\u00e9m vyd\u00e1n\u00ed odhaluj\u00ed des\u00edtky chyb. Nav\u00edc \u010d\u00e1st t\u011bchto chyb je pouze nep\u0159\u00edmo spojena s funkcionalitou, kterou jsme skute\u010dn\u011b cht\u011bli zm\u011bnit. Jsou v\u00e1\u017en\u00e9 pochybnosti, \u017ee by tyto chyby byly nalezeny manu\u00e1ln\u00edm testov\u00e1n\u00edm. <\/li>\n<li>T\u00fdm z\u00edskal jistotu, \u017ee konkr\u00e9tn\u00ed funkcionalita funguje spr\u00e1vn\u011b... P\u0159edev\u0161\u00edm se to t\u00fdk\u00e1 na\u0161ich kritick\u00fdch proces\u016f. Nap\u0159\u00edklad za posledn\u00ed p\u016flrok jsme m\u011bli probl\u00e9my s distribuc\u00ed slev a bonus\u016f na \u00fa\u010dtenk\u00e1ch, p\u0159esto\u017ee doch\u00e1zelo k pravideln\u00fdm zm\u011bn\u00e1m, zat\u00edmco v p\u0159edchoz\u00edch obdob\u00edch se s touto z\u00e1le\u017eitost\u00ed ob\u010das objevovaly chyby.<\/li>\n<li>Poda\u0159ilo se n\u00e1m zkr\u00e1tit po\u010det iterac\u00ed testov\u00e1n\u00ed. D\u00edky tomu, \u017ee se automatizovan\u00e9 testy p\u00ed\u0161\u00ed pro novou funkcionalitu, se k analytik\u016fm a z\u00e1rove\u0148 tester\u016fm dost\u00e1v\u00e1 kvalitn\u011bj\u0161\u00ed k\u00f3d, proto\u017ee u\u017e byl ov\u011b\u0159en.<\/li>\n<li>\u010c\u00e1st v\u00fdstup\u016f automatizovan\u00e9ho testov\u00e1n\u00ed vyu\u017e\u00edvaj\u00ed v\u00fdvoj\u00e1\u0159i. Nap\u0159\u00edklad testovac\u00ed data na kontejnerech se vytv\u00e1\u0159ej\u00ed pomoc\u00ed modulu pro generaci objekt\u016f.<\/li>\n<li>Nen\u00ed bez zaj\u00edmavosti, \u017ee se n\u00e1m poda\u0159ilo vytvo\u0159it akceptaci syst\u00e9mu automatizovan\u00e9ho testov\u00e1n\u00ed ze strany v\u00fdvoj\u00e1\u0159\u016f. Existuje pochopen\u00ed, \u017ee je to d\u016fle\u017eit\u00e9 a u\u017eite\u010dn\u00e9. A ze sv\u00fdch zku\u0161enost\u00ed mohu \u0159\u00edci, \u017ee tomu tak zdaleka nen\u00ed. Automatizovan\u00e9 testy je pot\u0159eba ps\u00e1t, udr\u017eovat a rozv\u00edjet, analyzovat v\u00fdsledky, a \u010dasto jsou tyto \u010dasov\u00e9 n\u00e1klady prost\u011b ne\u00fam\u011brn\u00e9. Je mnohem jednodu\u0161\u0161\u00ed j\u00edt na produkci a tam \u0159e\u0161it probl\u00e9my. U n\u00e1s maj\u00ed v\u00fdvoj\u00e1\u0159i tendenci se shroma\u017e\u010fovat a \u017e\u00e1dat o pokryt\u00ed jejich funkcionality automatizovan\u00fdmi testy.<\/li>\n<\/ol>\n<h2>Co d\u00e1l<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Unit testy v S\u00daBDB \u2013 jak to d\u011bl\u00e1me ve Sportmasteru, \u010d\u00e1st druh\u00e1\" src=\"\/wp-content\/uploads\/2019\/09\/a11596618e97c0afaa9f5f25b613575e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPoj\u010fme si promluvit o pl\u00e1nech rozvoje projektu automatizovan\u00e9ho testov\u00e1n\u00ed.<\/p>\n<p>Bezpochyby, dokud syst\u00e9m v\u011brnosti Sportmasteru \u017eije a d\u00e1le se vyv\u00edj\u00ed, m\u016f\u017eeme tak\u00e9 nekone\u010dn\u011b rozv\u00edjet automatizovan\u00e9 testy. Hlavn\u00edm sm\u011brem v\u00fdvoje je tedy roz\u0161\u00ed\u0159en\u00ed pokryt\u00ed.<\/p>\n<p>S n\u00e1r\u016fstem po\u010dtu automatizovan\u00fdch test\u016f se nevyhnuteln\u011b zv\u00fd\u0161\u00ed celkov\u00fd \u010das jejich b\u011bhu, a budeme muset znovu \u010delit ot\u00e1zce v\u00fdkonnosti. \u0158e\u0161en\u00edm pravd\u011bpodobn\u011b bude zv\u00fd\u0161en\u00ed po\u010dtu paraleln\u00edch vl\u00e1ken.<\/p>\n<p>Ale to jsou z\u0159ejm\u00e9 cesty rozvoje. Pokud jde o n\u011bco m\u00e9n\u011b trivi\u00e1ln\u00edho, vyberme n\u00e1sleduj\u00edc\u00ed:<\/p>\n<ol>\n<li>Nyn\u00ed je spr\u00e1va automatizovan\u00fdch test\u016f prov\u00e1d\u011bna na \u00farovni DBMS, tj. pot\u0159ebn\u00e9 jsou znalosti PL\/SQL pro \u00fasp\u011b\u0161nou pr\u00e1ci. V p\u0159\u00edpad\u011b pot\u0159eby lze spr\u00e1vu syst\u00e9mu (nap\u0159\u00edklad spu\u0161t\u011bn\u00ed nebo vytv\u00e1\u0159en\u00ed metadat) outsourcovat do n\u011bjak\u00e9 administrativn\u00ed aplikace, pou\u017eijeme-li Jenkins nebo n\u011bco podobn\u00e9ho.<\/li>\n<li>V\u0161ichni maj\u00ed r\u00e1di kvantitativn\u00ed a kvalitativn\u00ed ukazatele. Pro automatizovan\u00e9 testov\u00e1n\u00ed je takov\u00fdm univerz\u00e1ln\u00edm ukazatelem Code Coverage, neboli metrika pokryt\u00ed k\u00f3du. Pomoc\u00ed tohoto ukazatele m\u016f\u017eeme ur\u010dit, jak\u00e9 procento k\u00f3du na\u0161e testovan\u00e9 syst\u00e9my je pokryto automatick\u00fdmi testy. Od verze 12.2 poskytuje Oracle mo\u017enosti pro v\u00fdpo\u010det t\u00e9to metriky a doporu\u010duje pou\u017e\u00edvat standardn\u00ed bal\u00edk DBMS_PLSQL_CODE_COVERAGE.\n<p>Na\u0161\u00ed syst\u00e9mu automatizovan\u00fdch test\u016f je n\u011bco m\u00e1lo p\u0159es rok a pravd\u011bpodobn\u011b nyn\u00ed je ten spr\u00e1vn\u00fd \u010das na hodnocen\u00ed pokryt\u00ed. V m\u00e9m p\u0159edchoz\u00edm projektu (projekt nen\u00ed Sportmaster) se to tak\u00e9 stalo. Po roce pr\u00e1ce na automatick\u00fdch testech management zadal \u00fakol vyhodnotit, jak\u00e9 procento k\u00f3du pokr\u00fdv\u00e1me. P\u0159i pokryt\u00ed v\u00edce ne\u017e 1% by byl management \u0161\u0165astn\u00fd. My, v\u00fdvoj\u00e1\u0159i, o\u010dek\u00e1vali v\u00fdsledek kolem 10%. P\u0159idali jsme code coverage, zm\u011b\u0159\u00edli jsme to a dostali 20%. Radost\u00ed jsme \u0161li za pr\u00e9mi\u00ed, ale jak jsme za n\u00ed \u0161li a kam jsme se pot\u00e9 vydali, to je \u00fapln\u011b jin\u00fd p\u0159\u00edb\u011bh.<\/li>\n<li>Automatizovan\u00e9 testy mohou ov\u011b\u0159ovat vystaven\u00e9 webov\u00e9 slu\u017eby. Oracle to zcela umo\u017e\u0148uje, a my se u\u017e nesetk\u00e1me s mnoha probl\u00e9my. <\/li>\n<li>A samoz\u0159ejm\u011b, n\u00e1\u0161 syst\u00e9m automatizovan\u00e9ho testov\u00e1n\u00ed m\u016f\u017ee b\u00fdt pou\u017eit i v jin\u00e9m projektu. Na\u0161e \u0159e\u0161en\u00ed je univerz\u00e1ln\u00ed a vy\u017eaduje pouze pou\u017eit\u00ed Oracle. Sly\u0161el jsem, \u017ee na jin\u00fdch projektech Sportmasteru je z\u00e1jem o automatizovan\u00e9 testov\u00e1n\u00ed, a mo\u017en\u00e1 se k nim vyd\u00e1me.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Z\u00e1v\u011bry<\/h2>\n<p>\nShr\u0148me to. Na projektu syst\u00e9mu loajality v Sportmasteru se n\u00e1m poda\u0159ilo implementovat syst\u00e9m automatizovan\u00e9ho testov\u00e1n\u00ed. Z\u00e1kladem je \u0159e\u0161en\u00ed utPLSQL od Stevena Feierstaina. Kolem utPLSQL je um\u00edst\u011bn k\u00f3d automatizovan\u00fdch test\u016f a pomocn\u00e9 vlastn\u00ed moduly: modul spu\u0161t\u011bn\u00ed, modul generace dat a dal\u0161\u00ed. Automatizovan\u00e9 testy se ka\u017ed\u00fd den spou\u0161t\u00ed a, co je nejd\u016fle\u017eit\u011bj\u0161\u00ed, funguj\u00ed a p\u0159in\u00e1\u0161ej\u00ed u\u017eitek. Jsme p\u0159esv\u011bd\u010deni, \u017ee jsme za\u010dali vyd\u00e1vat software vy\u0161\u0161\u00ed kvality. P\u0159itom z\u00edskan\u00e9 \u0159e\u0161en\u00ed je univerz\u00e1ln\u00ed a m\u016f\u017ee b\u00fdt voln\u011b pou\u017eito na jak\u00e9mkoli projektu, kde je t\u0159eba organizovat automatizovan\u00e9 testov\u00e1n\u00ed na DB Oracle.<\/p>\n<p><i>P.S. Tento \u010dl\u00e1nek nen\u00ed p\u0159\u00edli\u0161 konkr\u00e9tn\u00ed: je zde hodn\u011b textu a t\u00e9m\u011b\u0159 chyb\u011bj\u00ed technick\u00e9 p\u0159\u00edklady. Pokud je t\u00e9ma zaj\u00edmav\u00e9, jsme p\u0159ipraveni na n\u011bj nav\u00e1zat a vr\u00e1tit se s pokra\u010dov\u00e1n\u00edm, kde \u0159ekneme, co se zm\u011bnilo za posledn\u00edch \u0161est m\u011bs\u00edc\u016f a uvedeme p\u0159\u00edklady k\u00f3du.<\/p>\n<p>Pi\u0161te koment\u00e1\u0159e, pokud jsou n\u011bjak\u00e9 body, na kter\u00e9 bychom se m\u011bli v budoucnu zam\u011b\u0159it, nebo ot\u00e1zky, kter\u00e9 pot\u0159ebuj\u00ed osv\u011btlen\u00ed.<\/i><\/p>\n<p class=\"for_users_only_msg\">Pouze registrovan\u00ed u\u017eivatel\u00e9 se mohou \u00fa\u010dastnit ankety. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">P\u0159ihlaste se<\/a><\/noindex>, pros\u00edm.<\/p>\n<h2 class=\"default-block__polling-title\">Pokra\u010dujeme v n\u011b\u010dem takov\u00e9m?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Ano, samoz\u0159ejm\u011b.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Ne, d\u011bkuji.<\/p>\n<\/li>\n<\/ul>\n<p>    Hlasovalo 12 u\u017eivatel\u016f. Zdr\u017eeli se 4 u\u017eivatel\u00e9.<br \/>\n<br \/>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/465047\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u2014 \u0437\u0434\u0435\u0441\u044c. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e. \u041f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430. \u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0442 \u0432\u0430\u0448\u0438\u0445 \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a\u043e\u0432. \u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u044b \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043c\u043e\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442\u0435, \u0442\u043e \u043a\u0430\u043a \u0431\u044b \u0432\u044b \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043b\u0438? \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u0441\u0435 \u0441\u0442\u0430\u0440\u044b\u0435 \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0434\u0432\u0435\u0440\u0433\u0430\u044e\u0442\u0441\u044f \u0437\u0430\u0431\u0432\u0435\u043d\u0438\u044e \u0438 \u0432\u0441\u0451 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430. \u0412 \u0447\u0443\u0436\u043e\u043c \u043a\u043e\u0434\u0435 \u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043b\u044e\u0431\u0438\u0442, \u0430 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28269,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37666","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u2014 \u0437\u0434\u0435\u0441\u044c.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-vtoraya\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Unit-\u0442\u0435\u0441\u0442\u044b \u0432 \u0421\u0423\u0411\u0414 \u2014 \u043a\u0430\u043a \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e \u0432 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440\u0435, \u0447\u0430\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u0430\u044f | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u2014 \u0437\u0434\u0435\u0441\u044c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-vtoraya\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:18:55+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:18:55+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Unit testy v DB - jak to d\u011bl\u00e1me ve Sportmasteru, \u010d\u00e1st druh\u00e1 | ProHoster","description":"Prvn\u00ed \u010d\u00e1st - zde.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-vtoraya","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Unit-\u0442\u0435\u0441\u0442\u044b \u0432 \u0421\u0423\u0411\u0414 \u2014 \u043a\u0430\u043a \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e \u0432 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440\u0435, \u0447\u0430\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u0430\u044f | ProHoster","og:description":"\u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u2014 \u0437\u0434\u0435\u0441\u044c.","og:url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-vtoraya","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:18:55+00:00","article:modified_time":"2019-10-31T19:18:55+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37666","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 18:48:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:23:06","updated":"2026-01-23 18:48:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/37666","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=37666"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/37666\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/28269"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=37666"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=37666"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=37666"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}