{"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\/da\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-vtoraya","title":{"rendered":"Enhedstest i DBMS \u2014 hvordan vi g\u00f8r det hos Sportmaster, del to","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i>F\u00f8rste del \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/464335\/\">her<\/a><\/noindex>.<\/i><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/465047\/\"><img decoding=\"async\" alt=\"Enhedstest i DBMS \u2014 hvordan vi g\u00f8r det hos Sportmaster, del to\" src=\"\/wp-content\/uploads\/2019\/09\/b9fb8c934885abdf3ef928bfd75bdc2a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Forestil dig situationen. Du st\u00e5r over for opgaven at udvikle ny funktionalitet. Du har nogle materialer fra dine forg\u00e6ngere. Hvis vi antager, at du ikke har nogen moralske forpligtelser, hvordan ville du s\u00e5 handle?<\/p>\n<p>Ofte bliver alle gamle materialer glemt, og alt begynder forfra. Ingen elsker at rode i andres kode, og hvis tiden er til det, hvorfor s\u00e5 ikke bruge den p\u00e5 at skabe sit eget system? Dette er en typisk tilgang og i mange tilf\u00e6lde en korrekt en. Men i vores projekt gjorde vi det anderledes. Vi lagde grundlaget for det fremtidige automatiserede testsystem p\u00e5 materialer fra unit-tests i utPLSQL fra vores forg\u00e6ngere, og derefter gik vi i gang med at arbejde i flere parallelle retninger.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<ol>\n<li><b>Genskabelse af gamle unit-tests.<\/b> Med genskabelse menes tilpasning af testene til den nuv\u00e6rende tilstand af loyalitetssystemet og tilpasning af testene til standarderne for utPLSQL. <\/li>\n<li><b>L\u00f8sningen p\u00e5 problemet med forst\u00e5elsen af, hvilke metoder og processer der er d\u00e6kket af automatiserede tests. <\/b>Man skal enten holde denne information i hovedet eller drage konklusioner baseret direkte p\u00e5 koden til de automatiserede tests. Derfor besluttede vi at danne et katalog. Hver automatiseret test fik tildelt en unik mnemonic kode, vi dannede en beskrivelse og dokumenterede indstillingerne (for eksempel, under hvilke betingelser den skal k\u00f8res, eller hvad der skal ske, hvis testens k\u00f8rsel mislykkes). I bund og grund udfyldte vi metadata om de automatiserede tests og placerede disse metadata i standardtabellerne i utPLSQL-schemaet.<\/li>\n<li><b>Definition af udvidelsesstrategi, dvs. valg af funktionalitet, der skal testes af automatiserede tests.<\/b> Vi besluttede at fokusere p\u00e5 tre ting: de nye forbedringer af systemet, h\u00e6ndelser fra produktionen og de centrale processer i systemet. P\u00e5 den m\u00e5de udvikler vi os parallelt med udgivelsen, sikrer h\u00f8jere kvalitet i den, samtidig med at vi udvider omfanget af regressionstests og sikrer systemets p\u00e5lidelighed p\u00e5 kritiske omr\u00e5der. Det f\u00f8rste s\u00e5danne flaskehals var processen til fordeling af rabatter og bonusser p\u00e5 kvitteringen.<\/li>\n<li><b>Naturligvis tog vi fat p\u00e5 at udvikle nye automatiserede tests. <\/b>En af de f\u00f8rste opgaver efter udgivelsen var at vurdere ydeevnen af de foruddefinerede udtr\u00e6k i lojalitetssystemet. I vores projekt er der en sektion med faste SQL-foresp\u00f8rgsler, der udv\u00e6lger kunder baseret p\u00e5 specifikationer. For eksempel at f\u00e5 en liste over alle kunder, hvis seneste k\u00f8b var i en bestemt by, eller en liste over kunder, hvis gennemsnitlige k\u00f8b er over en bestemt v\u00e6rdi. Efter at have skrevet automatiserede tests, kontrollerede vi de foruddefinerede udtr\u00e6k, fastsatte referenceparametre for ydeevnen, og vi fik desuden mulighed for belastningstestning.<\/li>\n<li><b>Arbejdet med automatiserede tests skal v\u00e6re brugervenligt<\/b>. De to mest udf\u00f8rte handlinger er: at starte automatiserede tests og oprette testdata. Derfor blev der oprettet to hj\u00e6lpemoduler i vores system: et startmodul og et datagenereringsmodul.\n<p>Startmodulet er udformet som en universel procedure med en enkelt tekstparameter som input. Som parameter kan man angive mnemonic-koden for den automatiserede test, navnet p\u00e5 pakken, navnet p\u00e5 testen, indstillingerne for den automatiserede test eller et reserveret n\u00f8gleord. Proceduren udv\u00e6lger og starter alle automatiserede tests, der opfylder betingelserne.<\/p>\n<p>Datagenereringsmodulet er pr\u00e6senteret i form af en pakke, hvor der for hvert objekt i det testede system (tabel i databasen) er oprettet en s\u00e6rlig procedure, der inds\u00e6tter data der. I denne procedure er de standardv\u00e6rdier maksimalt udfyldt, hvilket muligg\u00f8r oprettelsen af objekter bogstaveligt talt med et fingerknips. For brugervenlighed er der blevet oprettet skabeloner til de oprettede data. For eksempel at oprette en kunde af en bestemt alder med et testtelefonnummer og et gennemf\u00f8rt k\u00f8b.<\/li>\n<li><b>Automatiske tests skal startes og fungere inden for acceptabel tid for dit system. <\/b>Derfor blev der arrangeret et dagligt natk\u00f8rsel, hvis resultater danner en rapport, der sendes til hele udviklingsteamet via virksomhedens e-mail. Efter at have genoprettet gamle automatiserede tests og oprettet nye, var den samlede k\u00f8retid 30 minutter. En s\u00e5dan ydeevne tilfredsstillede alle, da k\u00f8rslen fandt sted uden for arbejdstiden.\n<p>Men m\u00e5tte arbejde p\u00e5 at optimere hastigheden. Opdateringen af loyalitetssystemet finder sted om natten. Under et af frigivelserne m\u00e5tte der laves hurtige \u00e6ndringer om natten. Den halvtime lange ventetid p\u00e5 resultaterne fra autotests i tre om natten gjorde ikke den ansvarlige for udgivelsen glad (et varmt hej til Alexey Vasyukov!), men n\u00e6ste morgen blev der sagt mange p\u00e6ne ord om vores system. Resultatet var, at der blev fastsat en 5-minutters norm for arbejdet.<\/p>\n<p>For at \u00f8ge ydeevnen anvendte vi to metoder: autotests blev k\u00f8rt i tre parallelle processer, hvilket er meget praktisk p\u00e5 grund af arkitekturen i vores loyalitetssystem. Vi har ogs\u00e5 opgivet tilgangen, hvor autotests ikke laver testdata til sig selv, men fors\u00f8ger at finde noget passende i systemet. Efter \u00e6ndringerne blev den samlede behandlingstid reduceret til 3-4 minutter.<\/li>\n<li><b>Projektet med autotests skal kunne implementeres p\u00e5 forskellige milj\u00f8er.<\/b> I starten var der fors\u00f8g p\u00e5 at skrive egne batch-filer, men det blev klart, at en skr\u00e6ddersyet automatiseret installation var en komplet katastrofe, og vi tiltrak os opm\u00e6rksomhed mod industrielle l\u00f8sninger. Da projektet indeholder meget kode (f\u00f8rst og fremmest opbevarer vi koden til autotests) og meget lidt data (de vigtigste data er metadata om autotests), var det meget enkelt at implementere Liquibase i projektet.\n<p>Det er et databasen-uafh\u00e6ngigt biblioteksprogram med \u00e5ben kilde, der bruges til at spore, administrere og anvende \u00e6ndringer i databaseskemaer. Det styres via kommandolinjen eller rammer som Apache Maven. Princippet for Liquibase er ret enkelt. Vi har et projekt, der er organiseret p\u00e5 en bestemt m\u00e5de, som best\u00e5r af \u00e6ndringer eller scripts, der skal anvendes p\u00e5 den m\u00e5lserver, samt styringsfiler, der definerer, i hvilken r\u00e6kkef\u00f8lge og med hvilke parametre de \u00e6ndringer skal anvendes. <\/p>\n<p>P\u00e5 databasesystemniveau oprettes der et specielt tabel, hvor Liquibase opbevarer loggen over \u00e6ndringer. Hver \u00e6ndring har en beregnet hash, som konstant sammenlignes mellem projektet og tilstanden i databasen. Takket v\u00e6re Liquibase kan vi let anvende \u00e6ndringer i vores system p\u00e5 enhver kontur. Automatisk testk\u00f8rsel foreg\u00e5r nu p\u00e5 test- og produktionskonturer samt p\u00e5 containere (personlige konturer for udviklere).<\/li>\n<\/ol>\n<p><img decoding=\"async\" alt=\"Enhedstest i DBMS \u2014 hvordan vi g\u00f8r det hos Sportmaster, del to\" src=\"\/wp-content\/uploads\/2019\/09\/4306f6c33543d38f5d8b77f67e22e247.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLad os tale om resultaterne af anvendelsen af vores enhedstestsystem. <\/p>\n<ol>\n<li>Selvf\u00f8lgelig er vi f\u00f8rst og fremmest overbeviste om, at vi er begyndt at udvikle mere kvalitetsbevidst software. Automatisk test k\u00f8res dagligt og ved hver release finder den dusinvis af fejl. Desuden er nogle af disse fejl kun indirekte relateret til den funktionalitet, vi faktisk \u00f8nskede at \u00e6ndre. Der er store tvivl om, at disse fejl ville v\u00e6re blevet fundet ved manuel testning. <\/li>\n<li>Teamet har f\u00e5et selvtillid til, at den specifikke funktionalitet fungerer korrekt... Dette g\u00e6lder is\u00e6r vores kritiske processer. For eksempel har vi i l\u00f8bet af det sidste halve \u00e5r ikke haft problemer med distribution af rabatter og bonusser i kvitteringen, p\u00e5 trods af \u00e6ndringer ved hver release, selvom der i tidligere perioder med j\u00e6vne mellemrum opstod fejl.<\/li>\n<li>Vi har form\u00e5et at reducere antallet af testiterations. Takket v\u00e6re at de automatiske tests skrives for den nye funktionalitet, modtager analytikerne og testerne kode af h\u00f8jere kvalitet, da det allerede er blevet testet.<\/li>\n<li>Nogle af resultaterne fra automatiseret testning anvendes af udviklerne. For eksempel oprettes testdata p\u00e5 containere ved hj\u00e6lp af en modul til objektgenerering.<\/li>\n<li>Det er vigtigt, at vi har f\u00e5et accept af systemet for automatiseret testning fra udviklerne. Der er en forst\u00e5else for, at det er vigtigt og nyttigt. Men ud fra min egen erfaring kan jeg sige, at dette slet ikke er tilf\u00e6ldet. Automatiske tests skal skrives, de skal vedligeholdes og udvikles, resultaterne skal analyseres, og ofte er disse tidsinvesteringer simpelthen ikke det v\u00e6rd. Det er langt nemmere at g\u00e5 til produktionen og h\u00e5ndtere problemerne der. Vores udviklere st\u00e5r i k\u00f8 og beder om at f\u00e5 deres funktionalitet d\u00e6kket af automatiserede tests.<\/li>\n<\/ol>\n<h2>vil v\u00e6re udsolgt<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Enhedstest i DBMS \u2014 hvordan vi g\u00f8r det hos Sportmaster, del to\" src=\"\/wp-content\/uploads\/2019\/09\/a11596618e97c0afaa9f5f25b613575e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLad os tale om udviklingsplanerne for projektet for automatiseret testning.<\/p>\n<p>Uden tvivl, s\u00e5 l\u00e6nge Sportmaster's loyalitetsprogram er aktivt og forts\u00e6tter med at udvikle sig, kan vi n\u00e6sten uendeligt videreudvikle autotests. Derfor er den prim\u00e6re udviklingsretning at udvide d\u00e6kningen.<\/p>\n<p>Efterh\u00e5nden som antallet af autotests stiger, vil den samlede k\u00f8retid ogs\u00e5 stigende, og vi m\u00e5 igen vende tilbage til sp\u00f8rgsm\u00e5let om ydeevne. Sandsynligvis vil l\u00f8sningen v\u00e6re at \u00f8ge antallet af parallelle tr\u00e5de.<\/p>\n<p>Men det er \u00e5benlyse udviklingsveje. Hvis vi skal tale om noget mere utraditionelt, s\u00e5 fremh\u00e6ver vi f\u00f8lgende:<\/p>\n<ol>\n<li>I \u00f8jeblikket h\u00e5ndteres autotests p\u00e5 niveauet for databasesystemet, dvs. der kr\u00e6ves kendskab til PL\/SQL for at arbejde succesfuldt. Efter behov kan administrationen af systemet (f.eks. udf\u00f8relse af k\u00f8rsel eller oprettelse af metadata) outsources til et admin-panel, som f.eks. Jenkins eller noget lignende.<\/li>\n<li>Alle elsker kvantitative og kvalitative m\u00e5linger. For automatiseret test er en s\u00e5dan universel m\u00e5ling Code Coverage eller kode d\u00e6kke metrics. Ved hj\u00e6lp af denne m\u00e5ling kan vi bestemme, hvilken procentdel af koden i vores testede system d\u00e6kkes af autotests. Fra version 12.2 tilbyder Oracle muligheder for beregning af denne m\u00e5ling og anbefaler at bruge standardpakken DBMS_PLSQL_CODE_COVERAGE.\n<p>Vores autotestsystem er lidt over et \u00e5r gammelt, og m\u00e5ske er det nu det rette tidspunkt at vurdere d\u00e6kningen. I mit tidligere projekt (som ikke var Sportmaster) viste det sig at v\u00e6re tilf\u00e6ldet. Et \u00e5r efter arbejdet med autotests satte ledelsen opgaven med at vurdere, hvor stor en del af koden vi d\u00e6kker. Ved en d\u00e6kning p\u00e5 over 1% ville ledelsen v\u00e6re tilfreds. Vi, udviklerne, forventede et resultat p\u00e5 omkring 10%. Vi tilknyttede code coverage, m\u00e5lte og fik 20%. I gl\u00e6den skyndte vi os for at f\u00e5 en bonus, men hvordan vi fik den og hvor vi gik hen senere, er en helt anden historie.<\/li>\n<li>Autotests kan kontrollere de udstillede webtjenester. Oracle giver os helt klart mulighed for at g\u00f8re dette, og vi vil ikke l\u00e6ngere st\u00f8de p\u00e5 en r\u00e6kke problemer. <\/li>\n<li>Og selvf\u00f8lgelig kan vores automatiserede testsystem anvendes i et andet projekt. Den l\u00f8sning, vi har udviklet, er universel og kr\u00e6ver kun brugen af Oracle. Jeg har h\u00f8rt, at der er interesse for automatiseret testning i andre projekter hos Sportmaster, og m\u00e5ske skal vi tage over til dem.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Konklusioner<\/h2>\n<p>\nLad os opsummere. I projektet med loyalitetssystemet i Sportmaster har vi form\u00e5et at implementere et automatiseret testsystem. Grundlaget for det er l\u00f8sningen utPLSQL fra Steven Feuerstein. Omkring utPLSQL er koden til autostests og hj\u00e6lpemodulerne: startmodul, datagenereringsmodul og andre. Autotests k\u00f8res dagligt, og vigtigst af alt, de fungerer og giver v\u00e6rdi. Vi er overbeviste om, at vi er begyndt at levere software af h\u00f8jere kvalitet. Den l\u00f8sning, vi har udviklet, er universel og kan frit anvendes i ethvert projekt, hvor der er behov for at organisere automatiseret testning p\u00e5 Oracle DB.<\/p>\n<p><i>P.S. Denne artikel blev ikke s\u00e6rlig konkret: der er meget tekst og n\u00e6sten ingen tekniske eksempler. Hvis emnet overordnet set er interessant, er vi klar til at forts\u00e6tte og vende tilbage med et opslag, hvor vi fort\u00e6ller, hvad der er \u00e6ndret i de seneste seks m\u00e5neder og medbringer kodeeksempler.<\/p>\n<p>Skriv kommentarer, hvis der er punkter, vi skal fokusere p\u00e5 i fremtiden, eller sp\u00f8rgsm\u00e5l, der kr\u00e6ver uddybning.<\/i><\/p>\n<p class=\"for_users_only_msg\">Kun registrerede brugere kan deltage i unders\u00f8gelsen. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Log ind<\/a><\/noindex>, please.<\/p>\n<h2 class=\"default-block__polling-title\">Skal vi skrive videre om dette?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Ja, selvf\u00f8lgelig<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Nej, tak<\/p>\n<\/li>\n<\/ul>\n<p>    12 brugere har stemt. 4 brugere har valgt at undlade at stemme.<br \/>\n<br \/>Kilde: <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.3 - 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\/da\/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.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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\udd47Unit-tests i DB \u2014 hvordan vi g\u00f8r det i Sportmaster, del to | ProHoster","description":"F\u00f8rste del \u2014 her.","canonical_url":"https:\/\/prohoster.info\/da\/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":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/37666","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=37666"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/37666\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/28269"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=37666"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=37666"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=37666"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}