{"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\/de\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-vtoraya","title":{"rendered":"Unit-Tests in DBMS \u2013 wie wir das im Sportmaster machen, Teil zwei","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i>Der erste Teil \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/464335\/\">hier<\/a><\/noindex>.<\/i><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/465047\/\"><img decoding=\"async\" alt=\"Unit-Tests in DBMS \u2013 wie wir das im Sportmaster machen, Teil zwei\" src=\"\/wp-content\/uploads\/2019\/09\/b9fb8c934885abdf3ef928bfd75bdc2a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Stellen Sie sich die Situation vor. Sie stehen vor der Aufgabe, eine neue Funktionalit\u00e4t zu entwickeln. Sie haben Material von Ihren Vorg\u00e4ngern. Angenommen, Sie haben keine moralischen Verpflichtungen, wie w\u00fcrden Sie handeln?<\/p>\n<p>Meistens geraten alle alten Entwicklungen in Vergessenheit und alles beginnt von neuem. Niemand mag es, sich in fremdem Code zu verlieren, und wenn man Zeit hat, warum nicht ein eigenes System schaffen? Dies ist ein typischer Ansatz und in vielerlei Hinsicht richtig. Aber in unserem Projekt haben wir es anders gemacht. Wir haben das Fundament f\u00fcr das zuk\u00fcnftige System automatischer Tests auf den Grundlagen der Unit-Tests auf utPLSQL von unseren Vorg\u00e4ngern aufgebaut und dann in mehreren parallelen Richtungen gearbeitet.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<ol>\n<li><b>Wiederherstellung alter Unit-Tests.<\/b> Unter Wiederherstellung verstehen wir die Anpassung der Tests an den aktuellen Zustand des Loyalit\u00e4tssystems und die Anpassung der Tests an die Standards von utPLSQL. <\/li>\n<li><b>L\u00f6sung des Problems des Verst\u00e4ndnisses, welche Methoden und Prozesse durch automatisierte Tests abgedeckt sind. <\/b>Wir m\u00fcssen entweder diese Informationen im Kopf behalten oder Schlussfolgerungen basierend auf dem Code der automatisierten Tests ziehen. Daher haben wir beschlossen, ein Verzeichnis zu erstellen. Jeder automatisierte Test erhielt einen einzigartigen Mnemonik-Code, wir formulierten eine Beschreibung und hielten die Einstellungen fest (zum Beispiel unter welchen Bedingungen er gestartet werden soll oder was passieren sollte, wenn der Test fehlgeschlagen ist). Im Wesentlichen haben wir Metadaten \u00fcber die automatisierten Tests gesammelt und diese Metadaten in die Standardtabellen des utPLSQL-Schemas eingef\u00fcgt.<\/li>\n<li><b>Definition der Erweiterungsstrategie, d.h. Auswahl der Funktionalit\u00e4t, die durch automatisierte Tests \u00fcberpr\u00fcft werden soll.<\/b> Wir haben beschlossen, uns auf drei Dinge zu konzentrieren: neue Erweiterungen des Systems, Vorf\u00e4lle aus der Produktion und Schl\u00fcsselprozesse des Systems. Auf diese Weise entwickeln wir uns parallel mit dem Release weiter, gew\u00e4hrleisten eine h\u00f6here Qualit\u00e4t und erweitern gleichzeitig das Regressionsvolumen und sichern die Zuverl\u00e4ssigkeit des Systems an kritischen Stellen. Der erste Engpass war der Prozess der Verteilung von Rabatten und Boni auf den Beleg.<\/li>\n<li><b>Nat\u00fcrlich haben wir uns mit der Entwicklung neuer automatisierter Tests besch\u00e4ftigt. <\/b>Eine der ersten Release-Aufgaben bestand in der Bewertung der Leistung vordefinierter Abfragen des Loyalit\u00e4tssystems. In unserem Projekt gibt es einen Block fest definierter SQL-Abfragen, die Kunden nach bestimmten Kriterien ausw\u00e4hlen. Zum Beispiel eine Liste aller Kunden zu erhalten, deren letzter Einkauf in einer bestimmten Stadt erfolgt ist, oder eine Liste von Kunden, deren durchschnittlicher Einkaufswert \u00fcber einem bestimmten Betrag liegt. Nachdem wir automatische Tests geschrieben hatten, haben wir die vordefinierten Abfragen \u00fcberpr\u00fcft, die Referenzparameter der Leistung festgehalten, und zudem unser Lasttestverfahren eingef\u00fchrt.<\/li>\n<li><b>Die Arbeit mit automatischen Tests sollte benutzerfreundlich sein.<\/b>Am h\u00e4ufigsten werden zwei Aktionen durchgef\u00fchrt: das Starten automatischer Tests und das Erstellen von Testdaten. So wurden in unserem System zwei Hilfsmodulen geschaffen: ein Startmodul und ein Datenmodul.\n<p>Das Startmodul wird als eine universelle Prozedur mit einem Texteingabeparameter dargestellt. Als Parameter kann der Mnemonik-Code des automatischen Tests, der Paketname, der Name des Tests, die Konfiguration des automatischen Tests oder ein reserviertes Schl\u00fcsselwort \u00fcbergeben werden. Die Prozedur w\u00e4hlt und startet alle automatischen Tests, die die Bedingungen erf\u00fcllen.<\/p>\n<p>Das Datenmodul wird in Form eines Pakets dargestellt, in dem f\u00fcr jedes Objekt des zu testenden Systems (Tabelle in der DB) eine spezielle Prozedur erstellt wurde, die dort Daten einf\u00fcgt. In dieser Prozedur sind die Standardwerte maximal ausgef\u00fcllt, was die Erstellung von Objekten buchst\u00e4blich auf Knopfdruck erm\u00f6glicht. F\u00fcr die Benutzerfreundlichkeit wurden Vorlagen f\u00fcr die zu erstellenden Daten erstellt. Zum Beispiel, einen Kunden bestimmten Alters mit einer Testtelefonnummer und einem get\u00e4tigten Einkauf zu erstellen.<\/li>\n<li><b>Automatische Tests sollten in einer f\u00fcr Ihr System akzeptablen Zeit gestartet und ausgef\u00fchrt werden. <\/b>Daher wurde ein t\u00e4glicher n\u00e4chtlicher Start organisiert, nach dessen Ergebnis ein Bericht \u00fcber die Ergebnisse erstellt und an das gesamte Entwicklungsteam \u00fcber die Unternehmens-E-Mail versendet wird. Nach der Wiederherstellung alter automatischer Tests und der Erstellung neuer hatte die Gesamtdauer 30 Minuten betragen. Diese Leistung war f\u00fcr alle akzeptabel, da der Start au\u00dferhalb der Arbeitszeiten stattfand.\n<p>Aber die Optimierung der Geschwindigkeit erforderte einige Arbeit. Das Update des Loyalit\u00e4tssystems im Produktionsumfeld erfolgt nachts. Im Rahmen eines der Releases mussten wir nachts kurzfristig \u00c4nderungen vornehmen. Eine halbe Stunde Warten auf die Ergebnisse der automatisierten Tests um drei Uhr morgens machte die verantwortliche Person f\u00fcr das Release nicht gl\u00fccklich (liebe Gr\u00fc\u00dfe an Alexey Vasyukov!), und am n\u00e4chsten Morgen wurden viele warme Worte in Richtung unseres Systems ausgesprochen. Letztendlich wurde eine Norm von f\u00fcnf Minuten f\u00fcr die Bearbeitung festgelegt.<\/p>\n<p>Zur Beschleunigung der Leistung haben wir zwei Methoden verwendet: Die automatisierten Tests laufen nun in drei parallelen Streams, was aufgrund der Architektur unseres Loyalit\u00e4tssystems sehr praktisch ist. Au\u00dferdem haben wir auf den Ansatz verzichtet, dass der automatisierte Test keine Testdaten f\u00fcr sich selbst erstellt, sondern versucht, etwas Passendes im System zu finden. Nach den \u00c4nderungen wurde die Gesamtdauer auf 3-4 Minuten reduziert.<\/li>\n<li><b>Das Projekt mit den automatisierten Tests muss auf verschiedenen St\u00e4nden einsatzbereit sein.<\/b> Zu Beginn gab es Versuche, eigene Batch-Skripte zu schreiben, aber es wurde klar, dass die selbstgeschriebene automatisierte Installation ein v\u00f6lliger Albtraum war, und wir w\u00e4hlten stattdessen industrielle L\u00f6sungen. Da im Projekt sehr viel direkt Code vorhanden ist (vor allem speichern wir den Code der automatisierten Tests) und nur sehr wenige Daten vorhanden sind (die Hauptdaten sind Metadaten \u00fcber die automatisierten Tests), erwies sich die Implementierung von Liquibase im Projekt als sehr einfach.\n<p>Dies ist eine datenbankunabh\u00e4ngige Open-Source-Bibliothek zum Verfolgen, Verwalten und Anwenden von \u00c4nderungen am Datenbankschema. Sie wird \u00fcber die Kommandozeile oder Frameworks wie Apache Maven verwaltet. Das Prinzip von Liquibase ist ziemlich einfach. Wir haben ein nach bestimmten Kriterien organisiertes Projekt, das aus \u00c4nderungen oder Skripten besteht, die auf den Zielserver angewendet werden m\u00fcssen, sowie Steuerdateien, die definieren, in welcher Reihenfolge und mit welchen Parametern diese \u00c4nderungen installiert werden sollen. <\/p>\n<p>Auf der Ebene der Datenbank wird eine spezielle Tabelle erstellt, in der Liquibase die \u00c4nderungsprotokolle speichert. Jede \u00c4nderung hat einen berechneten Hash, der jedes Mal zwischen dem Projekt und dem Zustand in der Datenbank verglichen wird. Dank Liquibase k\u00f6nnen wir \u00c4nderungen an unserem System problemlos in jede Umgebung \u00fcbernehmen. Die automatisierten Tests werden derzeit in Test- und Release-Umgebungen sowie in Containern (pers\u00f6nliche Entwicklungsumgebungen) gestartet.<\/li>\n<\/ol>\n<p><img decoding=\"async\" alt=\"Unit-Tests in DBMS \u2013 wie wir das im Sportmaster machen, Teil zwei\" src=\"\/wp-content\/uploads\/2019\/09\/4306f6c33543d38f5d8b77f67e22e247.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLassen Sie uns also \u00fcber die Ergebnisse der Anwendung unseres Unit-Test-Systems sprechen. <\/p>\n<ol>\n<li>Zun\u00e4chst einmal sind wir \u00fcberzeugt, dass wir mit der Entwicklung qualitativ hochwertigerer Software begonnen haben. Die automatisierten Tests werden t\u00e4glich durchgef\u00fchrt und finden bei jeder Ver\u00f6ffentlichung Dutzende von Fehlern. Dabei stehen einige dieser Fehler nur indirekt im Zusammenhang mit der Funktionalit\u00e4t, die wir tats\u00e4chlich \u00e4ndern wollten. Es bestehen gro\u00dfe Zweifel, dass diese Fehler durch manuelle Tests entdeckt wurden. <\/li>\n<li>Das Team hat das Vertrauen gewonnen, dass spezifische Funktionen korrekt arbeiten\u2026 Dies betrifft insbesondere unsere kritischen Prozesse. Zum Beispiel hatten wir in den letzten sechs Monaten keine Probleme mit der Verteilung von Rabatten und Boni auf Rechnungen, trotz regelm\u00e4\u00dfiger \u00c4nderungen in jeder Ver\u00f6ffentlichung, w\u00e4hrend wir in fr\u00fcheren Zeitr\u00e4umen mit gewissen Fehlern konfrontiert waren.<\/li>\n<li>Es ist uns gelungen, die Anzahl der Testiterations zu reduzieren. Da die automatisierten Tests f\u00fcr neue Funktionen geschrieben werden, erhalten die Analysten und gleichzeitig Tester Code von h\u00f6herer Qualit\u00e4t, da dieser bereits \u00fcberpr\u00fcft wurde.<\/li>\n<li>Ein Teil der Entwicklungen im Bereich der automatisierten Tests wird von den Entwicklern genutzt. Zum Beispiel werden Testdaten in Containern mithilfe des Moduls zur Objekterzeugung erstellt.<\/li>\n<li>Es ist wichtig zu erw\u00e4hnen, dass sich eine Akzeptanz des automatisierten Testsystems seitens der Entwickler entwickelt hat. Es besteht das Verst\u00e4ndnis, dass dies wichtig und n\u00fctzlich ist. Aus eigener Erfahrung kann ich jedoch sagen, dass dies bei weitem nicht so ist. Automatisierte Tests m\u00fcssen geschrieben, gewartet und weiterentwickelt werden; die Ergebnisse m\u00fcssen analysiert werden, und oft sind diese zeitlichen Aufw\u00e4nde einfach nicht gerechtfertigt. Es ist viel einfacher, in der Produktion nach Problemen zu suchen. Bei uns stellen sich jedoch die Entwickler in eine Schlange und bitten darum, ihre Funktionalit\u00e4t durch automatisierte Tests abdecken zu lassen.<\/li>\n<\/ol>\n<h2>Was kommt als n\u00e4chstes<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Unit-Tests in DBMS \u2013 wie wir das im Sportmaster machen, Teil zwei\" src=\"\/wp-content\/uploads\/2019\/09\/a11596618e97c0afaa9f5f25b613575e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLassen Sie uns \u00fcber die Pl\u00e4ne zur Weiterentwicklung des Projekts zur automatisierten Testung sprechen.<\/p>\n<p>Nat\u00fcrlich kann das Testautomatisierungssystem von Sportmaster, solange es lebt und sich weiterentwickelt, nahezu endlos weiterentwickelt werden. Daher ist die Hauptentwicklungsrichtung die Erweiterung des Testabdeckungsbereichs.<\/p>\n<p>Mit zunehmender Anzahl an Testautomatisierungen wird die Gesamtzeit f\u00fcr deren Ausf\u00fchrung konstant steigen, und wir werden erneut auf das Thema Performance zur\u00fcckkommen m\u00fcssen. Wahrscheinlich wird die L\u00f6sung in der Erh\u00f6hung der Anzahl paralleler Threads liegen.<\/p>\n<p>Aber das sind offensichtliche Entwicklungsm\u00f6glichkeiten. Wenn wir \u00fcber etwas weniger Triviales sprechen, heben wir Folgendes hervor:<\/p>\n<ol>\n<li>Zurzeit erfolgt das Management der Testautomatisierungen auf der Ebene der Datenbankverwaltungssysteme, d.h. es sind PL\/SQL-Kenntnisse erforderlich, um erfolgreich zu arbeiten. Bei Bedarf kann das Systemmanagement (z.B. das Ausf\u00fchren von Tests oder das Erstellen von Metadaten) in ein Administrations-Tool ausgelagert werden, indem man Jenkins oder etwas \u00c4hnliches verwendet.<\/li>\n<li>Alle lieben quantitative und qualitative Kennzahlen. F\u00fcr automatisierte Tests ist eine solche universelle Kennzahl die Code Coverage oder die Metrik der Codeabdeckung. Mithilfe dieser Kennzahl k\u00f6nnen wir bestimmen, welcher Prozentsatz des Codes unseres zu testenden Systems durch Testautomatisierungen abgedeckt wird. Seit Version 12.2 bietet Oracle M\u00f6glichkeiten zur Berechnung dieser Metrik an und empfiehlt die Verwendung des Standardpakets DBMS_PLSQL_CODE_COVERAGE.\n<p>Unseres Testautomatisierungssystems ist etwas mehr als ein Jahr alt und vielleicht ist jetzt der beste Zeitpunkt f\u00fcr eine Einsch\u00e4tzung der Abdeckung. In meinem vorherigen Projekt (wobei es sich nicht um Sportmaster handelt) war das ebenfalls der Fall. Ein Jahr nach dem Beginn der Arbeit an den Testautomatisierungen gab die Gesch\u00e4ftsf\u00fchrung den Auftrag, den Prozentsatz des abgedeckten Codes zu bewerten. Bei \u00fcber 1% Abdeckung w\u00e4re die Gesch\u00e4ftsf\u00fchrung zufrieden gewesen. Wir Entwickler erwarteten jedoch ein Ergebnis von etwa 10%. Wir haben die Code Coverage integriert, gemessen und kamen auf 20%. In unserer Freude sind wir zur Pr\u00e4mie gegangen, aber wie wir das gemacht haben und wohin wir danach gegangen sind, ist eine ganz andere Geschichte.<\/li>\n<li>Testautomatisierungen k\u00f6nnen die bereitgestellten Webdienste \u00fcberpr\u00fcfen. Oracle erlaubt dies durchaus, und wir werden nicht mehr mit einer Reihe von Problemen konfrontiert. <\/li>\n<li>Und nat\u00fcrlich kann unser automatisiertes Testsystem auch in einem anderen Projekt angewendet werden. Die L\u00f6sung, die wir gefunden haben, ist universell und erfordert lediglich die Nutzung von Oracle. Ich habe geh\u00f6rt, dass es in anderen Projekten von Sportmaster Interesse an automatisiertem Testen gibt und m\u00f6glicherweise werden wir dorthin gehen.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Das DBMS Tarantool ist ein attraktives, zukunftstr\u00e4chtiges Produkt zur Erstellung von hochbelasteten Anwendungen.<\/h2>\n<p>\nLassen Sie uns zusammenfassen. In dem Projekt zur Kundenbindung bei Sportmaster ist es uns gelungen, ein automatisiertes Testsystem zu implementieren. Die Basis daf\u00fcr bildet die utPLSQL-L\u00f6sung von Steven Feuerstein. Rund um utPLSQL sind der Code der automatisierten Tests und die unterst\u00fctzenden selbstgeschriebenen Module angeordnet: das Startmodul, das Modul zur Datengenerierung und andere. Die automatisierten Tests werden t\u00e4glich ausgef\u00fchrt und, was am wichtigsten ist, sie funktionieren und bringen Nutzen. Wir sind \u00fcberzeugt, dass wir begonnen haben, Software von h\u00f6herer Qualit\u00e4t zu ver\u00f6ffentlichen. Dabei ist die erhaltene L\u00f6sung universell und kann problemlos in jedem Projekt verwendet werden, in dem automatisiertes Testen auf Oracle-Datenbanken ben\u00f6tigt wird.<\/p>\n<p><i>P.S. Dieser Artikel ist nicht sehr konkret geworden: Es gibt viel Text und praktisch keine technischen Beispiele. Wenn das Thema global interessant ist, sind wir bereit, es fortzusetzen und mit weiteren Informationen zur\u00fcckzukehren, in denen wir erl\u00e4utern, was sich in den letzten sechs Monaten ge\u00e4ndert hat und Beispiele f\u00fcr Code bringen.<\/p>\n<p>Schreiben Sie Kommentare, wenn es Punkte gibt, die in Zukunft hervorgehoben werden sollten, oder Fragen, die beantwortet werden m\u00fcssen.<\/i><\/p>\n<p class=\"for_users_only_msg\">Nur registrierte Benutzer k\u00f6nnen an der Umfrage teilnehmen. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Bitte einloggen<\/a><\/noindex>.<\/p>\n<h2 class=\"default-block__polling-title\">Schreiben wir weiter dar\u00fcber?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Ja, nat\u00fcrlich<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Nein, danke<\/p>\n<\/li>\n<\/ul>\n<p>    12 Benutzer haben abgestimmt. 4 Benutzer haben sich enthalten.<br \/>\n<br \/>Quelle: <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.1.1 - 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\/de\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-vtoraya\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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\/de\/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 in Datenbanken \u2014 wie wir das bei Sportmaster machen, Teil zwei | ProHoster","description":"Der erste Teil \u2014 hier.","canonical_url":"https:\/\/prohoster.info\/de\/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":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/37666","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=37666"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/37666\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/28269"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=37666"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=37666"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=37666"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}