{"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\/ro\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-vtoraya","title":{"rendered":"Teste unitare \u00een SGBD \u2014 cum facem noi la Sportmaster, partea a doua","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i>Prima parte \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/464335\/\">aici<\/a><\/noindex>.<\/i><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/465047\/\"><img decoding=\"async\" alt=\"Teste unitare \u00een SGBD \u2014 cum facem noi la Sportmaster, partea a doua\" src=\"\/wp-content\/uploads\/2019\/09\/b9fb8c934885abdf3ef928bfd75bdc2a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Imagina\u021bi-v\u0103 o situa\u021bie. Ave\u021bi sarcina de a dezvolta o nou\u0103 func\u021bionalitate. Ave\u021bi la dispozi\u021bie munca celor care v-au precedat. Dac\u0103 presupunem c\u0103 nu ave\u021bi obliga\u021bii morale, cum a\u021bi proceda?<\/p>\n<p>Cel mai adesea, toate vechile lucr\u0103ri cad \u00een uitare \u0219i totul \u00eencepe de la zero. Nimeni nu iube\u0219te s\u0103 sape prin codul altora, iar dac\u0103 ave\u021bi timp, de ce s\u0103 nu v\u0103 ocupa\u021bi de crearea propriului sistem? Aceasta este o abordare tipic\u0103 \u0219i \u00een mare parte corect\u0103. Dar \u00een proiectul nostru am procedat diferit. Am bazat viitorul sistem de testare automat\u0103 pe lucr\u0103rile anterioare privind testele unitare \u00een utPLSQL ale predecesorilor no\u0219tri, apoi am \u00eenceput s\u0103 lucr\u0103m \u00een mai multe direc\u021bii paralele.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<ol>\n<li><b>Restaurarea vechilor teste unitare.<\/b> Prin restaurare se \u00een\u021belege adaptarea testelor la starea actual\u0103 a sistemului de loialitate \u0219i adaptarea testelor la standardele utPLSQL. <\/li>\n<li><b>Solu\u021bionarea problemei de \u00een\u021belegere a ceea ce anume, ce metode \u0219i procese sunt acoperite de testele automate. <\/b>Trebuie fie s\u0103 p\u0103str\u0103m aceste informa\u021bii \u00een minte, fie s\u0103 facem concluzii pe baza codului testelor automate. De aceea, am decis s\u0103 form\u0103m un catalog. Fiecare test automat a primit un cod mnemotehnic unic, am creat o descriere \u0219i am \u00eenregistrat set\u0103rile (de exemplu, \u00een ce condi\u021bii ar trebui s\u0103 fie rulat sau ce ar trebui s\u0103 se \u00eent\u00e2mple dac\u0103 testul e\u0219ueaz\u0103). Practic, ne-am completat metadatele despre testele automate \u0219i le-am plasat \u00een tabele standard ale schemei utPLSQL.<\/li>\n<li><b>Definirea strategiei de extindere, adic\u0103 alegerea func\u021bionalit\u0103\u021bilor care urmeaz\u0103 s\u0103 fie verificate de testele automate.<\/b> Am decis s\u0103 ne concentr\u0103m pe trei aspecte: \u00eembun\u0103t\u0103\u021birile noi ale sistemului, incidentele din produc\u021bie \u0219i procesele cheie ale sistemului. Astfel, ne dezvolt\u0103m \u00een paralel cu lansarea, asigur\u00e2nd o calitate mai \u00eenalt\u0103 a acesteia, extinz\u00e2nd \u00een acela\u0219i timp volumul regresiei \u0219i asigur\u00e2nd fiabilitatea sistemului \u00een locurile critice. Prima astfel de potec\u0103 a fost procesul de distribuire a discounturilor \u0219i bonusurilor pe bon.<\/li>\n<li><b>\u00cen mod evident, ne-am pus pe dezvoltarea de noi teste automate. <\/b>Una dintre primele sarcini de lansare a fost evaluarea performan\u021bei selec\u021biilor predefinite ale sistemului de loialitate. \u00cen proiectul nostru, exist\u0103 un bloc de interog\u0103ri SQL fixe care aleg clien\u021bii pe diverse criterii. De exemplu, ob\u021binerea unei liste cu to\u021bi clien\u021bii ale c\u0103ror achizi\u021bii recente au fost efectuate \u00eentr-un ora\u0219 specific, sau a clien\u021bilor a c\u0103ror valoare medie a achizi\u021biei dep\u0103\u0219e\u0219te o anumit\u0103 sum\u0103. Scriind teste automate, am verificat selec\u021biile predefinite, am fixat parametrii de referin\u021b\u0103 pentru performan\u021b\u0103, iar suplimentar am realizat teste de stres.<\/li>\n<li><b>Lucrul cu teste automate trebuie s\u0103 fie confortabil<\/b>. Cele mai frecvente dou\u0103 ac\u021biuni sunt: lansarea testelor automate \u0219i crearea de date de test. Astfel, \u00een sistemul nostru au ap\u0103rut dou\u0103 module auxiliare: modulul de lansare \u0219i modulul de generare a datelor.\n<p>Modulul de lansare este prezentat sub forma unei proceduri universale cu un singur parametru textual de intrare. Ca parametru, se poate transmite mnemonic al testului automat, numele pachetului, numele testului, configura\u021bia testului automat sau un cuv\u00e2nt cheie rezervat. Procedura selecteaz\u0103 \u0219i lanseaz\u0103 toate testele automate care \u00eendeplinesc condi\u021biile.<\/p>\n<p>Modulul de generare a datelor este prezentat sub forma unui pachet, \u00een care pentru fiecare obiect al sistemului testat (tabel din baza de date) a fost creat\u0103 o procedur\u0103 special\u0103 care insereaz\u0103 date \u00een acel tabel. Aceast\u0103 procedur\u0103 completeaz\u0103 valorile implicite la maximum, ceea ce permite crearea de obiecte cu un simplu clic. \u0218i pentru a spori confortul utiliz\u0103rii, au fost create \u0219abloane pentru datele generate. De exemplu, crearea unui client de o anumit\u0103 v\u00e2rst\u0103 cu un num\u0103r de telefon de test \u0219i o achizi\u021bie efectuat\u0103.<\/li>\n<li><b>Teste automate trebuie s\u0103 fie lansate \u0219i s\u0103 func\u021bioneze \u00eentr-un timp acceptabil pentru sistemul dumneavoastr\u0103. <\/b>De aceea, a fost organizat un program zilnic de lansare nocturn\u0103, iar rezultatele sunt compilate \u00eentr-un raport care este trimis \u00eentregii echipe de dezvoltare prin e-mail corporativ. Dup\u0103 restaurarea testelor automate anterioare \u0219i crearea unor teste noi, timpul total de execu\u021bie a fost de 30 de minute. Performan\u021ba similar\u0103 a fost satisf\u0103c\u0103toare pentru to\u021bi, deoarece lansarea avea loc \u00een afara orelor de lucru.\n<p>\u00cens\u0103 optimizarea vitezei de lucru a necesitat o aten\u021bie special\u0103. Actualizarea sistemului de loialitate \u00een produc\u021bie se face noaptea. \u00cen cadrul uneia dintre lans\u0103ri, a fost necesar\u0103 efectuarea urgent\u0103 a unor modific\u0103ri \u00een timpul nop\u021bii. O a\u0219teptare de o jum\u0103tate de or\u0103 pentru rezultatele testelor automate la trei diminea\u021ba nu l-a f\u0103cut pe cel responsabil de lansare foarte fericit (un salut c\u0103lduros lui Alexei Vasiukov!), iar diminea\u021ba, \u00een direc\u021bia sistemului nostru s-au spus multe cuvinte frumoase. Dar, \u00een final, a fost stabilit un standard de 5 minute pentru func\u021bionare.<\/p>\n<p>Pentru a accelera performan\u021ba, am folosit dou\u0103 metode: testele automate au \u00eenceput s\u0103 fie executate \u00een trei fluxuri paralele, ceea ce este foarte convenabil datorit\u0103 arhitecturii sistemului nostru de loialitate. De asemenea, am renun\u021bat la abordarea \u00een care testul automat nu \u00ee\u0219i creeaz\u0103 date de testare pentru sine, ci \u00eencearc\u0103 s\u0103 g\u0103seasc\u0103 ceva potrivit \u00een sistem. Dup\u0103 efectuarea modific\u0103rilor, timpul total de lucru s-a redus la 3-4 minute.<\/li>\n<li><b>Proiectul cu teste automate trebuie s\u0103 poat\u0103 fi desf\u0103\u0219urat pe diverse standuri.<\/b> La \u00eenceputul c\u0103l\u0103toriei, au existat \u00eencerc\u0103ri de a scrie propriile scripturi batch, dar a devenit clar c\u0103 o instalare automatizat\u0103 f\u0103cut\u0103 \u00een cas\u0103 este o adev\u0103rat\u0103 tragedie, a\u0219a c\u0103 ne-am \u00eendreptat spre solu\u021bii comerciale. Av\u00e2nd \u00een vedere c\u0103 proiectul con\u021bine foarte mult cod (\u00een primul r\u00e2nd, stoc\u0103m codul testelor automate) \u0219i foarte pu\u021bine date (datele principale fiind metadatele despre teste), implementarea Liquibase \u00een proiect s-a dovedit a fi foarte simpl\u0103.\n<p>Este o bibliotec\u0103 independent\u0103 de baza de date, cu surs\u0103 deschis\u0103, pentru monitorizarea, gestionarea \u0219i aplicarea modific\u0103rilor schemei bazei de date. Se gestioneaz\u0103 prin intermediul liniei de comand\u0103 sau al cadrelor precum Apache Maven. Principiul de func\u021bionare al Liquibase este destul de simplu. Avem un proiect organizat \u00eentr-un anumit mod, format din modific\u0103ri sau scripturi care trebuie aplicate pe serverul \u021bint\u0103, \u0219i fi\u0219iere de control care definesc \u00een ce ordine \u0219i cu ce parametri trebuie aplicate aceste modific\u0103ri. <\/p>\n<p>La nivelul SGBD-ului, se creeaz\u0103 un tabel special \u00een care Liquibase stocheaz\u0103 jurnalul modific\u0103rilor. Fiecare modificare are un hash calculat, care este comparat de fiecare dat\u0103 \u00eentre proiect \u0219i starea din baza de date. Datorit\u0103 Liquibase, aplic\u0103m u\u0219or modific\u0103rile sistemului nostru pe orice mediu. Testele automate sunt acum rulate \u00een medii de testare \u0219i de lansare, precum \u0219i pe containere (mediile personale ale dezvoltatorilor).<\/li>\n<\/ol>\n<p><img decoding=\"async\" alt=\"Teste unitare \u00een SGBD \u2014 cum facem noi la Sportmaster, partea a doua\" src=\"\/wp-content\/uploads\/2019\/09\/4306f6c33543d38f5d8b77f67e22e247.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA\u0219adar, haide\u021bi s\u0103 discut\u0103m despre rezultatele aplic\u0103rii sistemului nostru de teste unitare. <\/p>\n<ol>\n<li>Desigur, \u00een primul r\u00e2nd, suntem convin\u0219i c\u0103 am \u00eenceput s\u0103 dezvolt\u0103m software de calitate mai bun\u0103. Testele automate ruleaz\u0103 zilnic \u0219i la fiecare lansare g\u0103sesc zeci de erori. O parte din aceste erori sunt doar indirect legate de func\u021bionalitatea pe care am vrut cu adev\u0103rat s\u0103 o schimb\u0103m. Exist\u0103 mari \u00eendoieli c\u0103 aceste erori ar fi fost descoperite prin testare manual\u0103. <\/li>\n<li>Echipa a c\u0103p\u0103tat \u00eencredere c\u0103 func\u021bionalitatea specific\u0103 func\u021bioneaz\u0103 corect... Acest lucru se refer\u0103, \u00een primul r\u00e2nd, la procesele noastre critice. De exemplu, \u00een ultimele \u0219ase luni, nu am avut probleme cu distribu\u021bia reducerilor \u0219i bonusurilor pe chitan\u021b\u0103, \u00een ciuda modific\u0103rilor la fiecare lansare, de\u0219i \u00een perioadele anterioare, aceste erori ap\u0103reau cu o anumit\u0103 regularitate.<\/li>\n<li>Am reu\u0219it s\u0103 reducem num\u0103rul de itera\u021bii de testare. Datorit\u0103 faptului c\u0103 testele automate sunt scrise pentru func\u021bionalitatea nou\u0103, analizele \u0219i, \u00een acela\u0219i timp, testerii primesc cod de o calitate superioar\u0103, deoarece a fost deja verificat.<\/li>\n<li>O parte din realiz\u0103rile test\u0103rii automate sunt folosite de dezvoltatori. De exemplu, datele de testare pe containere sunt create cu ajutorul modulului de generare a obiectelor.<\/li>\n<li>Este important s\u0103 men\u021bion\u0103m c\u0103 am dezvoltat o \"acceptare\" a sistemului de teste automate din partea dezvoltatorilor. Exist\u0103 o \u00een\u021belegere c\u0103 acest lucru este important \u0219i util. Din experien\u021ba mea pot spune c\u0103 nu este deloc a\u0219a. Testele automate trebuie scrise, sus\u021binute \u0219i dezvoltate, iar rezultatele trebuie analizate, iar adesea aceste eforturi temporale pur \u0219i simplu nu merit\u0103. Este mult mai simplu s\u0103 mergi pe produc\u021bie \u0219i s\u0103 rezolvi problemele de acolo. La noi, dezvoltatorii se a\u0219eaz\u0103 la r\u00e2nd \u0219i cer s\u0103 le acoperim func\u021bionalitatea cu teste automate.<\/li>\n<\/ol>\n<h2>Ce urmeaz\u0103<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Teste unitare \u00een SGBD \u2014 cum facem noi la Sportmaster, partea a doua\" src=\"\/wp-content\/uploads\/2019\/09\/a11596618e97c0afaa9f5f25b613575e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHaide\u021bi s\u0103 discut\u0103m despre planurile de dezvoltare a proiectului de testare automat\u0103.<\/p>\n<p>Desigur, at\u00e2ta timp c\u00e2t sistemul de loialitate al Sportmaster este activ \u0219i continu\u0103 s\u0103 se dezvolte, putem, de asemenea, dezvolta practic nelimitat testele automate. Prin urmare, direc\u021bia principal\u0103 de dezvoltare este extinderea zonei de acoperire.<\/p>\n<p>Pe m\u0103sur\u0103 ce num\u0103rul testelor automate cre\u0219te, timpul total de execu\u021bie va cre\u0219te constant, iar noi va trebui din nou s\u0103 revenim la problema performan\u021bei. Cel mai probabil, solu\u021bia va consta \u00een cre\u0219terea num\u0103rului de fluxuri paralele.<\/p>\n<p>Dar acestea sunt c\u0103i evidente de dezvoltare. Dac\u0103 vorbim despre ceva mai neobi\u0219nuit, s\u0103 eviden\u021biem urm\u0103toarele:<\/p>\n<ol>\n<li>\u00cen prezent, gestionarea testelor automate se face la nivel de SGBD, adic\u0103 este nevoie de cuno\u0219tin\u021be PL\/SQL pentru o munc\u0103 de succes. Dac\u0103 este necesar, gestionarea sistemului (de exemplu, lansarea sau crearea de metadate) poate fi externalizat\u0103 cu un panou de administrare, folosind Jenkins sau un instrument similar.<\/li>\n<li>Toat\u0103 lumea iube\u0219te indicatorii cantitativi \u0219i calitativi. Pentru testarea automat\u0103, un astfel de indicator universal este Code Coverage sau metrica acoperirii codului. Prin acest indicator putem determina ce procent din codul sistemului nostru testat este acoperit de testele automate. \u00cencep\u00e2nd cu versiunea 12.2, Oracle ofer\u0103 posibilit\u0103\u021bi pentru calcularea acestei metrici \u0219i sugereaz\u0103 utilizarea pachetului standard DBMS_PLSQL_CODE_COVERAGE.\n<p>Sistemul nostru de testare automat\u0103 are pu\u021bin peste un an \u0219i, poate, acum este momentul potrivit pentru a evalua acoperirea. \u00cen trecutul meu proiect (care nu este al Sportmaster), a fost exact a\u0219a. Dup\u0103 un an de munc\u0103 asupra testelor automate, conducerea a pus problema de a evalua ce procent din cod acoperim. Cu o acoperire de peste 1%, conducerea ar fi fost fericit\u0103. Noi, dezvoltatorii, ne a\u0219teptam la un rezultat de aproximativ 10%. Am implementat codul de acoperire, am m\u0103surat \u0219i am ob\u021binut 20%. Cu bucurie, am mers s\u0103 cerem o prim\u0103, dar cum am f\u0103cut acest lucru \u0219i unde ne-am \u00eendreptat dup\u0103, este o cu totul alt\u0103 poveste.<\/li>\n<li>Testele automate pot verifica serviciile web expuse. Oracle permite acest lucru f\u0103r\u0103 probleme, iar noi nu ne mai \u00eent\u00e2lnim cu o serie de probleme. <\/li>\n<li>\u0218i, bine\u00een\u021beles, sistemul nostru de testare automat\u0103 poate fi aplicat \u0219i \u00een alt proiect. Solu\u021bia pe care am dezvoltat-o este universal\u0103 \u0219i necesit\u0103 doar utilizarea Oracle. Am auzit c\u0103 exist\u0103 un interes pentru testarea automat\u0103 \u00een alte proiecte ale Sportmaster \u0219i, posibil, ne vom \u00eendrepta c\u0103tre ei.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Conclusions<\/h2>\n<p>\nS\u0103 resum\u0103m. Pe proiectul sistemului de loialitate la Sportmaster, am reu\u0219it s\u0103 implement\u0103m un sistem de testare automat\u0103. Baza acestuia este solu\u021bia utPLSQL de la Steven Feuerstein. \u00cen jurul utPLSQL se afl\u0103 codul testelor automate \u0219i modulele auxiliare personalizate: modul de execu\u021bie, modul de generare a datelor \u0219i altele. Testele automate sunt rulate zilnic \u0219i, ceea ce este cel mai important, func\u021bioneaz\u0103 \u0219i aduc beneficii. Suntem convin\u0219i c\u0103 am \u00eenceput s\u0103 livr\u0103m software de o calitate superioar\u0103. \u00cen acela\u0219i timp, solu\u021bia ob\u021binut\u0103 este universal\u0103 \u0219i poate fi aplicat\u0103 liber \u00een orice proiect unde este necesar\u0103 organizarea test\u0103rii automate pe SGBD Oracle.<\/p>\n<p><i>P.S. Acest articol nu a fost foarte specific: avem mult text \u0219i practic lipsesc exemplele tehnice. Dac\u0103 interesul pentru subiect este global, suntem preg\u0103ti\u021bi s\u0103 continu\u0103m \u0219i s\u0103 revenim cu o continuare, unde vom povesti despre ce s-a schimbat \u00een ultimele \u0219ase luni \u0219i vom aduce exemple de cod.<\/p>\n<p>Scrie\u021bi comentarii dac\u0103 exist\u0103 aspecte la care ar trebui s\u0103 facem accent \u00een viitor sau \u00eentreb\u0103ri care necesit\u0103 clarificare.<\/i><\/p>\n<p class=\"for_users_only_msg\">Numai utilizatorii \u00eenregistra\u021bi pot participa la sondaj. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Conecta\u021bi-v\u0103<\/a><\/noindex>, v\u0103 rug\u0103m.<\/p>\n<h2 class=\"default-block__polling-title\">Continu\u0103m s\u0103 scriem despre a\u0219a ceva?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Da, desigur<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Nu, mul\u021bumesc<\/p>\n<\/li>\n<\/ul>\n<p>    Au votat 12 utilizatori. 4 utilizatori s-au ab\u021binut.<br \/>\n<br \/>Sursa: <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.2.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\/ro\/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.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Teste unitare \u00een SGBD \u2014 cum facem asta la Sportmaster, partea a doua | ProHoster","description":"Partea \u00eent\u00e2i \u2014 aici.","canonical_url":"https:\/\/prohoster.info\/ro\/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":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/37666","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=37666"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/37666\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/28269"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=37666"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=37666"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=37666"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}