{"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\/nl\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-pervaya","title":{"rendered":"Unit-tests in DBMS \u2014 hoe we dit doen bij Sportmaster, deel \u00e9\u00e9n","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hallo, Habr!<\/p>\n<p>Mijn naam is Maxim Ponomarenko en ik ben een ontwikkelaar bij Sportmaster. Ik heb tien jaar ervaring in de IT-sector. Ik begon mijn carri\u00e8re in manueel testen en schakelde toen over naar databaseontwikkeling. De afgelopen vier jaar heb ik, door de kennis die ik heb opgedaan in testen en ontwikkeling, me beziggehouden met automatisering van testen op het niveau van databases.<\/p>\n<p>Ik ben iets meer dan een jaar lid van het Sportmaster-team en werk aan een belangrijk project voor de ontwikkeling van geautomatiseerd testen. In april hebben mijn collega's van Sportmaster Lab en ik gepresenteerd op een conferentie in Krasnodar, mijn lezing had als titel \"Unit-tests in databases\", en nu wil ik deze met jullie delen. Er komt veel tekst, dus ik heb besloten om de presentatie in twee berichten te splitsen. In het eerste gaan we het hebben over autotests en testen in het algemeen, en in het tweede zal ik dieper ingaan op ons systeem voor unit-testing en de resultaten van de toepassing ervan.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/464335\/\"><img decoding=\"async\" alt=\"Unit-tests in DBMS \u2014 hoe we dit doen bij Sportmaster, deel \u00e9\u00e9n\" src=\"\/wp-content\/uploads\/2019\/08\/4e521cc85eb3a3806860a40ab2e4050f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Laten we beginnen met een beetje saaie theorie. Wat is automatisering van testen? Het is een testproces dat wordt uitgevoerd met software, en in de moderne IT wordt het steeds vaker gebruikt bij de ontwikkeling van software. Dit komt doordat bedrijven groeien, hun informatiesystemen zich uitbreiden en daarmee ook de hoeveelheid functionaliteit die getest moet worden. Handmatig testen wordt steeds kostbaarder.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nIk werkte bij een groot bedrijf waarvan de releases om de twee maanden plaatsvinden. Het kostte een maand om met een team van tien testers de functionaliteit handmatig te controleren. Door automatisering met een klein team van ontwikkelaars hebben we het testproces in anderhalf jaar kunnen verkorten tot twee weken. We hebben niet alleen de snelheid van het testen verhoogd, maar ook de kwaliteit ervan verbeterd. Automatische tests worden regelmatig uitgevoerd en zij lopen altijd de hele reeks controles die in hen zijn vastgelegd, wat betekent dat we de menselijke factor uitsluiten. <\/p>\n<p>In de moderne IT is het kenmerkend dat van een ontwikkelaar niet alleen wordt verwacht dat hij code schrijft voor een product, maar ook dat hij unit-tests schrijft die deze code controleren. <\/p>\n<p>Maar wat te doen als uw systeem voornamelijk op serverlogica is gebaseerd? Er is geen universele oplossing of best practices op de markt. Over het algemeen lossen bedrijven dit probleem op door een eigen op maat gemaakte testomgeving te cre\u00ebren. Zo'n eigen op maat gemaakte geautomatiseerde testsysteem is ontwikkeld in ons project, en daarover zal ik in mijn presentatie vertellen. <\/p>\n<p><img decoding=\"async\" alt=\"Unit-tests in DBMS \u2014 hoe we dit doen bij Sportmaster, deel \u00e9\u00e9n\" src=\"\/wp-content\/uploads\/2019\/08\/fee34f7214fb2075ee50fa0f4af14a44.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>We testen klantloyaliteit<\/h2>\n<p>\nLaten we beginnen met het project waar we het geautomatiseerde testsysteem hebben opgezet. Ons project is het loyaliteitsprogramma van Sportmaster (overigens hebben we er al over geschreven in <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/453252\/\">dit bericht<\/a><\/noindex>).<\/p>\n<p>Als uw bedrijf groot genoeg is, dan heeft uw loyaliteitssysteem drie standaardkenmerken: <\/p>\n<ul>\n<li>Uw systeem zal hoge belasting verwerken<\/li>\n<li>Uw systeem zal complexe rekenprocessen bevatten<\/li>\n<li>Uw systeem zal actief worden doorontwikkeld. <\/li>\n<\/ul>\n<p>\nLaten we in volgorde gaan\u2026 In totaal, als we naar alle merken van Sportmaster kijken, hebben we in Rusland, Oekra\u00efne, China, Kazachstan en Wit-Rusland meer dan 1000 winkels. In deze winkels worden dagelijks ongeveer 300.000 aankopen gedaan. Dat betekent dat er elke seconde 3-4 bonnen in ons systeem komen. Uiteraard is ons loyaliteitsysteem hoog belast. En omdat het intensief wordt gebruikt, moeten we de hoogste kwaliteitsnormen bieden, want elke fout in de software leidt tot grote financi\u00eble, reputatie- en andere verliezen. <\/p>\n<p>Tegelijkertijd zijn er meer dan honderd verschillende aanbiedingen actief bij Sportmaster. De aanbiedingen zijn zeer divers: er zijn productaanbiedingen, aanbiedingen die zijn gekoppeld aan de dag van de week, aanbiedingen die aan specifieke winkels zijn gebonden, aanbiedingen op basis van het aankoopbedrag en op het aantal producten. Kortom, het is behoorlijk complex. Klanten hebben bonuspunten en promotiecodes die ze bij hun aankopen gebruiken. Dit alles leidt ertoe dat het berekenen van elke bestelling een vrij niet-triviale taak is. <\/p>\n<p>Het algoritme voor het verwerken van bestellingen is echt vreselijk en complex. Zelfs kleine wijzigingen in dit algoritme kunnen behoorlijk risicovol zijn. Het lijkt erop dat de kleinste schijnbaar onbelangrijke veranderingen kunnen leiden tot onvoorspelbare effecten. Juist zulke complexe rekenprocessen, vooral die welke kritische functionaliteit uitvoeren, zijn de beste kandidaten voor automatisering. Het handmatig controleren van tientallen soortgelijke cases kost veel tijd. Aangezien het instappunt voor het proces onveranderlijk is, kan men het een keer beschrijven en vervolgens snel automatische tests genereren, waarbij men gerust kan zijn over de werking van de functionaliteit.<\/p>\n<p>Aangezien ons systeem actief wordt gebruikt, zal het bedrijf iets nieuws van je willen, bij de tijd willen blijven en klantgericht zijn. In ons loyaliteitsysteem worden releases om de twee maanden uitgebracht. Dit betekent dat we elke twee maanden een volledige regressie van het hele systeem moeten uitvoeren. Uiteraard, zoals in elke moderne IT, komt de ontwikkeling niet meteen van de ontwikkelaar naar de productie. Het ontstaat op de ontwikkelomgeving, gaat vervolgens door de testomgeving, de releaseomgeving, de acceptatieomgeving en komt dan pas in de productieomgeving. Minimaal op de test- en releaseomgevingen moeten we een volledige regressie van het hele systeem uitvoeren. <\/p>\n<p>De beschreven eigenschappen zijn standaard voor praktisch elk loyaliteitssysteem. Laten we het hebben over de kenmerken van ons project.<\/p>\n<p>Technologisch gezien is 90% van de logica van ons loyaliteitssysteem server-side en ge\u00efmplementeerd op Oracle. Er is een cli\u00ebnt ontwikkeld in Delphi, die de functie van ARM-beheerder vervult. Er zijn ook webservices opgezet voor externe applicaties (bijvoorbeeld een website). Daarom is het heel logisch dat als we een systeem voor geautomatiseerde testing opzetten, we dit op Oracle doen.<\/p>\n<p>Het loyaliteitsprogramma bij Sportmaster bestaat al meer dan 7 jaar en is ontwikkeld door individuele ontwikkelaars... Het gemiddelde aantal ontwikkelaars dat aan ons project werkte gedurende deze 7 jaar was 3-4 personen. Maar in het afgelopen jaar is ons team aanzienlijk gegroeid, en nu werken er 10 mensen aan het project. Dit betekent dat er mensen bij het project komen die niet bekend zijn met standaardtaken, processen en architectuur. Er is daarom een verhoogd risico dat we fouten over het hoofd zien.<\/p>\n<p>Kenmerkend voor het project is het ontbreken van aparte testers als vaste medewerkers. Er is zeker testing, maar testers zijn analisten die, naast hun andere verantwoordelijkheden, ook communiceren met zakelijke klanten, gebruikers en eisen voor het systeem ontwikkelen, enzovoorts... Ondanks dat de testing van hoge kwaliteit is (het is vooral relevant om te vermelden, aangezien een van de analisten deze rapportage zou kunnen zien), blijft de effectiviteit van specialisatie en focus op \u00e9\u00e9n aspect niet te onderschatten.<\/p>\n<p>Gezien het bovenstaande lijkt het idee om de testing van het project te automatiseren, uiterst logisch voor het verbeteren van de kwaliteit van het geleverde product en het verkorten van de ontwikkeltijd. In verschillende fasen van het bestaan van het loyaliteitsprogramma hebben afzonderlijke ontwikkelaars geprobeerd hun code te dekken met unit-tests. Dit was over het algemeen een vrij onsamenhangend proces, waarbij iedereen zijn eigen architectuur en methoden gebruikte. Wat betreft de unit-tests waren de uiteindelijke resultaten gemeenschappelijk: tests werden ontwikkeld, enige tijd gebruikt, opgeslagen in een versiebeheersysteem, maar op een gegeven moment stopten ze met draaien en werden vergeten. Dit gebeurde in de eerste plaats omdat de tests meer aan een specifieke uitvoerder dan aan het project waren gekoppeld.<\/p>\n<h2>Hier komt utPLSQL van pas.<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Unit-tests in DBMS \u2014 hoe we dit doen bij Sportmaster, deel \u00e9\u00e9n\" src=\"\/wp-content\/uploads\/2019\/08\/f21dfcb085aace687566dc51cb9b5613.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWeet je iets over Steven Feuerstein? <\/p>\n<p>Dit is een slimme kerel die een groot deel van zijn carri\u00e8re heeft gewijd aan het werken met Oracle en PL\/SQL, en voldoende materie over dit onderwerp heeft geschreven. E\u00e9n van zijn bekende boeken heet \"Oracle PL\/SQL. Voor professionals\". Het is Steven die de ontwikkeling van de utPLSQL-oplossing heeft verzorgd, ofwel, zoals het wordt ontcijferd, het Unit Testing framework voor Oracle PL\/SQL. De utPLSQL-oplossing werd in 2016 gecre\u00eberd, maar er wordt actief aan verder gewerkt en er worden nieuwe versies uitgebracht. Op het moment van de presentatie dateert de laatste versie van 24 maart 2019.<br \/>\nWat is dit nu precies? Het is een afzonderlijk open-source project. Het weegt een paar megabytes inclusief voorbeelden en documentatie. Fysiek is het een aparte schema in de ORACLE-database met een set pakketten en tabellen voor het organiseren van unit-testing. De installatie duurt enkele seconden. Een kenmerk van utPLSQL is de eenvoud van gebruik. <br \/>\nGlobaal gesproken is utPLSQL een mechanisme voor het uitvoeren van unit-tests, waarbij een unit-test wordt gezien als gewone Oracle-pakketprocedures, waarvan de organisatie aan bepaalde regels voldoet. Naast het uitvoeren wordt in utPLSQL een log opgeslagen van al uw testuitvoeringen, en er is ook een intern rapportagesysteem.<\/p>\n<p>Laten we aan de hand van een voorbeeld kijken hoe de code voor een unit-test eruitziet, die volgens deze methode is gerealiseerd.<\/p>\n<p><img decoding=\"async\" alt=\"Unit-tests in DBMS \u2014 hoe we dit doen bij Sportmaster, deel \u00e9\u00e9n\" src=\"\/wp-content\/uploads\/2019\/08\/6fc8cc2d84c6c32a8b5269ebad1d2381.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOp het scherm staat de code voor een typische specificatie van een pakket met unit-tests. Wat zijn de verplichtingen? Het pakket moet de prefix \"utp_\" hebben. Alle procedures met tests moeten dezelfde prefix hebben. In het pakket moeten twee standaardprocedures aanwezig zijn: \"utp_setup\" en \"utp_teardown\". De eerste procedure wordt aangeroepen bij het opnieuw opstarten van elke unit-test, de tweede na de uitvoering.<\/p>\n<p>\"utp_setup\" bereidt doorgaans ons systeem voor op de uitvoering van de unit-test, bijvoorbeeld door testgegevens aan te maken. \"utp_teardown\" daarentegen brengt alles terug naar de oorspronkelijke instellingen en reset de uitvoeringsresultaten.<\/p>\n<p>Hier is een voorbeeld van de eenvoudigste unit-test die de normalisatie van het ingevoerde telefoonnummer van de klant naar de standaard voor ons loyaliteitsprogramma controleert. Er zijn geen verplichte standaarden voor het schrijven van procedures met unit-tests. Over het algemeen wordt een bepaalde methode van het te testen systeem aangeroepen en wordt het resultaat dat door deze methode wordt teruggegeven vergeleken met de referentie. Het is belangrijk dat de vergelijking van het referentieresultaat met het verkregen resultaat plaatsvindt via standaard utPLSQL-methoden.<\/p>\n<p>In een unit-test kunnen er meerdere controles zijn. Zoals te zien is in het voorbeeld, doen we vier opeenvolgende aanroepen van de te testen methode voor de normalisatie van het telefoonnummer en evalueren we het resultaat na elke aanroep. Bij het ontwikkelen van een unit-test moet rekening worden gehouden met het feit dat er controles zijn die geen invloed op het systeem hebben, en na sommige moet het systeem worden teruggezet naar de oorspronkelijke staat. <br \/>\nBijvoorbeeld, in de gepresenteerde unit-test formatteren we gewoon het ingevoerde telefoonnummer, wat geen invloed heeft op het loyaliteitssysteem. <\/p>\n<p>Als we echter unit-tests schrijven voor de methode om een nieuwe klant te cre\u00ebren, zal er na elke controle een nieuwe klant in het systeem worden aangemaakt, wat de volgende uitvoering van de test kan be\u00efnvloeden.<\/p>\n<p><img decoding=\"async\" alt=\"Unit-tests in DBMS \u2014 hoe we dit doen bij Sportmaster, deel \u00e9\u00e9n\" src=\"\/wp-content\/uploads\/2019\/08\/7d649b354776c15d8a70a0d9a05363b4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZo worden unit-tests uitgevoerd. Er zijn twee toegestane manieren van uitvoeren: het starten van alle unit-tests uit een specifieke package of het uitvoeren van een specifieke unit-test in een specifieke package.<\/p>\n<p><img decoding=\"async\" alt=\"Unit-tests in DBMS \u2014 hoe we dit doen bij Sportmaster, deel \u00e9\u00e9n\" src=\"\/wp-content\/uploads\/2019\/08\/46628b60eb0fe0d20df822ddca914947.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHier ziet u een voorbeeld van een intern rapportagesysteem. Op basis van de resultaten van de unit-test genereert utPLSQL een klein rapport. Hierin zien we het resultaat van elke specifieke controle en het algemene resultaat van de uitvoering van de unit-test. <\/p>\n<h2>6 regels voor autotests<\/h2>\n<p>\nVoordat we beginnen met het opzetten van een nieuw systeem voor geautomatiseerd testen van het loyaliteitssysteem, hebben we samen met het management de principes vastgesteld waaraan onze toekomstige autotests moeten voldoen.<\/p>\n<p><img decoding=\"async\" alt=\"Unit-tests in DBMS \u2014 hoe we dit doen bij Sportmaster, deel \u00e9\u00e9n\" src=\"\/wp-content\/uploads\/2019\/08\/84be59663203abb373e7074b9a6cd4e4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ol>\n<li>Automatische tests moeten effectief zijn en waarde toevoegen. We hebben geweldige ontwikkelaars, over wie we zeker moeten spreken, want iemand van hen zal ongetwijfeld deze presentatie zien en zij schrijven geweldig code. Maar zelfs hun geweldige code is niet perfect en bevatte, bevat en zal fouten bevatten. Automatische tests moeten deze fouten opsporen. Als dat niet het geval is, schrijven we slechte automatische tests of bevinden we ons in een dode zone die in principe niet verder wordt ontwikkeld. In beide gevallen doen we iets verkeerd en is onze aanpak gewoon zinloos.<\/li>\n<li>Automatische tests moeten worden gebruikt. Het is zinloos om veel tijd en moeite te besteden aan het schrijven van een softwareproduct, de repository samen te stellen en het dan te vergeten. Tests moeten worden uitgevoerd en zo regelmatig mogelijk worden gedraaid.<\/li>\n<li>Automatische tests moeten stabiel werken. Ongeacht het tijdstip van de dag, de testomgeving en andere systeeminstellingen, moeten de testuitvoeringen altijd hetzelfde resultaat opleveren. Gewoonlijk wordt dit verzekerd doordat automatische tests werken met speciale testgegevens met vaste systeeminstellingen.<\/li>\n<li>Automatische tests moeten met een aanvaardbare snelheid voor uw project werken. Deze tijd wordt individueel bepaald voor elk systeem. Sommigen kunnen de hele dag werken, terwijl anderen kritisch in enkele seconden moeten kunnen leveren. Welke snelheidseisen we in ons project hebben bereikt, zal ik iets later toelichten.<\/li>\n<li>De ontwikkeling van automatische tests moet flexibel zijn. Het is ongewenst om afstand te doen van het testen van een bepaalde functionaliteit alleen omdat we dat nog niet hebben gedaan of om andere redenen. utPLSQL legt geen beperkingen op aan de ontwikkeling, en Oracle staat in principe de implementatie van allerlei dingen toe. De meeste taken hebben een oplossing, de vraag is alleen de tijd en de inspanning die nodig zijn.<\/li>\n<li>Deployability. We hebben verschillende omgevingen waar de tests moeten worden uitgevoerd. Op elk van deze omgevingen kan op elk moment een gegevensdump worden ge\u00fcpdatet. Het project met automatische tests moet zo worden beheerd dat we zonder problemen een volledige of gedeeltelijke installatie kunnen uitvoeren.<\/li>\n<\/ol>\n<p>In de tweede post over een paar dagen zal ik vertellen wat we hebben gedaan en welke resultaten we hebben behaald.<br \/>\n<br \/>Bron: <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\/nl\/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=\"nl_NL\" \/>\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\/nl\/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-tests in databases \u2014 hoe wij dit doen bij Sportmaster, deel \u00e9\u00e9n | ProHoster","description":"Hallo, Habr! Ik ben Maxim Ponomarenko en ik ben ontwikkelaar bij Sportmaster. Ik heb 10 jaar ervaring in de IT-sector. Ik begon mijn carri\u00e8re in handmatige tests, daarna schakelde ik over naar databaseontwikkeling.","canonical_url":"https:\/\/prohoster.info\/nl\/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":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/37495","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=37495"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/37495\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/28136"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=37495"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=37495"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=37495"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}