{"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\/sv\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-vtoraya","title":{"rendered":"Enhetstester i DBMS \u2014 s\u00e5 g\u00f6r vi det i Sportmaster, del tv\u00e5","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i>F\u00f6rsta delen \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/464335\/\">h\u00e4r<\/a><\/noindex>.<\/i><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/465047\/\"><img decoding=\"async\" alt=\"Enhetstester i DBMS \u2014 s\u00e5 g\u00f6r vi det i Sportmaster, del tv\u00e5\" src=\"\/wp-content\/uploads\/2019\/09\/b9fb8c934885abdf3ef928bfd75bdc2a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>F\u00f6rest\u00e4ll dig situationen. Du har i uppgift att utveckla en ny funktionalitet. Du har material fr\u00e5n dina f\u00f6reg\u00e5ngare. Om vi antar att du inte har n\u00e5gra moraliska skyldigheter, hur skulle du agera?<\/p>\n<p>Oftast gl\u00f6ms allt gammalt material bort och allt b\u00f6rjar om fr\u00e5n b\u00f6rjan. Ingen gillar att gr\u00e4va i andras kod, och om man har tid, varf\u00f6r inte \u00e4gna sig \u00e5t att skapa ett eget system? Detta \u00e4r en typisk inst\u00e4llning, och den \u00e4r ofta korrekt. Men i v\u00e5rt projekt gick vi en annan v\u00e4g. Vi byggde den framtida automatiserade testsystemet p\u00e5 grunderna av unit-tester i utPLSQL fr\u00e5n v\u00e5ra f\u00f6reg\u00e5ngare, och sedan arbetade vi i flera parallella riktningar.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<ol>\n<li><b>\u00c5terst\u00e4llande av gamla unit-tester.<\/b> \u00c5terst\u00e4llning inneb\u00e4r anpassning av tester till den nuvarande statusen f\u00f6r lojalitetssystemet och anpassning av tester till standarderna f\u00f6r utPLSQL. <\/li>\n<li><b>L\u00f6sning p\u00e5 problemet med att f\u00f6rst\u00e5 vilka metoder och processer som omfattas av automatiserade tester. <\/b>Antingen m\u00e5ste denna information h\u00e5llas i huvudet, eller s\u00e5 m\u00e5ste slutsatser g\u00f6ras baserat p\u00e5 sj\u00e4lva koden av automatiserade tester. D\u00e4rf\u00f6r beslutade vi att skapa en katalog. Varje automatiserat test fick en unik mnemonisk kod, vi skapade en beskrivning och dokumenterade inst\u00e4llningarna (till exempel under vilka f\u00f6rh\u00e5llanden det ska k\u00f6ras, eller vad som ska h\u00e4nda om testk\u00f6rningen misslyckas). I praktiken fyllde vi i metadata om de automatiserade testerna och placerade dessa metadata i standardtabellerna i utPLSQL-schemat.<\/li>\n<li><b>Definition av expansionsstrategi, dvs. val av funktionalitet som ska testas med automatiserade tester.<\/b> Vi beslutade att fokusera p\u00e5 tre saker: nya f\u00f6rb\u00e4ttringar av systemet, incidenter fr\u00e5n produktionen och viktiga processer i systemet. P\u00e5 s\u00e5 s\u00e4tt utvecklas vi parallellt med releasen, vilket s\u00e4kerst\u00e4ller h\u00f6gre kvalitet, samtidigt som vi ut\u00f6kar omfattningen av regression och s\u00e4kerst\u00e4ller systemets tillf\u00f6rlitlighet p\u00e5 kritiska punkter. Den f\u00f6rsta flaskhalsen blev processen f\u00f6r f\u00f6rdelning av rabatter och bonusar per kvitto.<\/li>\n<li><b>Sj\u00e4lvklart sysslade vi med att utveckla nya automatiserade tester. <\/b>En av de f\u00f6rsta releasedelarna var att utv\u00e4rdera prestandan f\u00f6r de f\u00f6rdefinierade urvalsgrupperna i lojalitetssystemet. I v\u00e5rt projekt finns en del fasta SQL-fr\u00e5gor som v\u00e4ljer ut kunder utifr\u00e5n vissa villkor. Till exempel, att f\u00e5 en lista \u00f6ver alla kunder vars senaste k\u00f6p gjordes i en specifik stad, eller en lista \u00f6ver kunder vars genomsnittliga k\u00f6pesumma \u00e4r h\u00f6gre \u00e4n ett visst belopp. Genom att skriva automatiserade tester kontrollerade vi de f\u00f6rdefinierade urvalsgrupperna, dokumenterade standardprestandaparametrarna och lade \u00e4ven till belastningstester.<\/li>\n<li><b>Arbete med automatiserade tester ska vara anv\u00e4ndarv\u00e4nligt.<\/b>. De tv\u00e5 vanligast f\u00f6rekommande handlingarna \u00e4r att k\u00f6ra automatiserade tester och att skapa testdata. S\u00e5 i v\u00e5rt system skapades tv\u00e5 hj\u00e4lpmoduler: en k\u00f6rmodul och en datagenereringsmodul.\n<p>K\u00f6rmodulen presenteras som en universell procedur med en inmatningstextparameter. Som parameter kan man ange mnemonic-koden f\u00f6r det automatiserade testet, namnet p\u00e5 paketet, testnamnet, inst\u00e4llningen f\u00f6r det automatiserade testet eller ett reserverat nyckelord. Proceduren v\u00e4ljer och k\u00f6r alla automatiserade tester som uppfyller villkoren.<\/p>\n<p>Datagenereringsmodulen presenteras i form av ett paket, d\u00e4r f\u00f6r varje objekt av det testade systemet (tabell i databasen) skapas en speciell procedur som infogar data. I denna procedur \u00e4r standardv\u00e4rdena maximalt ifyllda, vilket m\u00f6jligg\u00f6r skapande av objekt med ett fingerkn\u00e4pp. F\u00f6r anv\u00e4ndarv\u00e4nlighet skapades det \u00e4ven mallar f\u00f6r den data som ska genereras. Till exempel, att skapa en kund av en viss \u00e5lder med ett testtelefonnummer och ett genomf\u00f6rt k\u00f6p.<\/li>\n<li><b>De automatiserade testerna m\u00e5ste k\u00f6ras och fungera inom en acceptabel tidsram f\u00f6r ditt system. <\/b>D\u00e4rf\u00f6r organiserades en daglig nattstart, vars resultat sammanst\u00e4lls i en rapport om resultaten och skickas till hela utvecklingsteamet via f\u00f6retagsmail. Efter att ha \u00e5terst\u00e4llt gamla automatiserade tester och skapat nya var den totala k\u00f6rtiden 30 minuter. Denna prestanda var tillfredsst\u00e4llande f\u00f6r alla, d\u00e5 k\u00f6rningen skedde under obekv\u00e4m arbetstid.\n<p>Men vi beh\u00f6vde verkligen arbeta med att optimera hastigheten. Uppdateringen av lojalitetssystemet g\u00f6rs p\u00e5 natten. I samband med en av versionerna blev vi tvungna att g\u00f6ra akuta \u00e4ndringar p\u00e5 natten. En halvtimmes v\u00e4ntan p\u00e5 resultatet av autotester vid tre p\u00e5 morgonen gjorde inte den ansvarige f\u00f6r versionen s\u00e4rskilt glad (en varm h\u00e4lsning till Alexey Vasyukov!), och n\u00e4sta morgon fick v\u00e5r plattform m\u00e5nga v\u00e4nliga ord. Men i slut\u00e4ndan fastst\u00e4lldes en fem minuters norm f\u00f6r arbetet.<\/p>\n<p>F\u00f6r att \u00f6ka prestandan anv\u00e4nde vi tv\u00e5 metoder: autotester b\u00f6rjade k\u00f6ras i tre parallella str\u00f6mmar, vilket \u00e4r mycket praktiskt p\u00e5 grund av hur v\u00e5rt lojalitetssystem \u00e4r uppbyggt. Vi \u00f6vergav \u00e4ven tillv\u00e4gag\u00e5ngss\u00e4ttet d\u00e4r autotester inte skapar sina egna testdata utan f\u00f6rs\u00f6ker hitta n\u00e5got l\u00e4mpligt i systemet. Efter dessa \u00e4ndringar minskade den totala k\u00f6rtiden till 3-4 minuter.<\/li>\n<li><b>Projektet med autotester m\u00e5ste kunna drifts\u00e4ttas p\u00e5 olika milj\u00f6er.<\/b> I b\u00f6rjan gjorde vi f\u00f6rs\u00f6k att skriva egna batchfiler, men vi ins\u00e5g snart att en egen version av automatiserad installation \u00e4r en total mardr\u00f6m, s\u00e5 vi v\u00e4nde oss ist\u00e4llet till industriella l\u00f6sningar. Eftersom projektet har mycket kod (i f\u00f6rsta hand lagrar vi koden f\u00f6r autotester) och mycket lite data (huvuddatan \u00e4r metadata om autotester), blev det mycket enkelt att implementera Liquibase i projektet.\n<p>Detta \u00e4r ett databasen oberoende bibliotek med \u00f6ppen k\u00e4llkod f\u00f6r att sp\u00e5ra, hantera och till\u00e4mpa \u00e4ndringar i databasens schema. Det hanteras via kommandoraden eller ramverk som Apache Maven. Arbetsprincipen f\u00f6r Liquibase \u00e4r ganska enkel. Vi har ett organiserat projekt som best\u00e5r av \u00e4ndringar eller skript som ska till\u00e4mpas p\u00e5 m\u00e5lservern, och styrfiler som definierar i vilken ordning och med vilka parametrar dessa \u00e4ndringar ska installeras. <\/p>\n<p>P\u00e5 databasniv\u00e5 skapas en specialtabell d\u00e4r Liquibase lagrar loggen \u00f6ver till\u00e4mpningar. Varje \u00e4ndring har en ber\u00e4knad hash som j\u00e4mf\u00f6rs mellan projektet och tillst\u00e5ndet i databasen varje g\u00e5ng. Tack vare Liquibase till\u00e4mpar vi enkelt f\u00f6r\u00e4ndringar i v\u00e5rt system p\u00e5 alla konturer. Autotester k\u00f6rs nu p\u00e5 test- och produktionskonturer, liksom p\u00e5 containrar (utvecklares personliga konturer).<\/li>\n<\/ol>\n<p><img decoding=\"async\" alt=\"Enhetstester i DBMS \u2014 s\u00e5 g\u00f6r vi det i Sportmaster, del tv\u00e5\" src=\"\/wp-content\/uploads\/2019\/09\/4306f6c33543d38f5d8b77f67e22e247.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS\u00e5 l\u00e5t oss prata om resultaten av v\u00e5r enhetstestningssystem. <\/p>\n<ol>\n<li>Sj\u00e4lvklart \u00e4r vi \u00f6vertygade om att vi har b\u00f6rjat utveckla mer kvalitetsprogramvara. Autotester k\u00f6rs dagligen och hittar dussintals fel vid varje release. Dessutom \u00e4r en del av dessa fel bara indirekt relaterade till funktionen vi faktiskt ville \u00e4ndra. Det finns stora tvivel p\u00e5 att dessa fel hade uppt\u00e4ckts genom manuella tester. <\/li>\n<li>Teamet har f\u00e5tt f\u00f6rtroende f\u00f6r att en viss funktion fungerar korrekt... Detta g\u00e4ller f\u00f6rst och fr\u00e4mst v\u00e5ra kritiska processer. Till exempel har vi inte haft problem med distributionen av rabatter och bonusar p\u00e5 kvitton under det senaste halv\u00e5ret, trots f\u00f6r\u00e4ndringar vid varje release, \u00e4ven om vi tidigare har st\u00f6tt p\u00e5 fel med viss regelbundenhet.<\/li>\n<li>Vi har lyckats minska antalet testningsiterationer. Tack vare att autotester skrivs f\u00f6r ny funktionalitet n\u00e5r koden av h\u00f6gre kvalitet analytikerna och samtidigt testarna, eftersom den redan har verifierats.<\/li>\n<li>En del av de automatiserade testens resultat anv\u00e4nds av utvecklarna. Till exempel skapas testdata p\u00e5 containrar med hj\u00e4lp av en modul f\u00f6r objektgenerering.<\/li>\n<li>Det \u00e4r ocks\u00e5 viktigt att vi har etablerat en \"acceptans\" av det automatiserade testningssystemet bland utvecklarna. Det finns en f\u00f6rst\u00e5else f\u00f6r att detta \u00e4r viktigt och nyttigt. Och av egen erfarenhet kan jag s\u00e4ga att det s\u00e4llan \u00e4r s\u00e5. Autotester m\u00e5ste skrivas, underh\u00e5llas och utvecklas, analyseras resultat, och ofta \u00e4r dessa tidsinvesteringar bara inte v\u00e4rda det. Mycket enklare att g\u00e5 till produktion och d\u00e4r ta itu med problemen. Hos oss st\u00e4ller sig utvecklarna i k\u00f6 och ber om att deras funktionalitet ska t\u00e4ckas av autotester.<\/li>\n<\/ol>\n<h2>Vad h\u00e4nder h\u00e4rn\u00e4st<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Enhetstester i DBMS \u2014 s\u00e5 g\u00f6r vi det i Sportmaster, del tv\u00e5\" src=\"\/wp-content\/uploads\/2019\/09\/a11596618e97c0afaa9f5f25b613575e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nL\u00e5t oss prata om framtidsplanerna f\u00f6r projektet kring automatiserad testning.<\/p>\n<p>Utan tvekan, s\u00e5 l\u00e4nge Sportmaster-lojalitetssystemet \u00e4r aktivt och forts\u00e4tter att utvecklas kan vi ocks\u00e5 n\u00e4stan o\u00e4ndligt utveckla automatiserade tester. D\u00e4rf\u00f6r \u00e4r den huvudsakliga utvecklingsriktningen att utvidga testt\u00e4ckningen.<\/p>\n<p>I takt med att antalet automatiserade tester \u00f6kar kommer den totala k\u00f6rtiden f\u00f6r dem att \u00f6ka, och vi m\u00e5ste \u00e5terigen \u00e5terkomma till fr\u00e5gan om prestanda. Sannolikt kommer l\u00f6sningen att vara att \u00f6ka antalet parallella tr\u00e5dar.<\/p>\n<p>Men det h\u00e4r \u00e4r uppenbara utvecklingsv\u00e4gar. Om vi pratar om n\u00e5got mer okonventionellt, s\u00e5 lyfter vi fram f\u00f6ljande:<\/p>\n<ol>\n<li>Just nu hanteras de automatiserade testerna p\u00e5 databasniv\u00e5, dvs. kunskaper i PL\/SQL kr\u00e4vs f\u00f6r att arbeta framg\u00e5ngsrikt. Vid behov kan administration av systemet (t.ex. k\u00f6rningar eller skapande av metadata) flyttas till ett administrativt gr\u00e4nssnitt, genom att anv\u00e4nda Jenkins eller n\u00e5got liknande.<\/li>\n<li>Alla \u00e4lskar kvantitativa och kvalitativa indikatorer. F\u00f6r automatiserad testning \u00e4r en universell indikator Code Coverage eller kodt\u00e4ckningsmetrik. Med hj\u00e4lp av denna indikator kan vi avg\u00f6ra vilken procentandel av koden i v\u00e5rt testade system som t\u00e4cks av automatiserade tester. Fr\u00e5n och med version 12.2 erbjuder Oracle m\u00f6jligheter att ber\u00e4kna denna metrik och rekommenderar att anv\u00e4nda standardpaketet DBMS_PLSQL_CODE_COVERAGE.\n<p>V\u00e5rt system f\u00f6r automatiserad testning \u00e4r lite mer \u00e4n ett \u00e5r gammalt och kanske \u00e4r det nu den b\u00e4sta tiden f\u00f6r att utv\u00e4rdera t\u00e4ckningen. I mitt tidigare projekt (inte Sportmasters) blev det s\u00e5. Ett \u00e5r efter arbetet med automatiserade tester satte ledningen upp uppgiften att bed\u00f6ma hur stor procentandel av koden vi t\u00e4cker. Med en t\u00e4ckning \u00f6ver 1 % skulle ledningen vara glad. Vi utvecklare f\u00f6rv\u00e4ntade oss ett resultat runt 10 %. Vi kopplade in code coverage, m\u00e4tte och fick 20 %. I gl\u00e4djen gick vi f\u00f6r att h\u00e4mta bonus, men vad som h\u00e4nde d\u00e4r och vart vi gick efter\u00e5t \u00e4r en helt annan historia.<\/li>\n<li>Automatiserade tester kan kontrollera de exponerade webbservicen. Oracle g\u00f6r det fullt m\u00f6jligt, och vi kommer inte l\u00e4ngre att st\u00f6ta p\u00e5 en rad problem. <\/li>\n<li>Och sj\u00e4lvklart kan v\u00e5rt automatiserade testsystem till\u00e4mpas p\u00e5 ett annat projekt. Den l\u00f6sning vi har utvecklat \u00e4r universell och kr\u00e4ver bara anv\u00e4ndning av Oracle. Jag har h\u00f6rt att det finns intresse f\u00f6r automatiserade tester i andra projekt hos Sportmaster, och kanske \u00e5ker vi dit.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Slutsatser<\/h2>\n<p>\nL\u00e5t oss sammanfatta. I projektet med lojalitetssystemet hos Sportmaster har vi lyckats implementera ett automatiserat testsystem. Grunden f\u00f6r detta \u00e4r utPLSQL-l\u00f6sningen fr\u00e5n Steven Feuerstein. Runt utPLSQL finns kod f\u00f6r automatiserade tester och hj\u00e4lpmjukvarumoduler: k\u00f6rmodul, datagenereringsmodul och andra. De automatiserade testerna k\u00f6rs dagligen och, viktigast av allt, de fungerar och ger nytta. Vi \u00e4r \u00f6vertygade om att vi har b\u00f6rjat producera mjukvara av h\u00f6gre kvalitet. Den l\u00f6sning vi f\u00e5tt \u00e4r universell och kan fritt till\u00e4mpas p\u00e5 vilket projekt som helst d\u00e4r automatiserade tester p\u00e5 Oracle-databaser beh\u00f6vs.<\/p>\n<p><i>P.S. Den h\u00e4r artikeln blev inte s\u00e4rskilt konkret: det finns mycket text och n\u00e4stan inga tekniska exempel. Om \u00e4mnet \u00e4r intressant i stort \u00e4r vi beredda att forts\u00e4tta och \u00e5terkomma med en forts\u00e4ttning d\u00e4r vi ber\u00e4ttar vad som har \u00e4ndrats de senaste sex m\u00e5naderna och ger exempel p\u00e5 kod.<\/p>\n<p>Skriv g\u00e4rna kommentarer om det finns punkter som b\u00f6r betonas i framtiden, eller fr\u00e5gor som beh\u00f6ver klarg\u00f6ras.<\/i><\/p>\n<p class=\"for_users_only_msg\">Endast registrerade anv\u00e4ndare kan delta i omr\u00f6stningen. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Logga in<\/a><\/noindex>, tack.<\/p>\n<h2 class=\"default-block__polling-title\">Skriver vi mer om detta?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Ja, sj\u00e4lvklart<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Nej, tack<\/p>\n<\/li>\n<\/ul>\n<p>    12 anv\u00e4ndare r\u00f6stade. 4 anv\u00e4ndare avstod.<br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-vtoraya\" \/>\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 \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\/sv\/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\udd47Enhetstester i DB \u2014 s\u00e5 g\u00f6r vi detta p\u00e5 Sportmaster, del tv\u00e5 | ProHoster","description":"Den f\u00f6rsta delen \u2014 h\u00e4r.","canonical_url":"https:\/\/prohoster.info\/sv\/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":"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 \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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/37666","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=37666"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/37666\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/28269"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=37666"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=37666"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=37666"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}