{"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 Datenbanksystemen \u2013 so machen wir das bei Sportmaster, 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 Datenbanksystemen \u2013 so machen wir das bei Sportmaster, Teil zwei.\" src=\"\/wp-content\/uploads\/2019\/09\/b9fb8c934885abdf3ef928bfd75bdc2a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Stellen Sie sich eine Situation vor. Sie stehen vor der Aufgabe, eine neue Funktionalit\u00e4t zu entwickeln. Sie haben die Arbeiten Ihrer Vorg\u00e4nger vorliegen. Angenommen, Sie haben keine moralischen Verpflichtungen, wie w\u00fcrden Sie handeln?<\/p>\n<p>In den meisten F\u00e4llen geraten alle alten Arbeiten in Vergessenheit und alles beginnt von vorne. Niemand mag es, sich in fremden Codes zurechtzufinden, und wenn Sie Zeit haben, warum nicht ein eigenes System entwickeln? Dies ist ein typischer Ansatz und er ist in vielerlei Hinsicht richtig. Doch in unserem Projekt haben wir es anders gemacht. Wir haben die Erfahrungen aus den Unit-Tests mit utPLSQL unserer Vorg\u00e4nger als Grundlage f\u00fcr das zuk\u00fcnftige automatisierte Testssystem verwendet und sind dann in mehreren parallelen Richtungen weitergearbeitet.<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 bestehenden 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 wir mit automatisierten Tests abdecken. <\/b>Wir m\u00fcssen entweder diese Informationen im Hinterkopf behalten oder Schlussfolgerungen auf der Grundlage des Codes der automatisierten Tests ziehen. Daher haben wir entschieden, ein Verzeichnis zu erstellen. Jedem automatisierten Test haben wir einen eindeutigen Mnemonik-Code zugewiesen, eine Beschreibung erstellt und die Einstellungen dokumentiert (z. B. unter welchen Bedingungen er ausgef\u00fchrt werden sollte oder was geschehen sollte, wenn der Test fehlgeschlagen ist). Im Grunde haben wir die Metadaten der automatisierten Tests ausgef\u00fcllt und diese Metadaten in die Standardtabellen des utPLSQL-Schemas eingef\u00fcgt.<\/li>\n<li><b>Definition der Expansionsstrategie, d.h. Auswahl der Funktionalit\u00e4ten, die von automatisierten Tests \u00fcberpr\u00fcft werden sollen.<\/b> Wir haben uns entschieden, auf drei Aspekte zu achten: neue Systemanpassungen, Vorf\u00e4lle aus der Produktion und wichtige Prozesse des Systems. Auf diese Weise entwickeln wir uns parallel zum Release weiter, gew\u00e4hrleisten eine h\u00f6here Qualit\u00e4t und erweitern gleichzeitig den Umfang des Regressionstests, um die Zuverl\u00e4ssigkeit des Systems an kritischen Stellen sicherzustellen. Der erste Engpass war der Prozess der Verteilung von Rabatten und Boni im Warenkorb.<\/li>\n<li><b>Selbstverst\u00e4ndlich haben wir uns der Entwicklung neuer automatisierter Tests gewidmet. <\/b>Eine der ersten Release-Aufgaben bestand darin, die Leistung vordefinierter Auswahlproben des Loyalit\u00e4tssystems zu bewerten. In unserem Projekt gibt es einen Block festgelegter SQL-Anfragen, die Kunden anhand bestimmter Kriterien filtern. Beispielsweise k\u00f6nnen wir eine Liste aller Kunden abrufen, deren letzter Einkauf in einer bestimmten Stadt stattgefunden hat, oder eine Liste von Kunden, deren durchschnittlicher Einkaufswert \u00fcber einem bestimmten Betrag liegt. Mit den entwickelten automatisierten Tests haben wir die vordefinierten Auswahlproben \u00fcberpr\u00fcft, die Referenzparameter der Leistung festgelegt und zus\u00e4tzlich Lasttests durchgef\u00fchrt.<\/li>\n<li><b>Die Arbeit mit automatisierten Tests sollte benutzerfreundlich sein.<\/b>Am h\u00e4ufigsten werden zwei Aktionen durchgef\u00fchrt: das Starten der automatisierten Tests und das Erstellen von Testdaten. Daher haben wir in unserem System zwei unterst\u00fctzende Module implementiert: das Modulanlaufmodul und das Datengenerierungsmodul.\n<p>Das Startmodul wird als eine universelle Prozedur mit einem Eingabetextparameter bereitgestellt. Als Parameter k\u00f6nnen der Mnemonik-Code des Autotests, der Name des Pakets, der Name des Tests, die Konfiguration des Autotests oder ein reserviertes Schl\u00fcsselwort \u00fcbergeben werden. Die Prozedur w\u00e4hlt alle Autotests aus, die die Bedingungen erf\u00fcllen, und startet sie.<\/p>\n<p>Das Datengenerierungsmodul wird in Form eines Pakets bereitgestellt, in dem f\u00fcr jedes Objekt des zu testenden Systems (Datenbanktabelle) 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 mit einem Fingertipp erm\u00f6glicht. Zu diesem Zweck wurden Vorlagen f\u00fcr die zu erstellenden Daten erstellt. Beispielsweise kann ein Kunde bestimmten Alters mit einer Testtelefonnummer und einem abgeschlossenen Kauf erstellt werden.<\/li>\n<li><b>Autotests 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 dem ein Bericht \u00fcber die Ergebnisse erstellt und an das gesamte Entwicklungsteam \u00fcber die Unternehmens-E-Mail versendet wird. Nach der Wiederherstellung der alten automatisierten Tests und der Erstellung neuer Tests betrug die Gesamtdauer 30 Minuten. Diese Leistungsf\u00e4higkeit fand allgemeine Zustimmung, da der Start au\u00dferhalb der Arbeitszeiten stattfand.\n<p>F\u00fcr die Optimierung der Geschwindigkeit war jedoch Arbeit erforderlich. Die Aktualisierung des Loyalit\u00e4tsprogramms im Produktionssystem erfolgt nachts. Im Rahmen eines der Releases mussten nachts dringende \u00c4nderungen vorgenommen werden. Das halbst\u00fcndige Warten auf die Ergebnisse der automatisierten Tests um drei Uhr morgens machte den Verantwortlichen f\u00fcr das Release nicht gl\u00fccklich (herzliche Gr\u00fc\u00dfe an Alexey Vasyukov!), und am n\u00e4chsten Morgen fielen viele wohlwollende Worte in Richtung unseres Systems. Letztendlich wurde ein Zeitrahmen von 5 Minuten f\u00fcr die Arbeit festgelegt.<\/p>\n<p>Um die Leistung zu steigern, haben wir zwei Methoden angewendet: Die automatisierten Tests werden nun in drei parallelen Str\u00f6men ausgef\u00fchrt, was aufgrund der Architektur unseres Loyalit\u00e4tsystems sehr praktisch ist. Au\u00dferdem haben wir uns von der Methode distanziert, bei der der automatisierte Test keine eigenen Testdaten erstellt, sondern versucht, geeignete Daten im System zu finden. Nach den \u00c4nderungen hat sich die Gesamtlaufzeit auf 3-4 Minuten reduziert.<\/li>\n<li><b>Das Projekt mit den automatisierten Tests muss auf verschiedenen St\u00e4nden einsatzbereit sein.<\/b> Anfangs haben wir versucht, eigene Batchdateien zu erstellen, aber es wurde schnell klar, dass eine ma\u00dfgeschneiderte automatisierte Installation ein Albtraum ist. Deshalb haben wir uns nach industriellen L\u00f6sungen umgesehen. Da in diesem Projekt sehr viel Code vorhanden ist (insbesondere speichern wir den Code der automatisierten Tests) und nur sehr wenig Daten (die Hauptdaten sind Metadaten zu den automatisierten Tests) vorhanden sind, gestaltete sich die Integration von Liquibase in das Projekt als sehr einfach.\n<p>Dies ist eine datenbankunabh\u00e4ngige, Open-Source-Bibliothek zur Verfolgung, Verwaltung und Anwendung von Datenbankschema\u00e4nderungen. Sie wird \u00fcber die Kommandozeile oder Frameworks wie Apache Maven gesteuert. Das Prinzip von Liquibase ist recht einfach. Wir haben ein strukturiertes Projekt, das aus \u00c4nderungen oder Skripten besteht, die auf den Zielserver angewendet werden m\u00fcssen, sowie Steuerdateien, die festlegen, 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 ein \u00c4nderungsprotokoll 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 unsere System\u00e4nderungen problemlos auf jede Umgebung anwenden. Automatisierte Tests werden jetzt in Test- und Produktionsumgebungen sowie in Containern (pers\u00f6nlichen Umgebungen der Entwickler) durchgef\u00fchrt.<\/li>\n<\/ol>\n<p><img decoding=\"async\" alt=\"Unit-Tests in Datenbanksystemen \u2013 so machen wir das bei Sportmaster, 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-Testsystems sprechen. <\/p>\n<ol>\n<li>Nat\u00fcrlich sind wir in erster Linie \u00fcberzeugt, dass wir begonnen haben, qualitativ hochwertigere Software zu entwickeln. Automatisierte Tests werden t\u00e4glich durchgef\u00fchrt und finden bei jeder Ver\u00f6ffentlichung Dutzende von Fehlern. Einige dieser Fehler stehen lediglich indirekt in Verbindung mit den Funktionen, die wir tats\u00e4chlich \u00e4ndern wollten. Es bestehen gro\u00dfe Zweifel, dass diese Fehler durch manuelles Testen gefunden wurden. <\/li>\n<li>Das Team hat das Vertrauen gewonnen, dass bestimmte Funktionen korrekt arbeiten... Dies betrifft vor allem unsere kritischen Prozesse. Zum Beispiel hatten wir in den letzten sechs Monaten keine Probleme mit der Verteilung von Rabatten und Boni im Checkout, trotz regelm\u00e4\u00dfiger \u00c4nderungen, w\u00e4hrend in fr\u00fcheren Perioden immer wieder Fehler auftraten.<\/li>\n<li>Wir konnten die Anzahl der Testiterationen reduzieren. Da automatisierte Tests f\u00fcr neue Funktionen geschrieben werden, erh\u00e4lt unser Analyse- und Testteam Code von h\u00f6herer Qualit\u00e4t, da dieser bereits gepr\u00fcft wurde.<\/li>\n<li>Ein Teil der Ergebnisse der automatisierten Tests wird von den Entwicklern genutzt. Zum Beispiel werden Testdaten in Containern mithilfe eines Moduls zur Objekterstellung erstellt.<\/li>\n<li>Es ist wichtig, dass wir eine \"Akzeptanz\" des automatisierten Testsystems seitens der Entwickler erreicht haben. Es besteht ein Verst\u00e4ndnis daf\u00fcr, dass dies wichtig und n\u00fctzlich ist. Aber aus eigener Erfahrung kann ich sagen, dass dem nicht immer so ist. Automatisierte Tests m\u00fcssen geschrieben, unterst\u00fctzt und weiterentwickelt sowie die Ergebnisse analysiert werden. Oftmals rechtfertigen diese zeitlichen Aufwendungen einfach nicht den Aufwand. Es ist viel einfacher, in die Produktion zu gehen und dort die Probleme zu kl\u00e4ren. Bei uns stehen die Entwickler Schlange und bitten darum, ihre Funktionalit\u00e4ten durch automatisierte Tests abzudecken.<\/li>\n<\/ol>\n<h2>Was kommt als N\u00e4chstes<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Unit-Tests in Datenbanksystemen \u2013 so machen wir das bei Sportmaster, Teil zwei.\" src=\"\/wp-content\/uploads\/2019\/09\/a11596618e97c0afaa9f5f25b613575e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLassen Sie uns \u00fcber die Entwicklungspl\u00e4ne f\u00fcr das Projekt zur automatisierten Testung sprechen.<\/p>\n<p>Solange das Loyalit\u00e4tsprogramm von Sportmaster besteht und sich weiterentwickelt, k\u00f6nnen auch die automatisierten Tests praktisch endlos weiterentwickelt werden. Daher besteht die Hauptentwicklungsausrichtung darin, den Abdeckungsbereich zu erweitern.<\/p>\n<p>Mit der steigenden Anzahl an automatisierten Tests wird die Gesamtzeit f\u00fcr ihre Ausf\u00fchrung stetig zunehmen, und wir m\u00fcssen erneut die Frage der Leistungsf\u00e4higkeit aufgreifen. Wahrscheinlich wird die L\u00f6sung in der Erh\u00f6hung der Anzahl der parallelen Threads liegen.<\/p>\n<p>Es gibt jedoch offensichtliche Entwicklungsm\u00f6glichkeiten. Wenn wir \u00fcber etwas weniger Triviales sprechen, heben wir Folgendes hervor:<\/p>\n<ol>\n<li>Aktuell erfolgt die Verwaltung von automatisierten Tests auf der Ebene der Datenbankmanagementsysteme, d.h. es sind Kenntnisse in PL\/SQL erforderlich, um erfolgreich zu arbeiten. Bei Bedarf kann die Systemverwaltung (zum Beispiel das Ausf\u00fchren von Jobs oder das Erstellen von Metadaten) in ein Admin-Tool ausgelagert werden, wie zum Beispiel Jenkins oder etwas \u00c4hnliches.<\/li>\n<li>Alle sch\u00e4tzen quantitative und qualitative Kennzahlen. F\u00fcr automatisiertes Testen ist diese universelle Kennzahl die Code Coverage oder die Metrik der Codeabdeckung. Mit dieser Kennzahl k\u00f6nnen wir bestimmen, welcher Prozentsatz des Codes unseres getesteten Systems durch automatisierte Tests 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>Unser automatisiertes Testsystem ist etwas \u00fcber ein Jahr alt, und vielleicht ist jetzt der ideale Zeitpunkt, um die Abdeckung zu bewerten. In meinem vorherigen Projekt (nicht bei Sportmaster) war es \u00e4hnlich. Ein Jahr nach der Einf\u00fchrung der automatisierten Tests hat das Management die Aufgabe gestellt zu beurteilen, wie viel Prozent des Codes wir abdecken. Bei \u00fcber 1 % Abdeckung w\u00e4re das Management erfreut gewesen. Wir, die Entwickler, erwarteten ein Ergebnis von etwa 10 %. Nachdem wir die Codeabdeckung eingerichtet und gemessen hatten, erhielten wir 20 %. \u00dcbergl\u00fccklich gingen wir zur Pr\u00e4mie, aber wo wir hingegangen sind und was dann geschah, ist eine ganz andere Geschichte.<\/li>\n<li>Automatisierte Tests k\u00f6nnen die bereitgestellten Webdienste \u00fcberpr\u00fcfen. Oracle erm\u00f6glicht dies durchaus, und wir werden viele Probleme nicht mehr antreffen. <\/li>\n<li>Und nat\u00fcrlich kann unser automatisiertes Testsystem auch in einem anderen Projekt angewendet werden. Die L\u00f6sung, die wir entwickelt haben, ist universell und ben\u00f6tigt lediglich die Nutzung von Oracle. Ich habe geh\u00f6rt, dass es in anderen Projekten von Sportmaster Interesse an automatisierten Tests gibt, und m\u00f6glicherweise werden wir uns dorthin begeben.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Fazit<\/h2>\n<p>\nLassen Sie uns zusammenfassen. Bei dem Loyalty-Programm des Sportmasters haben wir ein automatisiertes Testsystem implementiert. Die Basis daf\u00fcr bildet die L\u00f6sung utPLSQL von Steven Feuerstein. Rund um utPLSQL befinden sich der Code der automatisierten Tests sowie unterst\u00fctzende selbstgeschriebene Module: ein Startmodul, ein Daten Generierungsmodul und weitere. Die automatisierten Tests laufen t\u00e4glich und, was am wichtigsten ist, sie funktionieren und bringen Nutzen. Wir sind \u00fcberzeugt, dass wir begonnen haben, Software von h\u00f6herer Qualit\u00e4t auszuliefern. Dabei ist die entwickelte L\u00f6sung universell und kann problemlos in jedem Projekt eingesetzt werden, in dem automatisiertes Testen auf Oracle-Datenbanken erforderlich ist.<\/p>\n<p><i>P.S. Dieser Artikel ist nicht sehr konkret ausgefallen: Er enth\u00e4lt viel Text und fast keine technischen Beispiele. Wenn das Thema grunds\u00e4tzlich von Interesse ist, sind wir bereit, es fortzusetzen und mit weiteren Informationen zur\u00fcckzukehren, in denen wir erl\u00e4utern, was sich in den vergangenen sechs Monaten ver\u00e4ndert hat, und Beispiele f\u00fcr den Code anf\u00fchren.<\/p>\n<p>Bitte hinterlassen Sie Kommentare, wenn es Punkte gibt, auf die wir in Zukunft besonders eingehen sollten, oder Fragen, die erkl\u00e4rt 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 melden Sie sich an.<\/a><\/noindex>Sind Sie an Contour interessiert?<\/p>\n<h2 class=\"default-block__polling-title\">Sollten wir weiter dar\u00fcber schreiben?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Ja, gerne.<\/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 Nutzer haben abgestimmt. 4 Nutzer 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 4.9.10 - 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. \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\" \/>\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) 4.9.10\" \/>\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. \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\" \/>\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 der Datenbank \u2013 wie wir das im Sportmeister machen, Teil zwei | ProHoster","description":"Der erste Teil ist hier. Stellen Sie sich die Situation vor. Sie stehen vor der Aufgabe, eine neue Funktionalit\u00e4t zu entwickeln. Sie haben Vorarbeiten von Ihren Vorg\u00e4ngern. Angenommen, Sie haben keine moralischen Verpflichtungen, wie w\u00fcrden Sie vorgehen? H\u00e4ufig geraten alle alten Arbeiten in Vergessenheit und alles beginnt von Neuem. Niemand gr\u00e4bt gerne in fremdem Code, und wenn vorhanden,","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. \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","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"},"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}]}}