{"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\/sv\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-pervaya","title":{"rendered":"Enhetstester i databashanterare \u2013 hur vi g\u00f6r det p\u00e5 Sportmaster, del ett","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hej, Habr!<\/p>\n<p>Jag heter Maxim Ponomarenko och jag \u00e4r utvecklare p\u00e5 Sportmaster. Jag har 10 \u00e5rs erfarenhet inom IT-branschen. Jag inledde min karri\u00e4r inom manuell testning och gick sedan \u00f6ver till databasutveckling. Under de senaste 4 \u00e5ren, genom att samla p\u00e5 mig kunskaper fr\u00e5n b\u00e5de testning och utveckling, har jag arbetat med automatisering av tester p\u00e5 databashanterar niv\u00e5.<\/p>\n<p>Jag har varit en del av Sportmaster-teamet i lite mer \u00e4n ett \u00e5r och p\u00e5 ett av de st\u00f6rre projekten arbetar jag med utvecklingen av automatiserade tester. I april presenterade jag tillsammans med kollegor fr\u00e5n Sportmaster Lab p\u00e5 en konferens i Krasnodar, mitt f\u00f6redrag hette \"Enhetstester i databashanterare\", och nu vill jag dela det med er. Det kommer att bli mycket text, s\u00e5 jag har best\u00e4mt mig f\u00f6r att dela upp f\u00f6redraget i tv\u00e5 inl\u00e4gg. I det f\u00f6rsta kommer vi att prata om automatiserade tester och testning i allm\u00e4nhet, och i det andra kommer jag att g\u00e5 mer i detalj p\u00e5 v\u00e5rt system f\u00f6r enhetstestning och resultaten av dess till\u00e4mpning.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/464335\/\"><img decoding=\"async\" alt=\"Enhetstester i databashanterare \u2013 hur vi g\u00f6r det p\u00e5 Sportmaster, del ett\" src=\"\/wp-content\/uploads\/2019\/08\/4e521cc85eb3a3806860a40ab2e4050f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>F\u00f6rst lite tr\u00e5kig teori. Vad \u00e4r automatiserad testning? Det \u00e4r testning som genomf\u00f6rs med hj\u00e4lp av programvaror, och i dagens IT-v\u00e4rld anv\u00e4nds det alltmer vid mjukvaruutveckling. Detta beror p\u00e5 att f\u00f6retag v\u00e4xer, deras informationssystem v\u00e4xer, och d\u00e4rmed \u00f6kar ocks\u00e5 m\u00e4ngden funktionalitet som m\u00e5ste testas. Att genomf\u00f6ra manuell testning blir allt mer kostsamt.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nJag arbetade p\u00e5 ett stort f\u00f6retag vars releaser kommer ut varannan m\u00e5nad. Under en hel m\u00e5nad spenderades tid p\u00e5 att ett tiotal testare manuellt kontrollerade funktionaliteten. Genom att inf\u00f6ra automatisering med ett litet team av utvecklare lyckades vi p\u00e5 ett och ett halvt \u00e5r minska testtiden till 2 veckor. Vi har inte bara \u00f6kat hastigheten p\u00e5 testningen utan \u00e4ven f\u00f6rb\u00e4ttrat dess kvalitet. Automatiserade tester k\u00f6rs regelbundet och de genomf\u00f6r alltid hela kursen av inbyggda kontroller, det vill s\u00e4ga vi eliminerar den m\u00e4nskliga faktorn. <\/p>\n<p>I modern IT \u00e4r det typiskt att utvecklaren f\u00f6rv\u00e4ntas kunna skriva inte bara produktens kod, utan ocks\u00e5 enhetstester som testar den koden. <\/p>\n<p>Men vad g\u00f6r man om ditt system huvudsakligen baseras p\u00e5 serverlogik? Det finns ingen universall\u00f6sning eller b\u00e4sta metoder p\u00e5 marknaden. F\u00f6retag l\u00f6ser oftast detta problem genom att skapa egna skr\u00e4ddarsydda testsystem. S\u00e5 h\u00e4r skapades v\u00e5rt egna skr\u00e4ddarsydda automatiserade testsystem i v\u00e5rt projekt, och jag kommer att ber\u00e4tta om det i min presentation. <\/p>\n<p><img decoding=\"async\" alt=\"Enhetstester i databashanterare \u2013 hur vi g\u00f6r det p\u00e5 Sportmaster, del ett\" src=\"\/wp-content\/uploads\/2019\/08\/fee34f7214fb2075ee50fa0f4af14a44.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Testar lojalitet<\/h2>\n<p>\nF\u00f6rst ska vi prata om projektet d\u00e4r vi implementerade ett automatiserat testsystem. V\u00e5rt projekt \u00e4r ett lojalitetssystem f\u00f6r Sportmaster (f\u00f6r \u00f6vrigt har vi redan skrivit om det i <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/453252\/\">detta inl\u00e4gg<\/a><\/noindex>).<\/p>\n<p>Om ditt f\u00f6retag \u00e4r tillr\u00e4ckligt stort kommer ditt lojalitetssystem att ha tre standardegenskaper: <\/p>\n<ul>\n<li>Ditt system kommer att vara h\u00f6gbelastat<\/li>\n<li>Ditt system kommer att inneh\u00e5lla komplexa ber\u00e4kningsprocesser<\/li>\n<li>Ditt system kommer att revideras aktivt. <\/li>\n<\/ul>\n<p>\nL\u00e5t oss g\u00e5 i ordning... Tillsammans, om vi ser p\u00e5 alla varum\u00e4rken under Sportmaster, har vi mer \u00e4n 1000 butiker i Ryssland, Ukraina, Kina, Kazakstan och Vitryssland. I dessa butiker genomf\u00f6rs cirka 300 000 k\u00f6p varje dag. Det betyder att v\u00e5rt system f\u00e5r 3-4 kvitton varje sekund. Naturligtvis \u00e4r v\u00e5rt lojalitetssystem h\u00f6gbelastat. Eftersom det anv\u00e4nds aktivt m\u00e5ste vi erbjuda de h\u00f6gsta kvalitetsstandarderna, f\u00f6r varje fel i mjukvaran inneb\u00e4r stora ekonomiska, rykte- och andra f\u00f6rluster. <\/p>\n<p>Samtidigt arbetar mer \u00e4n hundra olika kampanjer p\u00e5 Sportmaster. Kampanjerna \u00e4r mycket varierande: det finns produktkampanjer, kampanjer kopplade till veckodagar, de kan vara knutna till specifika butiker, kampanjer baserade p\u00e5 k\u00f6pbelopp, samt antalet produkter. Kort sagt, en hel del. Kunder har bonusar och rabattkoder som anv\u00e4nds vid k\u00f6p. Allt detta leder till att ber\u00e4kningen av varje best\u00e4llning \u00e4r en ganska betydande uppgift. <\/p>\n<p>Algoritmen som hanterar orderbehandling \u00e4r verkligen fruktansv\u00e4rd och komplex. Och varje \u00e4ndring i denna algoritm \u00e4r ganska riskfylld. Det verkar som om \u00e4ven de mest ytligt obetydliga \u00e4ndringarna kan leda till ganska of\u00f6ruts\u00e4gbara effekter. Just s\u00e5dana komplexa ber\u00e4kningsprocesser, s\u00e4rskilt de som implementerar kritisk funktionalitet, \u00e4r det b\u00e4sta kandidatet f\u00f6r automatisering. Att manuellt kontrollera tiotals likartade fall \u00e4r mycket tidskr\u00e4vande. Och eftersom ing\u00e5ngspunkten i processen f\u00f6rblir of\u00f6r\u00e4ndrad kan man en g\u00e5ng beskriva den, s\u00e5 kan man ganska snabbt st\u00e4mpla automatiska tester och vara s\u00e4ker p\u00e5 att funktionaliteten fungerar.<\/p>\n<p>Eftersom v\u00e5rt system anv\u00e4nds aktivt, kommer verksamheten att f\u00f6rv\u00e4nta sig n\u00e5got nytt av er, att h\u00e5lla j\u00e4mna steg med tiden och vara kundorienterad. I v\u00e5rt lojalitetssystem sl\u00e4pps versioner varannan m\u00e5nad. Det inneb\u00e4r att vi beh\u00f6ver genomf\u00f6ra en fullst\u00e4ndig regression av hela systemet varannan m\u00e5nad. Dessutom, som i all modern IT, g\u00e5r utvecklingen inte direkt fr\u00e5n utvecklaren till produktion. Den f\u00f6ds p\u00e5 utvecklarens kontur, passerar sedan successivt testmilj\u00f6n, release-milj\u00f6n, acceptans och hamnar f\u00f6rst d\u00e4refter i produktion. \u00c5tminstone p\u00e5 test- och releasekonturerna beh\u00f6ver vi genomf\u00f6ra en fullst\u00e4ndig regression av hela systemet. <\/p>\n<p>De beskrivna egenskaperna \u00e4r standard f\u00f6r i stort sett vilket lojalitetssystem som helst. L\u00e5t oss prata om s\u00e4rdragen i v\u00e5rt projekt.<\/p>\n<p>Tekniskt sett \u00e4r 90% av logiken i v\u00e5rt lojalitetssystem serverbaserad och implementerad i Oracle. Det finns en klient som \u00e4r utvecklad i Delphi, som utf\u00f6r funktionen som ARM-administrat\u00f6r. Det finns ocks\u00e5 exponerade webbtj\u00e4nster f\u00f6r externa applikationer (till exempel webbplatsen). D\u00e4rf\u00f6r \u00e4r det ganska logiskt att om vi ska implementera ett system f\u00f6r automatiserad testning, s\u00e5 kommer vi att g\u00f6ra det p\u00e5 Oracle.<\/p>\n<p>Lojalitetsprogrammet p\u00e5 Sportmaster har funnits i \u00f6ver 7 \u00e5r och skapades av enskilda utvecklare\u2026 Det genomsnittliga antalet utvecklare i v\u00e5rt projekt under dessa 7 \u00e5r har varit 3-4 personer. Men under det senaste \u00e5ret har v\u00e5rt team v\u00e4xt kraftigt, och nu arbetar 10 personer med projektet. Det inneb\u00e4r att nya personer kommer in i projektet som inte \u00e4r bekanta med standarduppgifter, processer och arkitektur. Det finns en \u00f6kad risk f\u00f6r att vi kan missa fel.<\/p>\n<p>Projektet k\u00e4nnetecknas av avsaknaden av dedikerade testare som anst\u00e4llda. Testning sker sj\u00e4lvklart, men det \u00e4r analytiker som ansvarar f\u00f6r testning ut\u00f6ver sina andra huvuduppgifter: att kommunicera med aff\u00e4rskunder, anv\u00e4ndare, arbeta igenom kravspecifikationerna etc. Trots att testningen genomf\u00f6rs p\u00e5 ett mycket kvalitativt s\u00e4tt (s\u00e4rskilt relevant att n\u00e4mna eftersom n\u00e5gon av analytikerna kan komma att se denna rapport) \u00e4r effektiviteten av specialisering och fokus p\u00e5 en enda uppgift fortfarande oslagbar.<\/p>\n<p>Med allt detta i \u00e5tanke verkar id\u00e9n om att automatisera testningen i projektet vara en mycket logisk l\u00f6sning f\u00f6r att f\u00f6rb\u00e4ttra kvaliteten p\u00e5 den levererade produkten och minska utvecklingstiderna. Under olika faser av lojalitetssystemets existens har individuella utvecklare gjort anstr\u00e4ngningar f\u00f6r att t\u00e4cka sin kod med enhetstester. Det har i allm\u00e4nhet varit en ganska splittrad process d\u00e4r varje person anv\u00e4nt sin egen arkitektur och metoder. Gemensamma resultat f\u00f6r enhetstesterna har varit: testerna utvecklades, anv\u00e4ndes under en tid, lagrades i en versionskontroll f\u00f6r filer, men efter en tid slutade de att k\u00f6ras och gl\u00f6mdes bort. Detta skedde fr\u00e4mst eftersom testerna var mer kopplade till den specifika utf\u00f6raren snarare \u00e4n projektet.<\/p>\n<h2>Uppdraget kommer fr\u00e5n utPLSQL<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Enhetstester i databashanterare \u2013 hur vi g\u00f6r det p\u00e5 Sportmaster, del ett\" src=\"\/wp-content\/uploads\/2019\/08\/f21dfcb085aace687566dc51cb9b5613.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVet du n\u00e5got om Steven Feuerstein? <\/p>\n<p>Det \u00e4r en smart kille som har \u00e4gnat en stor del av sin karri\u00e4r \u00e5t arbete med Oracle och PL\/SQL, och han har skrivit en ganska stor m\u00e4ngd arbeten om detta \u00e4mne. En av hans k\u00e4nda b\u00f6cker heter just \"Oracle PL\/SQL. F\u00f6r proffs\". Det var Steven som utvecklade l\u00f6sningen utPLSQL, eller som det f\u00f6rklaras, Unit Testing framework f\u00f6r Oracle PL\/SQL. L\u00f6sningen utPLSQL skapades 2016, men det p\u00e5g\u00e5r fortfarande aktivt arbete med den och nya versioner sl\u00e4pps. Vid tiden f\u00f6r presentationen daterades den senaste versionen den 24 mars 2019.<br \/>\nVad \u00e4r detta? Det \u00e4r ett separat \u00f6ppen k\u00e4llkod-projekt. Det v\u00e4ger n\u00e5gra megabyte, inklusive exempel och dokumentation. Det best\u00e5r fysiskt av ett separat schema i ORACLE-databasen med ett set av paket och tabeller f\u00f6r att organisera enhetstestning. Installationen tar n\u00e5gra sekunder. En utm\u00e4rkande egenskap hos utPLSQL \u00e4r enkelheten i anv\u00e4ndningen. <br \/>\n\u00d6vergripande sett \u00e4r utPLSQL en mekanism f\u00f6r att k\u00f6ra enhetstester, d\u00e4r enhetstestet definieras som vanliga Oracle-paketprocedurer vars organisation f\u00f6ljer vissa regler. F\u00f6rutom att k\u00f6ra, lagrar utPLSQL en logg \u00f6ver alla dina testk\u00f6rningar, och det finns ocks\u00e5 ett internt rapportsystem.<\/p>\n<p>L\u00e5t oss titta p\u00e5 ett exempel p\u00e5 hur koden f\u00f6r en enhetstest som implementerats med denna metod ser ut.<\/p>\n<p><img decoding=\"async\" alt=\"Enhetstester i databashanterare \u2013 hur vi g\u00f6r det p\u00e5 Sportmaster, del ett\" src=\"\/wp-content\/uploads\/2019\/08\/6fc8cc2d84c6c32a8b5269ebad1d2381.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS\u00e5, p\u00e5 sk\u00e4rmen visas koden f\u00f6r en typisk paketspecifikation med enhetstester. Vilka \u00e4r de obligatoriska kraven? Paketet m\u00e5ste ha prefixet \"utp_\". Detsamma g\u00e4ller f\u00f6r alla procedurer som har tester. I paketet m\u00e5ste det finnas tv\u00e5 standardprocedurer: \"utp_setup\" och \"utp_teardown\". Den f\u00f6rsta proceduren anropas vid omstart av varje enhetstest, den andra efter k\u00f6rningen.<\/p>\n<p>\"utp_setup\" f\u00f6rbereder vanligtvis v\u00e5rt system f\u00f6r att k\u00f6ra enhetstestet, till exempel genom att skapa testdata. \"utp_teardown\" \u00e5 sin sida \u00e5terst\u00e4ller allt till ursprungliga inst\u00e4llningar och nollst\u00e4ller resultaten av k\u00f6rningen.<\/p>\n<p>H\u00e4r \u00e4r ett exempel p\u00e5 det enklaste enhetstestet som kontrollerar normaliseringen av det angivna telefonnumret f\u00f6r kunden till den standard som g\u00e4ller f\u00f6r v\u00e5rt lojalitetssystem. Det finns inga obligatoriska standarder f\u00f6r hur man skriver procedurer med enhetstester. Vanligtvis utf\u00f6rs anrop av en metod i det testade systemet och resultatet som returneras av den metoden j\u00e4mf\u00f6rs med en referens. Det \u00e4r viktigt att j\u00e4mf\u00f6relsen mellan referensresultatet och det erh\u00e5llna sker via standard metoder i utPLSQL.<\/p>\n<p>Det kan finnas vilket som helst antal kontroller i enhetstestet. Som vi ser i exemplet g\u00f6r vi fyra sekventiella anrop till den testade metoden f\u00f6r normalisering av telefonnumret och efter varje anrop utv\u00e4rderar vi resultatet. Vid utvecklingen av enhetstestet b\u00f6r vi beakta att det finns kontroller som inte p\u00e5verkar systemet, medan andra kr\u00e4ver att man \u00e5terg\u00e5r till systemets ursprungliga tillst\u00e5nd. <br \/>\nTill exempel, i det presenterade enhetstestet formaterar vi bara det ing\u00e5ende telefonnumret, vilket inte p\u00e5verkar lojalitetssystemet p\u00e5 n\u00e5got s\u00e4tt. <\/p>\n<p>Men om vi skriver enhetstester f\u00f6r metoden att skapa en ny klient, kommer det att skapas en ny klient i systemet efter varje kontroll, vilket kan p\u00e5verka den efterf\u00f6ljande k\u00f6rningen av testet.<\/p>\n<p><img decoding=\"async\" alt=\"Enhetstester i databashanterare \u2013 hur vi g\u00f6r det p\u00e5 Sportmaster, del ett\" src=\"\/wp-content\/uploads\/2019\/08\/7d649b354776c15d8a70a0d9a05363b4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS\u00e5 h\u00e4r k\u00f6rs enhetstester. Det finns tv\u00e5 till\u00e5tna s\u00e4tt att k\u00f6ra: att k\u00f6ra alla enhetstester fr\u00e5n ett specifikt paket eller att k\u00f6ra ett specifikt enhetstest i ett specifikt paket.<\/p>\n<p><img decoding=\"async\" alt=\"Enhetstester i databashanterare \u2013 hur vi g\u00f6r det p\u00e5 Sportmaster, del ett\" src=\"\/wp-content\/uploads\/2019\/08\/46628b60eb0fe0d20df822ddca914947.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS\u00e5 h\u00e4r ser ett exempel p\u00e5 ett internt rapporteringssystem ut. Utifr\u00e5n resultaten av enhetstestet bygger utPLSQL en liten rapport. I den kan vi se resultatet f\u00f6r varje specifik kontroll samt det totala resultatet av enhetstestet. <\/p>\n<h2>6 regler f\u00f6r automatiserade tester<\/h2>\n<p>\nInnan vi b\u00f6rjade skapa ett nytt system f\u00f6r automatiserad testning av lojalitetssystemet, definierade vi tillsammans med ledningen de principer som v\u00e5ra framtida automatiserade tester skulle f\u00f6lja.<\/p>\n<p><img decoding=\"async\" alt=\"Enhetstester i databashanterare \u2013 hur vi g\u00f6r det p\u00e5 Sportmaster, del ett\" src=\"\/wp-content\/uploads\/2019\/08\/84be59663203abb373e7074b9a6cd4e4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ol>\n<li>Automatiserade tester m\u00e5ste vara effektiva och ge f\u00f6rdelar. Vi har fantastiska utvecklare som f\u00f6rtj\u00e4nar att n\u00e4mnas, eftersom n\u00e5gon av dem f\u00f6rmodligen kommer att se denna presentation, och de skriver utm\u00e4rkt kod. Men \u00e4ven deras utm\u00e4rkta kod \u00e4r inte perfekt och har, har och kommer att ha buggar. Automatiserade tester m\u00e5ste hitta dessa buggar. Om de inte g\u00f6r det, s\u00e5 skriver vi antingen d\u00e5liga automatiserade tester eller s\u00e5 har vi hamnat i ett d\u00f6dl\u00e4ge som i princip inte vidareutvecklas. I b\u00e5da fallen g\u00f6r vi n\u00e5got fel, och v\u00e5r metod \u00e4r helt meningsl\u00f6s.<\/li>\n<li>Automatiserade tester m\u00e5ste anv\u00e4ndas. Det \u00e4r meningsl\u00f6st att spendera massor av tid och energi p\u00e5 att utveckla en programvara, skapa dess repository och sedan gl\u00f6mma bort det. Tester m\u00e5ste k\u00f6ras, och de m\u00e5ste k\u00f6ras s\u00e5 regelbundet som m\u00f6jligt.<\/li>\n<li>Automatiserade tester m\u00e5ste fungera stabilt. Oavsett tid p\u00e5 dygnet, testb\u00e4nk och andra systeminst\u00e4llningar, b\u00f6r testk\u00f6rningarna alltid ge samma resultat. Detta s\u00e4kerst\u00e4lls vanligtvis av att automatiserade tester arbetar med speciella testdata med fasta systeminst\u00e4llningar.<\/li>\n<li>Automatiserade tester m\u00e5ste arbeta med en hastighet som \u00e4r acceptabel f\u00f6r ditt projekt. Denna tid best\u00e4ms individuellt f\u00f6r varje system. Vissa kan till\u00e5ta sig att arbeta hela dagen, medan andra m\u00e5ste klara det p\u00e5 sekunder. Vilka hastighetsnormer vi har uppn\u00e5tt i v\u00e5rt projekt kommer jag att ber\u00e4tta mer om senare.<\/li>\n<li>Utvecklingen av automatiserade tester m\u00e5ste vara flexibel. Det \u00e4r o\u00f6nskat att avst\u00e5 fr\u00e5n att testa n\u00e5gon funktion bara f\u00f6r att vi inte har gjort det tidigare eller av andra \u00f6vertygelser. utPLSQL l\u00e4gger inga begr\u00e4nsningar p\u00e5 utvecklingen, och Oracle till\u00e5ter i princip att genomf\u00f6ra en m\u00e4ngd olika saker. De flesta uppgifter har en l\u00f6sning; fr\u00e5gan \u00e4r bara tid och den anstr\u00e4ngning som kr\u00e4vs.<\/li>\n<li>Distribuerbarhet. Vi har flera testb\u00e4nkar d\u00e4r tester beh\u00f6ver k\u00f6ras. P\u00e5 varje testb\u00e4nk kan en databas dumpas och uppdateras n\u00e4r som helst. Projektet med automatiserade tester m\u00e5ste drivas p\u00e5 ett s\u00e4tt som m\u00f6jligg\u00f6r sm\u00e4rtfri installation, helt eller delvis.<\/li>\n<\/ol>\n<p>I det andra inl\u00e4gget om n\u00e5gra dagar kommer jag att ber\u00e4tta om vad vi har gjort och vilka resultat vi har uppn\u00e5tt.<br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-pervaya\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Enhetstester i DBMS \u2013 s\u00e5 h\u00e4r g\u00f6r vi det p\u00e5 Sportmaster, del ett | ProHoster","description":"Hej, Habr! Jag heter Maxim Ponomarenko och jag \u00e4r utvecklare p\u00e5 Sportmaster. Jag har 10 \u00e5rs erfarenhet inom IT-branschen. Jag b\u00f6rjade min karri\u00e4r inom manuell testning, innan jag bytte till databasutveckling.","canonical_url":"https:\/\/prohoster.info\/sv\/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":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/37495","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=37495"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/37495\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/28136"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=37495"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=37495"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=37495"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}