{"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\/da\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-pervaya","title":{"rendered":"Unit-tests in databases \u2014 how we do it at Sportmaster, part one","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hello, Habr!<\/p>\n<p>My name is Maxim Ponomarenko and I am a developer at Sportmaster. I have 10 years of experience in the IT field. I started my career in manual testing and then switched to database development. For the last 4 years, accumulating knowledge gained in testing and development, I have been involved in automating testing at the database level.<\/p>\n<p>I have been part of the Sportmaster team for just over a year and am working on automated testing for a major project. In April, my teammates from Sportmaster Lab and I presented at a conference in Krasnodar; my presentation was titled 'Unit-tests in databases,' and I now want to share it with you. There will be a lot of text, so I decided to split the presentation into two posts. In the first, we will discuss automated tests and testing in general, and in the second, I will go into more detail about our unit-testing system and the results of its application.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/464335\/\"><img decoding=\"async\" alt=\"Unit-tests in databases \u2014 how we do it at Sportmaster, part one\" src=\"\/wp-content\/uploads\/2019\/08\/4e521cc85eb3a3806860a40ab2e4050f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Let's start with a bit of boring theory. What is automated testing? It is testing conducted by software tools, and in modern IT, it is increasingly being used in software development. This is because companies are growing, their information systems are expanding, and consequently, the amount of functionality that needs to be tested is also increasing. Performing manual testing is becoming more and more cumbersome.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nI worked at a large company where releases occurred every two months. During this time, a whole month was spent having a dozen testers manually check functionality. Thanks to the implementation of automation by a small team of developers, we managed to reduce testing time to 2 weeks over the course of a year and a half. We not only increased the speed of testing but also improved its quality. Automated tests are run regularly and they always perform the entire set of checks programmed into them, which means we eliminate human error. <\/p>\n<p>In modern IT, it is characteristic that a developer may be required not only to write product code but also to write unit tests that verify this code. <\/p>\n<p>Men hvad g\u00f8r man, hvis dit system prim\u00e6rt er baseret p\u00e5 serverlogik? Der findes ikke nogen universel l\u00f8sning eller best practices p\u00e5 markedet. Som regel l\u00f8ser virksomheder dette problem ved at skabe deres eget skr\u00e6ddersyede testsystem. Et s\u00e5dant skr\u00e6ddersyet automatiseret testsystem blev oprettet i vores projekt, og jeg vil tale om det i mit foredrag. <\/p>\n<p><img decoding=\"async\" alt=\"Unit-tests in databases \u2014 how we do it at Sportmaster, part one\" src=\"\/wp-content\/uploads\/2019\/08\/fee34f7214fb2075ee50fa0f4af14a44.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Test af loyalitet<\/h2>\n<p>\nLad os f\u00f8rst tale om projektet, hvor vi implementerede et automatiseret testsystem. Vores projekt er et loyalitetssystem for Sportmaster (for \u00f8vrigt har vi allerede skrevet om det i <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/453252\/\">dette indl\u00e6g<\/a><\/noindex>).<\/p>\n<p>Hvis din virksomhed er stor nok, vil dit loyalitetssystem have tre standardegenskaber: <\/p>\n<ul>\n<li>Dit system vil v\u00e6re h\u00f8jtydende<\/li>\n<li>Dit system vil indeholde komplekse beregningsprocesser<\/li>\n<li>Dit system vil blive aktivt videreudviklet. <\/li>\n<\/ul>\n<p>\nLad os tage det i r\u00e6kkef\u00f8lge... I alt, n\u00e5r vi ser p\u00e5 alle Sportmasters brands, har vi mere end 1000 butikker i Rusland, Ukraine, Kina, Kasakhstan og Hviderusland. Der foretages omkring 300.000 k\u00f8b dagligt i disse butikker. Det vil sige, at der i vores system kommer 3-4 kvitteringer hvert sekund. Naturligvis er vores loyalitetssystem h\u00f8jtydende. Og da det bliver aktivt brugt, skal vi levere de h\u00f8jeste standarder for dets kvalitet, for enhver fejl i softwaren medf\u00f8rer store \u00f8konomiske, omd\u00f8mmem\u00e6ssige og andre tab. <\/p>\n<p>Samtidig k\u00f8rer der mere end hundrede forskellige kampagner hos Sportmaster. Kampagnerne er meget forskellige: der er varekampagner, kampagner knyttet til ugedagen, kampagner knyttet til bestemte butikker, kampagner baseret p\u00e5 kvitteringsbel\u00f8bet og kampagner baseret p\u00e5 antallet af varer. Alt i alt, en del af en udfordring. Kunderne har bonusser og promo-koder, der bruges ved k\u00f8b. Alt dette f\u00f8rer til, at beregningen af enhver ordre er en ret kompliceret opgave. <\/p>\n<p>Algoritmen, der h\u00e5ndterer ordrebehandling, er virkelig forf\u00e6rdelig og kompleks. Enhver \u00e6ndring i denne algoritme er en ret risikabel aff\u00e6re. Det viste sig, at selv de mest tilsyneladende ubetydelige \u00e6ndringer kunne f\u00f8re til ret uforudsigelige effekter. Og netop s\u00e5danne komplekse beregningsprocesser, is\u00e6r dem der implementerer kritisk funktionalitet, er de bedste kandidater til automatisering. At kontrollere d\u00f8re til d\u00f8re tilf\u00e6ldene manuelt er meget tidskr\u00e6vende. Da indgangspunktet til processen forbliver u\u00e6ndret, kan man ved \u00e9n gang at beskrive det hurtigere masseproducere automatiserede tests og v\u00e6re sikker p\u00e5 funktionaliteten.<\/p>\n<p>Da vores system aktivt anvendes, vil forretningen forvente noget nyt fra dig, at f\u00f8lge med tiden og v\u00e6re kundeorienteret. I vores loyalitetssystem frigives der nye versioner hver anden m\u00e5ned. Det betyder, at vi hvert andet m\u00e5ned skal udf\u00f8re en fuld regression af hele systemet. Som i enhver moderne IT, g\u00e5r udviklingen naturligvis ikke direkte fra udvikler til produktion. Den begynder p\u00e5 udviklerkonturen, g\u00e5r derefter gennem testmilj\u00f8et, frigivelsesmilj\u00f8et, accepttestmilj\u00f8et, og endelig n\u00e5r den produktionen. I det mindste skal vi udf\u00f8re en fuld regression af hele systemet p\u00e5 test- og frigivelsesmilj\u00f8erne. <\/p>\n<p>De beskrevne egenskaber er standard for n\u00e6sten ethvert loyalitetssystem. Lad os tale om s\u00e6regenhederne ved vores projekt.<\/p>\n<p>Teknologisk set er 90% af logikken i vores loyalitetssystem serverbaseret og implementeret i Oracle. Der er en klient til Delphi, der fungerer som administratorens arbejdsplads. Der er udsatte webtjenester til eksterne applikationer (for eksempel webstedet). Derfor er det ganske logisk, at hvis vi skal implementere et automatiseret testsystem, s\u00e5 vil vi g\u00f8re det p\u00e5 Oracle.<\/p>\n<p>Loyalty system in Sportmaster has been around for over 7 years and was created by individual developers\u2026 The average number of developers on our project during these 7 years was 3-4 people. However, in the past year, our team has significantly increased, and now 10 people are working on the project. This means that new team members are coming on board who are not familiar with standard tasks, processes, and architecture. There is a heightened risk that we will overlook mistakes.<\/p>\n<p>The project is characterized by the absence of dedicated testers as full-time staff. Certainly, testing is done, but it is conducted by analysts, in addition to their other key responsibilities: communicating with business clients, users, developing system requirements, etc. Despite the fact that testing is conducted very thoroughly (it is especially worth mentioning as some of the analysts might come across this report), the effectiveness of specialization and focus on a single task cannot be overlooked.<\/p>\n<p>Given all of the above, to improve the quality of the delivered product and reduce development timelines, the idea of automating testing on the project seems quite logical. At different stages of the loyalty system's existence, individual developers have made efforts to cover their code with unit tests. This was generally a rather fragmented process, where each individual used their own architecture and methods. The common outcomes for unit tests were that tests were developed, used for some time, stored in version control, but at some point, they stopped running and were forgotten. This primarily happened because the tests were more tied to specific executors rather than the project.<\/p>\n<h2>Help comes from utPLSQL<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Unit-tests in databases \u2014 how we do it at Sportmaster, part one\" src=\"\/wp-content\/uploads\/2019\/08\/f21dfcb085aace687566dc51cb9b5613.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDo you know anything about Steven Feurstain? <\/p>\n<p>Han er en klog fyr, der har brugt en betydelig del af sin karriere p\u00e5 at arbejde med Oracle og PL\/SQL, og han har skrevet en hel del om emnet. En af hans kendte b\u00f8ger b\u00e6rer titlen: \u00abOracle PL\/SQL. For professionelle\u00bb. Det var Stephen, der udviklede l\u00f8sningen utPLSQL, som st\u00e5r for Unit Testing framework for Oracle PL\/SQL. L\u00f8sningen utPLSQL blev skabt i 2016, men der arbejdes stadig aktivt p\u00e5 den, og der udgives nye versioner. P\u00e5 tidspunktet for foredraget var den nyeste version dateret 24. marts 2019.<br \/>\nHvad er det egentlig? Det er et separat open source-projekt. Det fylder et par megabyte inklusive eksempler og dokumentation. Fysisk set er det en separat skema i ORACLE-databasen med et s\u00e6t pakker og tabeller til organisering af unit-testning. Installationen tager et par sekunder. En s\u00e6rpr\u00e6g ved utPLSQL er enkelheden i brugen. <br \/>\nOverordnet set repr\u00e6senterer utPLSQL en mekanisme til at k\u00f8re unit-tests, hvor en unit-test forst\u00e5s som almindelige Oracle-pakkeprocedurer, hvis organisation f\u00f8lger visse regler. Udover at k\u00f8re tests, gemmer utPLSQL en log over alle dine testk\u00f8rsler, og der er ogs\u00e5 et internt rapporteringssystem.<\/p>\n<p>Lad os se p\u00e5 et eksempel p\u00e5, hvordan koden til en unit-test ser ud, n\u00e5r den er implementeret efter denne metode.<\/p>\n<p><img decoding=\"async\" alt=\"Unit-tests in databases \u2014 how we do it at Sportmaster, part one\" src=\"\/wp-content\/uploads\/2019\/08\/6fc8cc2d84c6c32a8b5269ebad1d2381.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS\u00e5 p\u00e5 sk\u00e6rmen vises koden til en typisk pakke-specifikation med unit-tests. Hvilke obligatoriske krav er der? Pakken skal have pr\u00e6fikset \u00abutp_\u00bb. Alle procedurer med tests skal have pr\u00e6cis det samme pr\u00e6fiks. I pakken skal der obligatorisk v\u00e6re to standardprocedurer: \u00abutp_setup\u00bb og \u00abutp_teardown\u00bb. Den f\u00f8rste procedure kaldes f\u00f8r hver unit-test, den anden kaldes efter k\u00f8rslen.<\/p>\n<p>\u00abutp_setup\u00bb forbereder normalt vores system til at k\u00f8re unit-testen, for eksempel ved at oprette testdata. \u00abutp_teardown\u00bb - derimod - s\u00f8rger for at returnere alt til de oprindelige indstillinger og nulstille resultaterne af k\u00f8rslen.<\/p>\n<p>Her er et eksempel p\u00e5 den mest grundl\u00e6ggende unit test, der kontrollerer normaliseringen af det indtastede kundenummer til den standardform, vi har i vores loyalitetssystem. Der er ingen obligatoriske standarder for, hvordan man skriver procedurer med unit tests. Som regel kaldes en eller anden metode i det testede system, og det resultat, som denne metode returnerer, sammenlignes med et referencev\u00e6rdi. Det er vigtigt, at sammenligningen mellem referencev\u00e6rdien og den opn\u00e5ede foreg\u00e5r gennem standard utPLSQL-metoder.<\/p>\n<p>Der kan v\u00e6re et vilk\u00e5rligt antal kontroller i unit testen. Som det fremg\u00e5r af eksemplet, foretager vi fire p\u00e5 hinanden f\u00f8lgende opkald til den testede metode for normalisering af telefonnummeret, og efter hvert opkald vurderer vi resultatet. Ved udviklingen af en unit test skal man tage h\u00f8jde for, at der findes kontroller, der ikke p\u00e5virker systemet, mens der efter nogle skal rulles tilbage til systemets oprindelige tilstand. <br \/>\nFor eksempel i den pr\u00e6senterede unit test formaterer vi blot det indkommende telefonnummer, hvilket ikke har nogen indvirkning p\u00e5 loyalitetssystemet. <\/p>\n<p>Men n\u00e5r vi skriver unit tests for metoden til oprettelse af en ny klient, vil der efter hver test blive oprettet en ny klient i systemet, hvilket kan p\u00e5virke den efterf\u00f8lgende k\u00f8rsel af testen.<\/p>\n<p><img decoding=\"async\" alt=\"Unit-tests in databases \u2014 how we do it at Sportmaster, part one\" src=\"\/wp-content\/uploads\/2019\/08\/7d649b354776c15d8a70a0d9a05363b4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS\u00e5dan k\u00f8res unit tests. Der er to tilladte m\u00e5der at k\u00f8re dem p\u00e5: at k\u00f8re alle unit tests fra en bestemt pakke eller at k\u00f8re en specifik unit test i en bestemt pakke.<\/p>\n<p><img decoding=\"async\" alt=\"Unit-tests in databases \u2014 how we do it at Sportmaster, part one\" src=\"\/wp-content\/uploads\/2019\/08\/46628b60eb0fe0d20df822ddca914947.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHer er et eksempel p\u00e5 et internt rapportsystem. P\u00e5 baggrund af resultaterne af unit testen genererer utPLSQL en lille rapport. Her ser vi resultatet af hver specifik kontrol samt det samlede resultat af unit testen. <\/p>\n<h2>6 regler for automatiserede tests<\/h2>\n<p>\nF\u00f8r vi g\u00e5r i gang med at opbygge et nyt system til automatiseret testning af loyalitetssystemet, har vi i samarbejde med ledelsen fastlagt de principper, som vores fremtidige automatiserede tests skal overholde.<\/p>\n<p><img decoding=\"async\" alt=\"Unit-tests in databases \u2014 how we do it at Sportmaster, part one\" src=\"\/wp-content\/uploads\/2019\/08\/84be59663203abb373e7074b9a6cd4e4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ol>\n<li>Automatiserede tests skal v\u00e6re effektive og g\u00f8re gavn. Vi har fantastiske udviklere, som absolut fortjener at blive n\u00e6vnt, for en af dem vil sandsynligvis se denne rapport, og de skriver str\u00e5lende kode. Men selv deres fantastiske kode er ikke perfekt og har, har stadig og vil altid have fejl. Automatiserede tests skal finde disse fejl. Hvis ikke, s\u00e5 skriver vi enten d\u00e5rlige automatiserede tests, eller vi er kommet ind i et d\u00f8dvande, som i princippet ikke udvikles. I begge tilf\u00e6lde g\u00f8r vi noget forkert, og vores tilgang er simpelthen meningsl\u00f8s.<\/li>\n<li>Automatiserede tests skal bruges. Det er meningsl\u00f8st at bruge en masse tid og kr\u00e6fter p\u00e5 at skrive et softwareprodukt, pakke det i et repository og s\u00e5 glemme det. Tests skal k\u00f8res, og de skal k\u00f8res s\u00e5 regelm\u00e6ssigt som muligt.<\/li>\n<li>Automatiserede tests skal arbejde stabilt. Uanset tid p\u00e5 dagen, teststand og andre systemindstillinger skal testresultaterne v\u00e6re de samme. Som regel sikres dette ved, at automatiserede tests arbejder med s\u00e6rlige testdata med faste systemindstillinger.<\/li>\n<li>Automatiserede tests skal k\u00f8re med en hastighed, der er acceptabel for dit projekt. Denne tid bestemmes individuelt for hvert system. Nogle kan tillade at arbejde hele dagen, mens andre kritisch skal klare det inden for sekunder. Hvilke hastighedsnormer vi har opn\u00e5et i vores projekt, vil jeg fort\u00e6lle mere om senere.<\/li>\n<li>Udviklingen af automatiserede tests skal v\u00e6re fleksibel. Det er u\u00f8nsket at opgive at teste en funktionalitet bare fordi vi ikke har gjort det f\u00f8r eller af andre ideologiske grunde. utPLSQL p\u00e5l\u00e6gger ingen begr\u00e6nsninger for udviklingen, og Oracle tillader generelt at implementere meget forskellige ting. De fleste opgaver har en l\u00f8sning; sp\u00f8rgsm\u00e5let er kun om tid og de ressourcer, der er brugt.<\/li>\n<li>Udrulning. Vi har flere teststande, hvor tests skal k\u00f8res. P\u00e5 hver af standene kan data-dumpet opdateres n\u00e5r som helst. Projektet med automatiserede tests skal styres s\u00e5ledes, at det er muligt at udf\u00f8re en fuld eller delvis installation uden problemer.<\/li>\n<\/ol>\n<p>Og i det andet indl\u00e6g om et par dage vil jeg fort\u00e6lle, hvad vi har gjort, og hvilke resultater vi har opn\u00e5et.<br \/>\n<br \/>Kilde: <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.3 - 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\/da\/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.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 \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\/da\/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\udd47Unit-test i DBMS \u2014 s\u00e5dan g\u00f8r vi det hos Sportmaster, f\u00f8rste del | ProHoster","description":"Hej, Habr! Mit navn er Maksim Ponomarenko, og jeg er udvikler hos Sportmaster. Jeg har 10 \u00e5rs erfaring inden for IT-branchen. Jeg begyndte min karriere inden for manuel testning og skiftede derefter til databasedesign.","canonical_url":"https:\/\/prohoster.info\/da\/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":"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 \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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/37495","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=37495"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/37495\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/28136"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=37495"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=37495"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=37495"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}