{"id":37495,"date":"2019-10-31T22:17:57","date_gmt":"2019-10-31T19:17:57","guid":{"rendered":"https:\/\/prohoster.info\/blog\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-pervaya\/"},"modified":"2019-10-31T22:17:57","modified_gmt":"2019-10-31T19:17:57","slug":"unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-pervaya","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-pervaya","title":{"rendered":"\u00dcksus-testid andmebaasides \u2014 kuidas me seda teeme Sportmasteris, osa \u00fcks","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Tere, Habr!<\/p>\n<p>Minu nimi on Maksim Ponomarenko ja ma olen arendaja Sportmasteris. Mul on 10-aastane kogemus IT-sektoris. Alustasin karj\u00e4\u00e4ri manual testing valdkonnas, seej\u00e4rel siirdusin andmebaaside arendusse. Viimased 4 aastat olen kogunud teadmisi, mis on saadud testimises ja arendamises, ja tegelen automaatse testimise automatiseerimisega andmebaasitasemel.<\/p>\n<p>Sportmasteri meeskonnas olen olnud veidi \u00fcle aasta ja \u00fche suure projekti raames tegeletakse automaatse testimise arendamisega. Aprillis esinesime Sportmaster Labi poisikeste k\u00e4est Konverentsil Krasnodaris, minu ettekande pealkiri oli \"\u00dcksus-testid andmebaasides\" ja n\u00fc\u00fcd tahan jagada seda teiega. Teksti tuleb palju, seega otsustasin ettekande jagada kaheks postituseks. Esimeses r\u00e4\u00e4gime automaatsetest testidest ja testimisest \u00fcldiselt, teises peatun t\u00e4psemalt meie \u00fcksus-testimise s\u00fcsteemil ja selle rakendamise tulemustel.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/464335\/\"><img decoding=\"async\" alt=\"\u00dcksus-testid andmebaasides \u2014 kuidas me seda teeme Sportmasteris, osa \u00fcks\" src=\"\/wp-content\/uploads\/2019\/08\/4e521cc85eb3a3806860a40ab2e4050f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Alguses veidi igavat teooriat. Mis on automaatne testimine? See on testimine, mis viiakse l\u00e4bi tarkvaraliste vahenditega, ja t\u00e4nap\u00e4eva IT-s kasutatakse seda \u00fcha enam tarkvara arendamisel. See on seotud sellega, et ettev\u00f5tted kasvavad, kasvavad nende info- ja s\u00fcsteemid ning sellest tulenevalt suureneb ka testitava funktsionaalsuse hulk. Manual testimise l\u00e4biviimine muutub j\u00e4rjest keerulisemaks.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nOlen t\u00f6\u00f6tanud \u00fches suures ettev\u00f5ttes, mille v\u00e4ljaanded toimuvad kord kahe kuu jooksul. Sel juhul kulus terve kuu selleks, et tosin testijat k\u00e4sitsi funktsionaalsust kontrollis. T\u00e4nu automatiseerimise rakendamisele v\u00e4ikese arendajate meeskonnaga suudeti meil poolteise aastaga testimise aega v\u00e4hendada kahe n\u00e4dalani. Me mitte ainult ei suurendanud testimise kiirus, vaid parandasime ka selle kvaliteeti. Automaatne testid k\u00e4ivitatakse regulaarselt ja nad l\u00e4bivad alati kogu neid sisse kodeeritud kontrollide kursuse, st v\u00e4listame inimfaktori. <\/p>\n<p>T\u00e4nap\u00e4eva IT-le on iseloomulik, et arendajalt v\u00f5ib n\u00f5uda mitte ainult toote koodi kirjutamist, vaid ka \u00fcksus-testide kirjutamist, mis seda koodi kontrollivad. <\/p>\n<p>Aga mis siis, kui teie s\u00fcsteem p\u00f5hineb peamiselt serveriloogikal? \u00dcksnes universaalse lahenduse ja parimatest praktikadest turul ei ole. \u00dcldiselt lahendavad firmad selle probleemi, luues oma kohandatud testimiss\u00fcsteemi. Selline kohandatud automatiseeritud testimiss\u00fcsteem loodi ka meie projektis, millest r\u00e4\u00e4gin oma ettekandes. <\/p>\n<p><img decoding=\"async\" alt=\"\u00dcksus-testid andmebaasides \u2014 kuidas me seda teeme Sportmasteris, osa \u00fcks\" src=\"\/wp-content\/uploads\/2019\/08\/fee34f7214fb2075ee50fa0f4af14a44.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Testime lojaalsust<\/h2>\n<p>\nR\u00e4\u00e4gime k\u00f5igepealt projektist, kus k\u00e4ivitasime automatiseeritud testimiss\u00fcsteemi. Meie projekt on Spordimeistri lojaalsuss\u00fcsteem (\u00fctleme siinkohal, et oleme sellest juba kirjutanud <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/453252\/\">selles postituses<\/a><\/noindex>).<\/p>\n<p>Kui teie ettev\u00f5te on piisavalt suur, siis teie lojaalsuss\u00fcsteem omab kolme standardset omadust: <\/p>\n<ul>\n<li>Teie s\u00fcsteem on k\u00f5rge koormusega<\/li>\n<li>Teie s\u00fcsteem sisaldab keerulisi arvutusprotsesse<\/li>\n<li>Teie s\u00fcsteemi arendatakse pidevalt edasi. <\/li>\n<\/ul>\n<p>\nLiigume j\u00e4rjekorras edasi\u2026 Kokku on Spordimeistri br\u00e4ndide puhul Venemaal, Ukrainas, Hiinas, Kasahstanis ja Valgevenes rohkem kui 1000 poodi. Nendes poodides toimub igap\u00e4evaselt umbes 300 000 ostu. See t\u00e4hendab, et meie s\u00fcsteemi j\u00f5uab iga sekund 3-4 t\u0161ekki. Loomulikult on meie lojaalsuss\u00fcsteem k\u00f5rge koormusega. Ja kuna seda kasutatakse aktiivselt, peame tagama k\u00f5ige k\u00f5rgemad kvaliteedistandardid, sest iga tarkvara viga t\u00e4hendab suuri rahalisi, maine ja muid kaotusi. <\/p>\n<p>Samuti t\u00f6\u00f6tab Spordimeistri juures korraga \u00fcle saja erineva kampaania. Kampaaniad on v\u00e4ga erinevad: on tootekampaaniaid, n\u00e4dalap\u00e4evadega seotud kampaaniaid, teatud poodidega seotud kampaaniaid, t\u0161eki summale seotud kampaaniaid ja toote arvu p\u00f5hjal kampaaniaid. \u00dches\u00f5naga, \u00fcsna mitmekesine. Klientidel on boonused, on sooduskoodid, mida kasutatakse ostude ajal. K\u00f5ik see teeb igasuguste tellimuste arvestamise \u00fcsna keeruliseks \u00fclesandeks. <\/p>\n<p>Tellimusprotsessi rakendav algoritm on t\u00f5eliselt kohutav ja keeruline. Iga muutus sellesse algoritmi on piisavalt riskantne. Tunduvad, et k\u00f5ige v\u00e4iksemadki muutused v\u00f5ivad tuua kaasa ettearvamatuid m\u00f5ju. Just need keerulised arvutusprotsessid, eriti kriitilise funktsionaalsuse rakendamine, on parimad kandidaadid automatiseerimiseks. K\u00fcmnete sarnaste juhtumite k\u00e4sitsi kontrollimine on ajakulukas. Ja kuna protsessi sisenemiskoht j\u00e4\u00e4b muutumatuks, on v\u00f5imalik selle korduv kirjeldamisega \u00fcsna kiiresti luua automaatsed testid ning olla kindel funktsionaalsuse t\u00f6\u00f6s.<\/p>\n<p>Kuna meie s\u00fcsteemi kasutatakse aktiivselt, soovib \u00e4ri teilt midagi uut, et p\u00fcsida ajaga samas tempos ja olla kliendikeskne. Meie lojaalsuss\u00fcsteemis ilmusid v\u00e4rskendused iga kahe kuu tagant. See t\u00e4hendab, et iga kahe kuu tagant peame l\u00e4bi viima kogu s\u00fcsteemi t\u00e4ieliku regressiooni. Loomulikult ei l\u00e4he arendus kohe arendaja poolt tootmisse. See s\u00fcnnib arendaja keskkonnas, seej\u00e4rel l\u00e4bib j\u00e4rk-j\u00e4rgult testimise, v\u00e4ljalaske ja vastuv\u00f5tu etapid ning alles seej\u00e4rel j\u00f5uab tootmisse. Minimaalselt peame testimis- ja v\u00e4ljalaskekeskkondades viima l\u00e4bi kogu s\u00fcsteemi t\u00e4ieliku regressiooni. <\/p>\n<p>Kirjeldatud omadused on standardseks peaaegu igas lojaalsuss\u00fcsteemis. R\u00e4\u00e4gime meie projekti erip\u00e4radest.<\/p>\n<p>Tehniliselt on 90% meie lojaalsuss\u00fcsteemi loogikast serveripoolne ja see on teostatud Oracle'is. Seal on kliendi rakendus Delphi p\u00f5hjal, mis t\u00e4idab administraatori APM-i funktsiooni. Samuti on olemas veebiteenused v\u00e4listele rakendustele (n\u00e4iteks veebileht). Seet\u00f5ttu on t\u00e4iesti loogiline, et kui me tahame rakendada automatiseeritud testimiss\u00fcsteemi, teeme seda Oracle'i keskkonnas.<\/p>\n<p>Sportmasteri lojaalsuss\u00fcsteem on olnud toimimas \u00fcle 7 aasta ja selle loomine on olnud \u00fcksikute arendajate t\u00f6\u00f6\u2026 Meie projekti keskmine arendajate arv selle 7 aasta jooksul oli 3-4 inimest. Kuid viimase aasta jooksul on meie meeskond oluliselt suurenenud, ja n\u00fc\u00fcd t\u00f6\u00f6tavad projekti kallal 10 inimest. See t\u00e4hendab, et projekti tulevad inimesed, kes pole tuttavad t\u00fc\u00fcpiliste \u00fclesannete, protsesside ja arhitektuuriga. Seega on olemas suurenenud risk, et me j\u00e4tame vead t\u00e4helepanuta.<\/p>\n<p>Projektile on iseloomulik, et puuduvad spetsiaalsed testijad omaenese ametikohtadel. Testimine toimub kindlasti, kuid testimisega tegelevad anal\u00fc\u00fctikud, lisaks oma muudele p\u00f5hi\u00fclesannetele: suhtlemine \u00e4riklientidega, kasutajatega, s\u00fcsteemi n\u00f5udmiste t\u00f6\u00f6tlemine jne. Ja kuigi testimine toimub v\u00e4ga kvaliteetselt (eriti sobib see mainida, sest m\u00f5ni anal\u00fc\u00fctik v\u00f5ib selle aruande silmade ette saada), ei saa eirata spetsialiseerumise ja \u00fchele asjale keskendumise efektiivsust.<\/p>\n<p>Arvestades eeltoodut, n\u00e4ib projekti testimise automatiseerimise idee kvaliteedi t\u00f5stmiseks ja arendamise ajakava l\u00fchendamiseks t\u00e4iesti loogiline. Ja s\u00fcsteemi lojaalsuse erinevatel arenguetappidel on erinevad arendajad teinud j\u00f5upingutusi, et katta oma kood \u00fcksustestidega. See oli \u00fcldiselt piisavalt killustunud protsess, kus iga\u00fchel oli oma arhitektuur ja meetodid. \u00dcksustestide osas olid \u00fchisteks tulemusteks: testid t\u00f6\u00f6tati v\u00e4lja, kas kasutati m\u00f5nda aega, pandi versioonihaldusfailide varamusse, kuid mingil hetkel peatus nende k\u00e4itamine ja need unustati. Peamiselt juhtus see, et testid olid rohkem seotud konkreetse t\u00e4itjaga, mitte projektiga.<\/p>\n<h2>Appi tuleb utPLSQL<\/h2>\n<p>\n<img decoding=\"async\" alt=\"\u00dcksus-testid andmebaasides \u2014 kuidas me seda teeme Sportmasteris, osa \u00fcks\" src=\"\/wp-content\/uploads\/2019\/08\/f21dfcb085aace687566dc51cb9b5613.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKas tead midagi Steven Feuersteini kohta? <\/p>\n<p>See on nutikas mees, kes on suure osa oma karj\u00e4\u00e4rist p\u00fchendanud Oracle'i ja PL\/SQL-iga t\u00f6\u00f6tamisele, kirjutades selle teemal piisavalt palju teoseid. \u00dcks tuntud raamat kannab nime: \u201eOracle PL\/SQL. Professionaalidele\u201d. Just Stephenile kuulub lahenduse utPLSQL v\u00e4ljat\u00f6\u00f6tamine, mis t\u00e4hendab Unit Testing framework for Oracle PL\/SQL. Lahendus utPLSQL loodi 2016. aastal, kuid selle kallal t\u00f6\u00f6tatakse endiselt aktiivselt ja v\u00e4lja antakse uusi versioone. Eesoleva ettekande ajal oli viimane versioon dateeritud 24. m\u00e4rtsiks 2019.<br \/>\nMis see siis on? See on eraldi avatud l\u00e4htekoodi projekt. Kaalub paar megabaiti koos n\u00e4idiste ja dokumentatsiooniga. F\u00fc\u00fcsiliselt esindab see eraldi skeemi andmebaasis ORACLE koos pakettide ja tabelitega, et korraldada unit-teste. Paigaldamine v\u00f5tab paar sekundit. UtPLSQL'i erip\u00e4ra on lihtne kasutamine. <br \/>\nGlobaalset vaadates esindab utPLSQL mehhanismi unit-testide k\u00e4ivitamiseks, kus unit-test on tavalised Oracle'i pakettprotseduurid, mille korraldus vastab teatud reeglitele. Lisaks k\u00e4ivitamisele salvestab utPLSQL logi k\u00f5igist teie testide k\u00e4ivitamistest ning seal on ka sisemine aruandluss\u00fcsteem.<\/p>\n<p>Vaatame n\u00e4itena, milline on unit-testi kood, mis on rakendatud vastavalt sellele meetodile.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcksus-testid andmebaasides \u2014 kuidas me seda teeme Sportmasteris, osa \u00fcks\" src=\"\/wp-content\/uploads\/2019\/08\/6fc8cc2d84c6c32a8b5269ebad1d2381.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNii et ekraanil on esitatud t\u00fc\u00fcpilise paketi spetsifikatsiooni kood koos unit-testidega. Millised on kohustuslikud n\u00f5uded? Paketil peab olema etteantud \u201eutp_\u201d eesliide. T\u00e4pselt sama eesliide peavad kandma k\u00f5ik testide protseduurid. Paketis peavad olema kaks standardset protseduuri: \u201eutp_setup\u201d ja \u201eutp_teardown\u201d. Esimene protseduur k\u00e4ivitatakse iga unit-testi k\u00e4ivitamisel, teine \u2014 p\u00e4rast k\u00e4ivitamist.<\/p>\n<p>\u201eutp_setup\u201d valmistab tavaliselt meie s\u00fcsteemi valmistama unit-testi k\u00e4ivitamiseks, n\u00e4iteks luues testandmed. \u201eutp_teardown\u201d tagastab k\u00f5ik vastupidiselt algsetele seadetele ja nullib k\u00e4ivitamise tulemused.<\/p>\n<p>Siin on n\u00e4ide k\u00f5ige lihtsamast unit-testist, mis kontrollib kliendi sisestatud telefoninumbri normaliseerimist meie lojaalsuss\u00fcsteemi standardkuju vastavusse. Kohustuslikke standardeid unit-testide protseduuride kirjutamiseks ei ole. \u00dcldiselt kutsutakse esile mingi meetod testitavas s\u00fcsteemis ning selle meetodi tagastatud tulemust v\u00f5rreldakse etaloniga. On oluline, et etalonitulemuse ja saadud tulemuse v\u00f5rdlemine toimuks standardsete utPLSQL meetodite kaudu.<\/p>\n<p>Unit-testis v\u00f5ib olla \u00fcksk\u00f5ik kui palju kontrollimisi. Nagu n\u00e4ha n\u00e4ites, teeme neli j\u00e4rjestikust kutsumist testitavale meetodile telefoninumbri normaliseerimiseks ja p\u00e4rast iga kutsumist hindame tulemust. Unit-testi arendamisel tuleb arvestada, et on olemas kontrolle, mis ei m\u00f5juta s\u00fcsteemi, ja p\u00e4rast m\u00f5ningaid tuleb s\u00fcsteem tagasi algsesse olekusse viia. <br \/>\nN\u00e4iteks esitatud unit-testis lihtsalt vormindame sisestatud telefoninumbri, mis ei m\u00f5juta lojaalsuss\u00fcsteemi. <\/p>\n<p>Ja kui kirjutame unit-teste uue kliendi loomise meetodi jaoks, siis p\u00e4rast iga kontrolli luuakse s\u00fcsteemis uus klient, mis v\u00f5ib m\u00f5jutada katse j\u00e4rgnevat k\u00e4ivitamist.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcksus-testid andmebaasides \u2014 kuidas me seda teeme Sportmasteris, osa \u00fcks\" src=\"\/wp-content\/uploads\/2019\/08\/7d649b354776c15d8a70a0d9a05363b4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNii k\u00e4ivituvad unit-testid. Lubatud on kaks k\u00e4ivitamise varianti: k\u00f5igi unit-testide k\u00e4ivitamine konkreetsest paketist v\u00f5i konkreetse unit-testi k\u00e4ivitamine konkreetses paketis.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcksus-testid andmebaasides \u2014 kuidas me seda teeme Sportmasteris, osa \u00fcks\" src=\"\/wp-content\/uploads\/2019\/08\/46628b60eb0fe0d20df822ddca914947.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNii n\u00e4eb v\u00e4lja n\u00e4ide sisemisest aruandluss\u00fcsteemist. Unit-testi tulemuste p\u00f5hjal koostab utPLSQL v\u00e4ikese aruande. Selles n\u00e4eme iga konkreetse kontrolli tulemusi ja unit-testi \u00fcldist tulemuse. <\/p>\n<h2>6 automaattestimise reeglit<\/h2>\n<p>\nEnne automaattestimise s\u00fcsteemi loomisega alustamist m\u00e4\u00e4rasime koos juhtimisega p\u00f5him\u00f5tted, millele meie tulevased automaattestid peavad vastama.<\/p>\n<p><img decoding=\"async\" alt=\"\u00dcksus-testid andmebaasides \u2014 kuidas me seda teeme Sportmasteris, osa \u00fcks\" src=\"\/wp-content\/uploads\/2019\/08\/84be59663203abb373e7074b9a6cd4e4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ol>\n<li>Autotestid peavad olema t\u00f5husad ja need peavad tooma kasu. Meil on suurep\u00e4rased arendajad, kellest on kindlasti vaja r\u00e4\u00e4kida, sest keegi neist n\u00e4eb t\u00f5en\u00e4oliselt seda ettekannet ja nad kirjutavad suurep\u00e4rast koodi. Kuid isegi nende suurep\u00e4rane kood ei ole ideaalne ning sisaldas, sisaldab ja sisaldab ka edaspidi vigu. Autotestid peavad need vead leidma. Kui see ei ole nii, siis kas kirjutame me halbu autoteste v\u00f5i oleme j\u00f5udnud surnud piirkonda, mida lihtsalt ei arendata. M\u00f5lemal juhul teeme me midagi valesti ja meie l\u00e4henemine on m\u00f5ttetu.<\/li>\n<li>Autoteste peab kasutama. Pole m\u00f5tet kulutada kuhjaga aega ja vaeva tarkvaratoote kirjutamisele, selle hoidla kokku panemisele ja siis unustada see. Testid peavad k\u00e4ivituma ja k\u00e4ivituma v\u00f5imalikult regulaarselt.<\/li>\n<li>Autotestid peavad t\u00f6\u00f6tama stabiilselt. \u00dcksk\u00f5ik millal testid k\u00e4ivitatakse, olgu see \u00f6\u00f6 v\u00f5i p\u00e4ev, s\u00fcsteemi seadistused v\u00f5i muud seaded, peavad testide k\u00e4ivitamised andma sama tulemuse. Reeglina tagab selle, et autotestid t\u00f6\u00f6tavad spetsiaalsete testandmete ja fikseeritud s\u00fcsteemi seadistustega.<\/li>\n<li>Autotestid peavad t\u00f6\u00f6tama teie projekti jaoks vastuv\u00f5etava kiirusena. See aeg m\u00e4\u00e4ratakse individuaalselt iga s\u00fcsteemi jaoks. Kes suudab t\u00f6\u00f6tada terve p\u00e4eva, kuid kellelegi on kriitiline ajas sekunditesse mahtuda. Milliseid kiirusstandardeid oleme oma projektis saavutanud, r\u00e4\u00e4gin ma veidi hiljem.<\/li>\n<li>Autotestide arendamine peab olema paindlik. Ei ole soovitatav loobuda mingi funktsionaalsuse kontrollimisest lihtsalt seet\u00f5ttu, et me pole seda varem teinud v\u00f5i mingite muude veendumuste t\u00f5ttu. utPLSQL ei sea arendusele mingeid piiranguid ja Oracle v\u00f5imaldab \u00fcldiselt ellu viia k\u00f5ige erinevamaid asju. Enamiku \u00fclesannete jaoks on lahendused olemas, k\u00fcsimus on ainult ajas ja tehtud pingutustes.<\/li>\n<li>K\u00e4ivituvus. Meil on mitmeid keskkondi, kus testide k\u00e4ivitamine on vajalik. Igas keskkonnas v\u00f5ib igal ajal andmete dump olla uuendatud. Projekti autotestide arendamisega tuleb juhtida selliselt, et oleks v\u00f5imalik teostada selle t\u00e4is- v\u00f5i osaline installatsioon valutult.<\/li>\n<\/ol>\n<p>Ja teises postituses paar p\u00e4eva hiljem r\u00e4\u00e4gin, mida me saavutasime ja milliseid tulemusi me v\u00e4lja t\u00f6\u00f6tasime.<br \/>\n<br \/>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/464335\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0430\u043a\u0441\u0438\u043c \u041f\u043e\u043d\u043e\u043c\u0430\u0440\u0435\u043d\u043a\u043e \u0438 \u044f \u2014 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440\u0435. \u0418\u043c\u0435\u044e 10-\u043b\u0435\u0442\u043d\u0438\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 IT-\u0441\u0444\u0435\u0440\u0435. \u041d\u0430\u0447\u0438\u043d\u0430\u043b \u043a\u0430\u0440\u044c\u0435\u0440\u0443 \u0432 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 4 \u0433\u043e\u0434\u0430, \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u0438\u0440\u0443\u044f \u0437\u043d\u0430\u043d\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0432 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435, \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0421\u0423\u0411\u0414. \u0412 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u044f \u0441\u043e\u0441\u0442\u043e\u044e \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0433\u043e\u0434\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28136,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37495","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\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0430\u043a\u0441\u0438\u043c \u041f\u043e\u043d\u043e\u043c\u0430\u0440\u0435\u043d\u043a\u043e \u0438 \u044f \u2014 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440\u0435. \u0418\u043c\u0435\u044e 10-\u043b\u0435\u0442\u043d\u0438\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 IT-\u0441\u0444\u0435\u0440\u0435. \u041d\u0430\u0447\u0438\u043d\u0430\u043b \u043a\u0430\u0440\u044c\u0435\u0440\u0443 \u0432 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445.\" \/>\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-pervaya\" \/>\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 \u043f\u0435\u0440\u0432\u0430\u044f | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0430\u043a\u0441\u0438\u043c \u041f\u043e\u043d\u043e\u043c\u0430\u0440\u0435\u043d\u043a\u043e \u0438 \u044f \u2014 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440\u0435. \u0418\u043c\u0435\u044e 10-\u043b\u0435\u0442\u043d\u0438\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 IT-\u0441\u0444\u0435\u0440\u0435. \u041d\u0430\u0447\u0438\u043d\u0430\u043b \u043a\u0430\u0440\u044c\u0435\u0440\u0443 \u0432 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445.\" \/>\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-pervaya\" \/>\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:17:57+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:17:57+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, esimeses osas | ProHoster","description":"Tere, Habr! Minu nimi on Maxim Ponomarenko ja ma olen arendaja Sportmasteris. Mul on 10-aastane kogemus IT-valdkonnas. Alustasin karj\u00e4\u00e4ri k\u00e4sitsi testimise valdkonnas, seej\u00e4rel suundusin andmebaaside arendamisele.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-pervaya","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 \u043f\u0435\u0440\u0432\u0430\u044f | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041c\u0430\u043a\u0441\u0438\u043c \u041f\u043e\u043d\u043e\u043c\u0430\u0440\u0435\u043d\u043a\u043e \u0438 \u044f \u2014 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u0421\u043f\u043e\u0440\u0442\u043c\u0430\u0441\u0442\u0435\u0440\u0435. \u0418\u043c\u0435\u044e 10-\u043b\u0435\u0442\u043d\u0438\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 IT-\u0441\u0444\u0435\u0440\u0435. \u041d\u0430\u0447\u0438\u043d\u0430\u043b \u043a\u0430\u0440\u044c\u0435\u0440\u0443 \u0432 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445.","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-pervaya","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:17:57+00:00","article:modified_time":"2019-10-31T19:17:57+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37495","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:06:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:25:27","updated":"2026-01-23 18:06: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\/37495","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=37495"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/37495\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/28136"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=37495"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=37495"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=37495"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}