{"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":"\u00dcksuste testimine andmebaasides - 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\/\">siin<\/a><\/noindex>.<\/i><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/465047\/\"><img decoding=\"async\" alt=\"\u00dcksuste testimine andmebaasides - 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. Te peate arendama uut funktsionaalsust. Teil on olemas eelmiste t\u00f6\u00f6tajate materjalid. Kui j\u00e4tta k\u00f5rvale moraalsed kohustused, kuidas te siis k\u00e4ituksite?<\/p>\n<p>Tavaliselt unustatakse k\u00f5ik vanad arendused ja k\u00f5ik hakkab nullist. Keegi ei armasta teiste koodiga vaeva n\u00e4ha, ja kui aega on, siis miks mitte luua oma s\u00fcsteem? See on t\u00fc\u00fcpiline l\u00e4henemine, ja see on suuresti \u00f5ige. Kuid meie projektis tegime teistmoodi. Tulevase automaatsete testide s\u00fcsteemi aluseks saime meie eelk\u00e4ijate utPLSQL unit-testide arendused ning seej\u00e4rel asusime t\u00f6\u00f6tama mitmes paralleelses suunas.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<ol>\n<li><b>Vana unit-testide taastamine.<\/b> Taastamine t\u00e4hendab testide kohandamist olemasoleva lojaalsuss\u00fcsteemi seisuga ja testide kohandamist utPLSQL standarditega. <\/li>\n<li><b>Probleemi lahendamine, et m\u00f5ista, millised meetodid ja protsessid on meie automaatsete testidega kaetud. <\/b>Kas tuleb see teave meeles hoida v\u00f5i teha j\u00e4reldusi otse automaatsete testide koodist. Seet\u00f5ttu otsustasime koostada katalooge. Igale automaatsetele testile andsime unikaalse mnemokoodi, koostasime kirjelduse ja fikseerisime seaded (n\u00e4iteks, millistes tingimustes see peaks k\u00e4ivituma v\u00f5i mis peaks juhtuma, kui testi k\u00e4ivitamine eba\u00f5nnestus). Sisuliselt t\u00e4itsime automaatsete testide meetainformatsiooni ja paigutasime need standardsetesse utPLSQL skeemi tabelitesse.<\/li>\n<li><b>Laiendamisstrateegia m\u00e4\u00e4ratlemine, st funktsionaalsuse valimine, mida tuleb automaatsete testidega kontrollida.<\/b> Otsustasime keskenduda kolmele asjale: s\u00fcsteemi uued t\u00e4iustused, tootmisprobleemid ja s\u00fcsteemi p\u00f5hiprotsessid. Nii arendame end v\u00e4lja paralleelselt v\u00e4ljaande kvaliteedi parandamisega, samal ajal laiendades regressiooni ulatust ja tagades s\u00fcsteemi usaldusv\u00e4\u00e4rsuse kriitilistes kohtades. Esimene kitsaskoht oli allahindluste ja boonuste jaotamise protsess.<\/li>\n<li><b>Loomulikult hakkasime t\u00f6\u00f6tama uute automaatsete testide v\u00e4lja t\u00f6\u00f6tamisega. <\/b>\u00dche esimestest vabastamis\u00fclesannetest oli j\u00f5udluse hindamine eelseadistatud lojaalsuse valimite osas. Meie projektis on plokk rangelt fikseeritud SQL-p\u00e4ringutest, mis valivad kliente tingimuste alusel. N\u00e4iteks, saada k\u00f5igi klientide nimekiri, kelle viimane ost tehti konkreetses linnas, v\u00f5i nimekiri klientidest, kelle keskmine ostusumma \u00fcletab kindlat v\u00e4\u00e4rtust. Kirjutades automaatkatsetusi, kontrollisime eelseadistatud valimeid ja fikseerisime standardseid j\u00f5udluse parameetreid, lisaks saime me koormustestimise.<\/li>\n<li><b>Automaatkatsetustega t\u00f6\u00f6tamine peab olema mugav<\/b>. K\u00f5ige sagedamini tehakse kahte tegevust: automaatkatsete k\u00e4ivitamine ja testandmete loomine. Nii ilmus meie s\u00fcsteemi kaks abimoodulit: k\u00e4ivitamismoodul ja andmete genereerimise moodul.\n<p>K\u00e4ivitamismoodul on esitatud \u00fche universaalse protseduurina, millel on \u00fcks sissekande tekstiparameeter. Parameetrina saab edastada automaatkatse mnemo-koodi, pakettnime, testi nime, automaatkatse seade v\u00f5i reserveeritud v\u00f5tmes\u00f5na. Protseduur valib ja k\u00e4ivitab k\u00f5ik automaatkatsed, mis vastavad tingimustele.<\/p>\n<p>Andmete genereerimise moodul on esitatud paketina, kus iga katsetatava s\u00fcsteemi objekti (tabel andmebaasis) jaoks on loodud spetsiaalne protseduur, mis sisestab sinna andmed. Selles protseduuris on maksimaalselt t\u00e4idetud vaikimisi v\u00e4\u00e4rtused, mis tagavad objektide loomise s\u00f5rmenipsuga. Ja mugavuse huvides on loodud loodud andmete mallid. N\u00e4iteks luua teatud vanuses klient koos testtelefoniga ja sooritatud ostuga.<\/li>\n<li><b>Automaatkatsetused 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 tulemuste p\u00f5hjal koostatakse aruanne ja saadetakse kogu arendusmeeskonnale ettev\u00f5tte e-posti kaudu. P\u00e4rast vanade automaatkatsete taastamist ja uute loomist oli kogu t\u00f6\u00f6aeg 30 minutit. Selline j\u00f5udlus rahuldas k\u00f5iki, kuna k\u00e4ivitamine toimus t\u00f6\u00f6v\u00e4lisel ajal.\n<p>Kuid s\u00fcsteemi t\u00f6\u00f6 kiirusest tuli siiski t\u00f6\u00f6tada. Loodud lojaalsuss\u00fcsteemi uuendamine toimub \u00f6\u00f6sel. \u00dche versiooni raames tuli \u00f6\u00f6sel kiirkorras muudatusi sisse viia. Kella kolme \u00f6\u00f6sel poole tunni ooteaeg automaatkatsete tulemusi ei teinud versiooni eest vastutavat inimest \u00f5nnelikuks (soojad tervitused Aleksei Vasyukovile!), ja j\u00e4rgmisel hommikul \u00f6eldi meie s\u00fcsteemi suunal palju sooje s\u00f5nu. Kuid tulemuseks oli 5-minutilise standardi kehtestamine t\u00f6\u00f6 jaoks.<\/p>\n<p>T\u00f5hususe suurendamiseks kasutasime kahte meetodit: automaatkatseid hakati k\u00e4ivitama kolmes paralleelses voos, \u00f5nneks on see meie lojaalsuss\u00fcsteemi arhitektuuri t\u00f5ttu v\u00e4ga mugav. Ja loobusime l\u00e4henemisest, kus automatiseeritud test ei loo ise testandmeid, vaid p\u00fc\u00fcab leida s\u00fcsteemist sobivaid. P\u00e4rast muudatuste tegemist v\u00e4henes kogu t\u00f6\u00f6 aeg 3\u20134 minutini.<\/li>\n<li><b>Automaatkatsete projekt peab olema v\u00f5imalik erinevates keskkondades kasutusele v\u00f5tta.<\/b> Alguses oli katseid kirjutada oma .bat faile, kuid selgus, et k\u00e4sitsi automatiseeritud seadistus on t\u00e4ielik \u00f5udus ja p\u00f6\u00f6rdusime t\u00f6\u00f6stuslike lahenduste poole. Kuna projektis on v\u00e4ga palju otse koodi (peamiselt hoiame automaatkatsete koodi) ja v\u00e4ga v\u00e4he andmeid (peamised andmed on metainformatsioon automaatkatsete kohta), osutus Liquibase'i juurutamine projektis \u00e4\u00e4rmiselt lihtsaks.\n<p>See on andmebaasist s\u00f5ltumatu avatud l\u00e4htekoodiga teek, mis j\u00e4lgib, haldab ja rakendab andmebaasiskeemi muudatusi. Haldatakse k\u00e4surea v\u00f5i selliste raamistikudega nagu Apache Maven. Liquibase'i t\u00f6\u00f6p\u00f5him\u00f5te on piisavalt lihtne. Meil on teatud viisil korraldatud projekt, mis koosneb muudatustest v\u00f5i skriptidest, mida tuleb sihtserverile rakendada, ja juhtfailidest, mis m\u00e4\u00e4ratlevad, millises j\u00e4rjestuses ja milliste parameetritega andmed muudatused tuleb installida. <\/p>\n<p>Andmebaasi tasemel luuakse spetsiaalne tabel, kus Liquibase hoiab logi muudatuste tegemisest. Iga muudatus omab arvutatud r\u00e4sihashi, mis iga kord v\u00f5rreldakse projekti ja andmebaasi olekuga. T\u00e4nu Liquibase'ile saame me h\u00f5lpsasti rakendada muutusi meie s\u00fcsteemis igas keskkonnas. Autotestid k\u00e4ivitatakse praegu testimis- ja v\u00e4ljalaskekeskkondades, samuti konteinerites (arendajate isiklikud keskkonnad).<\/li>\n<\/ol>\n<p><img decoding=\"async\" alt=\"\u00dcksuste testimine andmebaasides - kuidas me seda Sportmasteris teeme, teine osa\" src=\"\/wp-content\/uploads\/2019\/09\/4306f6c33543d38f5d8b77f67e22e247.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNiisiis, r\u00e4\u00e4gime meie automaatsete testimisse s\u00fcsteemi rakendamise tulemustest. <\/p>\n<ol>\n<li>Muidugi usume k\u00f5igepealt, et oleme hakanud arendama kvaliteetsemat tarkvara. Autotestid k\u00e4ivitatakse iga p\u00e4ev ja igal v\u00e4ljalaskmisel tuvastavad nad k\u00fcmneid vigu. Samuti on osa neist vigadest vaid kaudselt seotud funktsionaalsusega, mida me t\u00f5eliselt soovisime muuta. On suuri kahtlusi, et need vead oleksid leitud k\u00e4sitsi testimise k\u00e4igus. <\/li>\n<li>Meeskonnal on tekkinud kindlus, et konkreetne funktsionaalsus t\u00f6\u00f6tab korrektselt... Esiteks kehtib see meie kriitiliste protsesside kohta. N\u00e4iteks viimase kuue kuu jooksul ei ole meil olnud probleeme soodustuste ja boonuste jaotamisega arve kohta, hoolimata v\u00e4ljalaskmise muudatustest, kuigi varasematel perioodidel tekkisid vead perioodiliselt.<\/li>\n<li>Olemasolevate testimisringide arvu on \u00f5nnestunud v\u00e4hendada. T\u00e4nu sellele, et autotestid kirjutatakse uue funktsionaalsuse jaoks, j\u00f5uab anal\u00fc\u00fctikutele ja samal ajal testijatele kvaliteetsem kood, kuna see on juba testitud.<\/li>\n<li>M\u00f5ningaid automatiseeritud testimise arendusi kasutavad ka arendajad. N\u00e4iteks luuakse konteinerites testandmed objektide genereerimise mooduli abil.<\/li>\n<li>Oluline on, et meil on kujunenud arendajate seas \"vastuv\u00f5tmine\" automatiseeritud testimise s\u00fcsteemile. On arusaam, et see on oluline ja kasulik. Kuid oma kogemuse p\u00f5hjal v\u00f5in \u00f6elda, et see kaugel t\u00f5est t\u00f5si on. Autotestid tuleb kirjutada, neid tuleb toetada ja arendada, tulemusi anal\u00fc\u00fcsida, ja sageli ei ole need ajakulud lihtsalt seda v\u00e4\u00e4rt. Oluliselt lihtsam on minna tootmisse ja seal probleemidega tegeleda. Meie arendajad aga seisavad j\u00e4rjekorras ja paluvad katta nende funktsionaalsus autotestidega.<\/li>\n<\/ol>\n<h2>Mis edasi<\/h2>\n<p>\n<img decoding=\"async\" alt=\"\u00dcksuste testimine andmebaasides - 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\u00e4gime projekti arendamise plaanidest automatiseeritud testimise valdkonnas.<\/p>\n<p>Ilma kahtlemata, kuni Sportmasteri lojaalsuss\u00fcsteem on eluj\u00f5uline ja j\u00e4tkuvalt arenev, on v\u00f5imalik peaaegu l\u00f5pmatult arendada ka automaatkatsetusi. Seet\u00f5ttu on p\u00f5hisuund arengus katteala laiendamine.<\/p>\n<p>Automaatkatsetuste arvu suurenedes hakkab kindlasti suurenema ka nende t\u00f6\u00f6tamise koguaeg, ja me peame taas tegelema j\u00f5udluse k\u00fcsimusega. T\u00f5en\u00e4oliselt on lahendus suurema arvu paralleelsete voogude suurenemises.<\/p>\n<p>Kuid need on ilmsed arenguteed. Kui r\u00e4\u00e4kida millestki v\u00e4hem triviaalset, siis toome v\u00e4lja j\u00e4rgmised:<\/p>\n<ol>\n<li>Praegu toimub automaatkatsete juhtimine andmebaasi tasemel, st edukaks t\u00f6\u00f6ks on vajalikud teadmised PL\/SQL-ist. Kui on vajadus, v\u00f5ib s\u00fcsteemi juhtimise (n\u00e4iteks k\u00e4ivituste teostamine v\u00f5i metaandmete loomine) viia v\u00e4lja mingisse administreerimisse, kasutades Jenkinsit v\u00f5i midagi sarnast.<\/li>\n<li>K\u00f5ik armastavad kvantitatiivseid ja kvalitatiivseid n\u00e4itajaid. Automaatsete testimiste puhul on selline universaalne n\u00e4itaja koodi katteala v\u00f5i Code Coverage. Selle n\u00e4itaja abil saame m\u00e4\u00e4rata, milline protsent meie testitavast s\u00fcsteemist on automaatkatsetega kaetud. Alates versioonist 12.2 pakub Oracle v\u00f5imalusi selle n\u00e4itaja arvutamiseks ja soovitab kasutada standardset paketti DBMS_PLSQL_CODE_COVERAGE.\n<p>Meie automaatkatsete s\u00fcsteem on veidi \u00fcle aasta vana ja v\u00f5ib-olla on n\u00fc\u00fcd parim aeg katteala hindamiseks. Minu eelmises projektis (projekt ei olnud Sportmaster) l\u00e4ks just nii. Aasta p\u00e4rast automaatkatsetustega t\u00f6\u00f6tamist seadis juhtkond \u00fclesande hinnata, kui suur protsent koodist on kaetud. \u00dcle 1% katte saavutamisel oleks juhtkond olnud \u00f5nnelik. Me, arendajad, ootasime tulemust umbes 10%. Panime k\u00e4ima koodi katte, m\u00f5\u00f5tsime ja saime 20%. \u00d5nnestunult l\u00e4ksime preemiat k\u00fcsima, kuid kuidas me preemia saamiseks l\u00e4ksime ja kuhu hiljem suundusime, on hoopis teine lugu.<\/li>\n<li>Automaatkatsetused saavad kontrollida v\u00e4lja antud veebiteenuseid. Oracle v\u00f5imaldab seda teha, ja me ei puutu enam kokku mitmete probleemidega. <\/li>\n<li>Ja, loomulikult saab meie automatiseeritud testimiss\u00fcsteemi rakendada ka teisel projektil. Meie lahendus on universaalne ja vajab vaid Oracle'i kasutamist. Olen kuulnud, et Spordimeistri teistel projektidel on huvi automatiseeritud testimise vastu ja v\u00f5ib-olla suundume nende juurde.<\/li>\n<\/ol>\n<p><\/p>\n<h2>J\u00e4reldused<\/h2>\n<p>\nKokkuv\u00f5tteks. Spordimeistri lojaalsusprojektis \u00f5nnestus meil rakendada automatiseeritud testimiss\u00fcsteem. Selle aluseks on Stephen Feiersteini utPLSQL lahendus. utPLSQL-i \u00fcmber on paigutatud automaattestide kood ja abimoodulid: k\u00e4ivitamisekoht, andmegeneraatori moodul ja teised. Automaatetestid k\u00e4ivitatakse igap\u00e4evaselt ja, mis k\u00f5ige t\u00e4htsam, need toimivad ja toovad kasu. Oleme veendunud, et oleme hakanud tootma k\u00f5rgema kvaliteediga tarkvara. Samas on saadud lahendus universaalne ning seda saab vabalt rakendada igas projektis, kus on vajalik korraldada automatiseeritud testimist Oracle'i andmebaasis.<\/p>\n<p><i>P.S. See artikkel ei ole eriti konkreetne: siin on palju teksti ja praktiliselt puuduvad tehnilised n\u00e4ited. Kui teema on \u00fcldiselt huvitav, siis oleme valmis seda j\u00e4tkama ja naasma j\u00e4tkuga, kus r\u00e4\u00e4gime, mis on viimase kuue kuu jooksul muutunud ja toome n\u00e4iteid koodist.<\/p>\n<p>Palun kirjutage kommentaare, kui on teemasid, millele tulevikus t\u00e4helepanu p\u00f6\u00f6rata, v\u00f5i k\u00fcsimusi, mis vajavad selgitamist.<\/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 sellest edasi?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Jah, loomulikult<\/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>    12 kasutajat h\u00e4\u00e4letas. 4 kasutajat j\u00e4id erapooletuks.<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 5.0.1.1 - 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\/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) 5.0.1.1\" \/>\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.\" \/>\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 testid andmebaasis \u2014 kuidas me seda Spordimeisters teeme, teine osa | ProHoster","description":"Esimene osa \u2014 siin.","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.","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}