{"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\/et\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-vtoraya","title":{"rendered":"\u00dchiku testimine andmebaasis \u2014 kuidas me seda Sportmasteris teeme, teine osa","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i>Esimene osa \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/464335\/\">siit<\/a><\/noindex>.<\/i><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/465047\/\"><img decoding=\"async\" alt=\"\u00dchiku testimine andmebaasis \u2014 kuidas me seda Sportmasteris teeme, teine osa\" src=\"\/wp-content\/uploads\/2019\/09\/b9fb8c934885abdf3ef928bfd75bdc2a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Kujutage ette olukorda. Teil on \u00fclesanne arendada uut funktsionaalsust. Teil on eelk\u00e4ijate t\u00f6\u00f6 tulemused. Kui eeldada, et teil ei ole mingeid moraalseid kohustusi, siis kuidas te k\u00e4ituksite?<\/p>\n<p>Enamasti unustatakse k\u00f5ik vanad t\u00f6\u00f6tlused ning k\u00f5ik algab nullist. Keegi ei armasta v\u00f5\u00f5ras koodis nokitseda, ja kui aega on, siis miks mitte luua oma s\u00fcsteemi? See on t\u00fc\u00fcpiline l\u00e4henemine, ja sellel on palju \u00f5igustust. Kuid meie projektis tegime me teisiti. Meie automaatse testimise s\u00fcsteemi aluseks olid eelk\u00e4ijate unit-testide t\u00f6\u00f6tlused utPLSQL-l, seej\u00e4rel hakkasime t\u00f6\u00f6tama mitmes paralleelses suunas.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<ol>\n<li><b>O mandete taastamine.<\/b> Taastamise all m\u00f5istetakse testide kohandamist olemasolevale lojaalsuse s\u00fcsteemile ja testide kohandamist utPLSQL-i standarditele. <\/li>\n<li><b>Probleemi lahendamine arusaamises, millised meetodid ja protsessid on meil kaetud automaatsete testidega. <\/b>Peame kas hoidma seda teavet meeles v\u00f5i p\u00f5hineb j\u00e4reldused otse automaatsete testide koodil. Seet\u00f5ttu otsustasime koostada katalooge. Iga automaatse testi jaoks andsime ainulaadse mnemokoodi, koostasime kirjelduse ja salvestasime seaded (n\u00e4iteks millistes tingimustes see peab k\u00e4ivituma v\u00f5i mis peaks juhtuma, kui testi k\u00e4ivitamine eba\u00f5nnestub). Sisuliselt t\u00e4itsime automaatsete testide metaandmeid ja paigutasime need metaandmed standardsetesse utPLSQL skeemi tabelitesse.<\/li>\n<li><b>Laienemisstrateegia m\u00e4\u00e4ratlemine, st funktsionaalsuse valik, mis kuulub automaatsete testide kontrolli.<\/b> Otsustasime keskenduda kolmele asjale: s\u00fcsteemi uutele t\u00e4iustustele, tootmisest tekkinud juhtumitele ja s\u00fcsteemi p\u00f5hiprotsessidele. Nii areneme paralleelselt v\u00e4ljaandega, tagades selle kvaliteedi, laiendades samal ajal regressioonitestide mahtu ja tagades s\u00fcsteemi usaldusv\u00e4\u00e4rsuse kriitilistes kohtades. Esimene selline kitsaskoht oli soodustuste ja boonuste jaotamise protsess t\u0161ekis.<\/li>\n<li><b>Muidugi hakkasime arendama uusi automaatseid teste. <\/b>\u00dche esimesena oli meie projekti \u00fclesanne hinnata eelnevalt m\u00e4\u00e4ratud lojaalsusprogrammi valikute j\u00f5udlust. Meie projektis on rida fikseeritud SQL-p\u00e4ringutest, mis valivad kliente teatud tingimuste kohaselt. N\u00e4iteks, et saada nimekiri k\u00f5igist klientidest, kelle viimane ost on olnud konkreetse linna piires, v\u00f5i nimekiri klientidest, kelle keskmine ostusumma \u00fcletab kindlat v\u00e4\u00e4rtust. Koostades automaatseid teste, kontrollisime eelnevalt m\u00e4\u00e4ratud valikute toimivust, fikseerisime etalon-j\u00f5udluse parameetrid ja lisaks tegime ka koormusteste.<\/li>\n<li><b>T\u00f6\u00f6tamine automaatsete testidega peab olema mugav<\/b>. K\u00f5ige sagedamini teostatakse kahte toimingut: automaatsete testide k\u00e4ivitamine ja testandmete genereerimine. Nii on meie s\u00fcsteemis tekkinud kaks abimoodulit: k\u00e4ivitamise moodul ja andmete genereerimise moodul.\n<p>K\u00e4ivitamismoodul on esitatud \u00fche universaalse protseduurina, millel on \u00fcks sisendtekstiparameeter. Parameetrina saab edastada automaatkontrolli mnemokoodi, paketi nime, testi nime, automaatkontrolli konfiguratsiooni v\u00f5i reserveeritud m\u00e4rks\u00f5na. Protseduur valib ja k\u00e4ivitab k\u00f5ik automaatkontrollid, mis vastavad tingimustele.<\/p>\n<p>Andme genereerimise moodul on esitatud paketina, kus iga testitava s\u00fcsteemi objekti (andmebaasi tabeli) jaoks on loodud spetsiaalne protseduur, mis viib sinna andmed. Antud protseduur t\u00e4idab maksimaalselt vaikev\u00e4\u00e4rtused, mis tagab objektide loomise s\u00f5na otseses m\u00f5ttes s\u00f5rme snapiga. Ja kasutamise mugavuse huvides on loodud loodud andmete mallid. N\u00e4iteks, luua teatud vanuses klient testtelefoni ja sooritatud ostuga.<\/li>\n<li><b>Automaatsed testid peavad k\u00e4ivituma ja t\u00f6\u00f6tama teie s\u00fcsteemi jaoks vastuv\u00f5etava aja jooksul. <\/b>Seet\u00f5ttu korraldati igap\u00e4evane \u00f6ine k\u00e4ivitamine, mille p\u00f5hjal koostati aruanded ja saadeti kogu arendustiimile ettev\u00f5tte e-posti teel. P\u00e4rast vanade automaatkatsete taastamist ja uute loomist j\u00e4i koguaeg 30 minutisse. Taoline tootlikkus rahuldas k\u00f5iki, kuna k\u00e4ivitamine toimus v\u00e4ljaspool t\u00f6\u00f6aega.\n<p>Kuid t\u00f6\u00f6 kiirusest optimeerimine oli vajalik. Lojaalsuss\u00fcsteemi v\u00e4rskendamine produktsioonis toimub \u00f6\u00f6sel. \u00dche versiooni raames tuli \u00f6\u00f6sel teha kiireid muudatusi. Poolteise tunni ootamine automaatkatsete tulemuste p\u00e4rast kell kolm \u00f6\u00f6sel ei teinud vastutavat isikut \u00f5nnelikuks (sooja tervituse Alexey Vasyukovile!), ning j\u00e4rgmisel hommikul kuuldavasti \u00f6eldi meie s\u00fcsteemi kohta palju sooje s\u00f5nu. Kuid l\u00f5puks kehtestati 5-minutiline norm t\u00f6\u00f6 tegemiseks.<\/p>\n<p>Riigi efektiivsuse suurendamiseks kasutasime kahte meetodit: autotestimise protsessid k\u00e4ivituvad kolmes paralleelses voos, mis sobib meie lojaalsus\u00fcsteemi arhitektuuri t\u00f5ttu suurep\u00e4raselt. Samuti loobusime l\u00e4henemisest, kus autotest ei genereeri endale testandmeid, vaid p\u00fc\u00fcab leida s\u00fcsteemist midagi sobivat. P\u00e4rast muudatusi v\u00e4henes kogu t\u00f6\u00f6aeg 3-4 minutini.<\/li>\n<li><b>Autotestide projekt tuleb osata seadistada erinevates keskkondades.<\/b> Teel oli katse kirjutada oma skripte, kuid sai selgeks, et k\u00e4sitsi automatiseeritud seadistus on t\u00e4ielik \u00f5udus, seega p\u00f6\u00f6rdusime t\u00f6\u00f6stuslike lahenduste poole. Arvestades, et projektis on palju koodi (peamiselt salvestame autotestide koodi) ja v\u00e4ga v\u00e4he andmeid (peamised andmed on autotestide metaandmed), osutus Liquibase'i rakendamine projektis v\u00e4ga lihtsaks.\n<p>See on andmebaasist s\u00f5ltumatu avatud l\u00e4htekoodiga teek, mis on m\u00f5eldud andmebaasiskeemide muutuste j\u00e4lgimiseks, haldamiseks ja rakendamiseks. Seda juhtimise v\u00f5imalust pakuvad k\u00e4surea t\u00f6\u00f6riistad v\u00f5i Apache Maven'i t\u00fc\u00fcpi raamistikud. Liquibase'i t\u00f6\u00f6p\u00f5him\u00f5te on piisavalt lihtne. Meil on korralikult struktureeritud projekt, mis koosneb muudatustest v\u00f5i skriptidest, mida tuleb sihtserverile rakendada, ning juhtfailidest, mis m\u00e4\u00e4ravad, millises j\u00e4rjekorras ja milliste parameetritega neid muudatusi paigaldada. <\/p>\n<p>Andmebaasi tasandil luuakse spetsiaalne tabel, milles Liquibase salvestab rakenduste logi. Iga muudatusel on arvutatud r\u00e4sisumma, mida v\u00f5rreldakse igal korral projekti ja andmebaasi olekuga. Liquibase'i kaudu saame h\u00f5lpsasti rakendada muudatusi meie s\u00fcsteemis mis tahes keskkonda. Autotestid k\u00e4ivitatakse praegu test- ja v\u00e4ljalaskekeskkondades, samuti konteinerites (arendajate isiklikes keskkondades).<\/li>\n<\/ol>\n<p><img decoding=\"async\" alt=\"\u00dchiku testimine andmebaasis \u2014 kuidas me seda Sportmasteris teeme, teine osa\" src=\"\/wp-content\/uploads\/2019\/09\/4306f6c33543d38f5d8b77f67e22e247.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNii et r\u00e4\u00e4gime meie \u00fcksustestide s\u00fcsteemi rakendamise tulemustest. <\/p>\n<ol>\n<li>Muidugi usume eelk\u00f5ige, et oleme hakanud arendama kvaliteetsemat tarkvara. Autotestid k\u00e4ivitatakse iga p\u00e4ev ja iga versiooni puhul tuvastavad need k\u00fcmneid vigu. Samas on osa neist vigadest vaid kaudselt seotud funktsionaalsusega, mida me t\u00f5eliselt soovime muuta. On suuri kahtlusi, et need vead oleks leitud k\u00e4sitsi testimisega. <\/li>\n<li>Meeskonnal on tekkinud kindlustunne, et konkreetne funktsionaalsus t\u00f6\u00f6tab \u00f5igesti... Eelk\u00f5ige puudutab see meie kriitilisi protsesse. N\u00e4iteks ei ole viimase kuue kuu jooksul olnud meil probleeme soodustuste ja boonuste jaotamisega t\u0161ekis, hoolimata igast versioonimuudatusest, kuigi varasematel perioodidel esines m\u00f5ningaid proportsionaalseid vigu.<\/li>\n<li>Oleme suutnud v\u00e4hendada testimise iteratsioonide arvu. T\u00e4nu sellele, et autotestid kirjutatakse uue funktsionaalsuse jaoks, j\u00f5uab anal\u00fc\u00fctikutele ja samal ajal testijatele k\u00f5rgema kvaliteediga kood, kuna see on juba kontrollitud.<\/li>\n<li>Osad automatiseeritud testimise arendused kasutatakse arendajate poolt. N\u00e4iteks genereeritakse konteinerites testandmed objektide genereerimise mooduli abil.<\/li>\n<li>Oluline on m\u00e4rkida, et meie arendajad on aktsepteerinud automatiseeritud testimise s\u00fcsteemi. On arusaam, et see on oluline ja kasulik. Aga oma kogemuse p\u00f5hjal v\u00f5in \u00f6elda, et see ei ole sugugi nii. Automatiseeritud testid tuleb kirjutada, neid tuleb hooldada ja arendada, tulemusi anal\u00fc\u00fcsida ning sageli ei \u00f5igusta need ajakulu. Oluliselt lihtsam on minna tootmisliini ja seal probleemidega tegeleda. Meie arendajad seisavad j\u00e4rjekorras ja paluvad katte saada automatiseeritud testidega.<\/li>\n<\/ol>\n<h2>Mis edasi<\/h2>\n<p>\n<img decoding=\"async\" alt=\"\u00dchiku testimine andmebaasis \u2014 kuidas me seda Sportmasteris teeme, teine osa\" src=\"\/wp-content\/uploads\/2019\/09\/a11596618e97c0afaa9f5f25b613575e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nR\u00e4\u00e4kigem automatiseeritud testimise projekti arendamise plaanidest.<\/p>\n<p>Ilmselgelt, seni kuni Sportmasteri lojaalsuss\u00fcsteem on eluj\u00f5uline ja arenev, saab ka automatiseeritud teste peaaegu l\u00f5putult arendada. Seet\u00f5ttu on arendamise peamine suund katvuse laiendamine.<\/p>\n<p>Automatiseeritud testide arvu suurenedes kasvab ka nende koguaeg j\u00e4rk-j\u00e4rgult ning peame taas p\u00f6\u00f6rduma efektiivsuse k\u00fcsimuse poole. T\u00f5en\u00e4oliselt on lahendus paralleelsete t\u00f6\u00f6voogude arvu suurendamine.<\/p>\n<p>Kuid need on ilmset arenguteed. Kui r\u00e4\u00e4kida millestki v\u00e4hem triviaalset, siis toome v\u00e4lja j\u00e4rgmised punktid:<\/p>\n<ol>\n<li>Praegu toimub automatiseeritud testimise haldamine andmebaasi tasemel, see t\u00e4hendab, et edukaks t\u00f6\u00f6ks on vajalikud teadmised PL\/SQL-ist. Vajadusel saab s\u00fcsteemi haldamise (nt k\u00e4ivitamiste teostamine v\u00f5i metaandmete loomine) usaldada m\u00f5nele administraatori t\u00f6\u00f6riistale, kasutades Jenkinsit v\u00f5i midagi sarnast.<\/li>\n<li>K\u00f5ik armastavad kvantitatiivseid ja kvalitatiivseid n\u00e4itajaid. Automaatsete testimiste puhul on selliseks universaalseks n\u00e4itajaks koodikatte n\u00e4itaja ehk Code Coverage. Selle abil saame m\u00e4\u00e4rata, kui suur osa testitava s\u00fcsteemi koodist on katte all automaatsete testide poolt. Alates versioonist 12.2 pakub Oracle v\u00f5imalusi selle meetri arvutamiseks ja soovitab kasutada standardpaketti DBMS_PLSQL_CODE_COVERAGE.\n<p>Meie automatiseeritud testimiss\u00fcsteem on n\u00fc\u00fcdseks rohkem kui aasta vana ja v\u00f5ib-olla on just n\u00fc\u00fcd parim aeg katvuse hindamiseks. Minu eelnevas projektis (mis ei olnud Sportmaster) oli see just nii. Aasta p\u00e4rast automatiseeritud testide l\u00e4biviimist andis juhtkond \u00fclesande hinnata, kui suur osa koodist meil kaetud on. Kui katvus oleks olnud \u00fcle 1%, oleks juhtkond olnud rahul. Me, arendajad, ootasime umbes 10% katvust. L\u00f5ime sisse koodikatvuse, m\u00f5\u00f5tsime ja saime 20%. R\u00f5\u00f5mustasid suundusime preemia j\u00e4rele, aga kuidas me selle nimel k\u00e4isime ja kuhu edasi, on hoopis teine lugu.<\/li>\n<li>Automaatkatsetused saavad kontrollida v\u00e4lja pandud veebiteenuseid. Oracle v\u00f5imaldab seda t\u00e4iesti h\u00e4sti, ja me ei kohtu enam terve rida probleeme. <\/li>\n<li>Ja loomulikult saab meie automatiseeritud testimiss\u00fcsteemi kasutada teisel projektil. Meie saavutus on universaalne ja vajab lihtsalt Oracle'i kasutamist. Olen kuulnud, et teistes Sportmasteri projektides on huvi automatiseeritud testimise vastu ja v\u00f5ib-olla suundume neile.<\/li>\n<\/ol>\n<p><\/p>\n<h2>J\u00e4reldused<\/h2>\n<p>\nKokkuv\u00f5tteks. Sportmasteri projektis suutsime rakendada automaatset testimiss\u00fcsteemi lojaalsusprogrammi. Selle aluseks on Stephen Feiersteini lahendus utPLSQL. utPLSQL-i \u00fcmber on autote testimise kood ja abi moodulid: k\u00e4ivitusmoodul, andmete genereerimise moodul ja teised. Autotestimine toimub iga p\u00e4ev ja, mis k\u00f5ige t\u00e4htsam, see t\u00f6\u00f6tab ning toob kasu. Me oleme kindlad, et oleme hakanud tootma kvaliteetsemat tarkvara. Samas on saadud lahendus universaalne ja seda saab vabalt kasutada igasugustes projektides, kus on vajalik korraldada automatiseeritud testimine Oracle'i andmebaasis.<\/p>\n<p><i>P.S. K\u00e4esolev artikkel ei ole v\u00e4ga spetsiifiline: siin on palju teksti ja enamasti puuduvad tehnilised n\u00e4ited. Kui teema on globaalselt huvitav, siis oleme valmis seda j\u00e4tkama ja tagasi tulema j\u00e4tkuga, kus r\u00e4\u00e4gime, mis on viimase kuue kuu jooksul muutunud ja toome n\u00e4iteid koodist.<\/p>\n<p>Kirjutage kommentaare, kui on kohti, millele tulevikus t\u00e4helepanu p\u00f6\u00f6rata v\u00f5i k\u00fcsimusi, mis vajavad avamist.<\/i><\/p>\n<p class=\"for_users_only_msg\">Ainult registreeritud kasutajad saavad k\u00fcsitluses osaleda. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Logige sisse<\/a><\/noindex>, palun.<\/p>\n<h2 class=\"default-block__polling-title\">Kas kirjutame veel sellest?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Jah, muidugi<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Ei, ait\u00e4h<\/p>\n<\/li>\n<\/ul>\n<p>    K\u00fclastajatest h\u00e4\u00e4letas 12. Kaks kasutajat olid erapooletud.<br \/>\n<br \/>Allikas: <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 4.9.10 - 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. \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\" \/>\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\/et\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-vtoraya\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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. \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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/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\udd47\u00dcksuse testimine andmebaasis \u2014 kuidas me seda Sportmasteris teeme, teine osa | ProHoster","description":"Esimene osa \u2014 siin. Kujutage ette olukorda. Teie ees on \u00fclesanne arendada uut funktsionaalsust. Teil on eelk\u00e4ijate t\u00f6id k\u00e4sil. Kui eeldada, et teil pole moraalseid kohustusi, siis kuidas te k\u00e4ituks? Enamasti unustatakse k\u00f5ik vanad ideed ja algab k\u00f5ik nullist. Keegi ei armasta teiste koodis kaevuda, ja kui on olemas","canonical_url":"https:\/\/prohoster.info\/et\/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":"et_EE","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. \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","og:url":"https:\/\/prohoster.info\/et\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/37666","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=37666"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/37666\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/28269"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=37666"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=37666"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=37666"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}