{"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\/de\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-pervaya","title":{"rendered":"Unit-Tests in Datenbanksystemen \u2014 wie wir es bei Sportmaster machen, Teil eins","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hallo, Habra!<\/p>\n<p>Mein Name ist Maxim Ponomarenko und ich bin Entwickler bei Sportmaster. Ich habe 10 Jahre Erfahrung im IT-Bereich. Ich begann meine Karriere im Bereich der manuellen Tests und wechselte dann zur Datenbankentwicklung. In den letzten 4 Jahren, in denen ich Wissen aus dem Testen und der Entwicklung gesammelt habe, besch\u00e4ftige ich mich mit der Automatisierung von Tests auf Ebene des DBMS.<\/p>\n<p>Ich bin seit etwas mehr als einem Jahr im Team von Sportmaster und arbeite an einem gr\u00f6\u00dferen Projekt, in dem ich die Entwicklung automatisierter Tests leite. Im April haben wir mit den Jungs von Sportmaster Lab auf einer Konferenz in Krasnodar gesprochen, mein Vortrag hatte den Titel \u201eUnit-Tests im DBMS\u201c, und jetzt m\u00f6chte ich ihn mit Ihnen teilen. Es wird viel Text geben, daher habe ich beschlossen, den Vortrag in zwei Posts aufzuteilen. Im ersten werden wir \u00fcber Automatisierungstests und Testing im Allgemeinen sprechen, und im zweiten werde ich n\u00e4her auf unser System der Unit-Tests und die Ergebnisse seiner Anwendung eingehen.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/464335\/\"><img decoding=\"async\" alt=\"Unit-Tests in Datenbanksystemen \u2014 wie wir es bei Sportmaster machen, Teil eins\" src=\"\/wp-content\/uploads\/2019\/08\/4e521cc85eb3a3806860a40ab2e4050f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Zun\u00e4chst ein wenig trockene Theorie. Was ist automatisiertes Testen? Das ist Testen, das mit Software-Tools durchgef\u00fchrt wird, und in der modernen IT wird es immer h\u00e4ufiger bei der Softwareentwicklung eingesetzt. Das h\u00e4ngt damit zusammen, dass Unternehmen wachsen, ihre Informationssysteme wachsen und dementsprechend auch die Anzahl der Funktionen, die getestet werden m\u00fcssen, zunimmt. Es wird immer schwieriger, manuelle Tests durchzuf\u00fchren.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nIch habe in einem gro\u00dfen Unternehmen gearbeitet, dessen Releases alle zwei Monate erscheinen. Dabei wurde ein ganzer Monat daf\u00fcr aufgewendet, dass ein Dutzend Tester den Funktionsumfang manuell \u00fcberpr\u00fcften. Durch die Implementierung von Automatisierung mit einem kleinen Team von Entwicklern konnten wir die Testzeit in anderthalb Jahren auf 2 Wochen verk\u00fcrzen. Wir haben nicht nur die Geschwindigkeit des Testens erh\u00f6ht, sondern auch dessen Qualit\u00e4t verbessert. Automatisierte Tests werden regelm\u00e4\u00dfig ausgef\u00fchrt und f\u00fchren stets alle in ihnen festgelegten Pr\u00fcfungen durch, das hei\u00dft, wir schlie\u00dfen den menschlichen Faktor aus. <\/p>\n<p>F\u00fcr die moderne IT ist charakteristisch, dass von einem Entwickler nicht nur erwartet wird, Produktcode zu schreiben, sondern auch Unit-Tests, die diesen Code \u00fcberpr\u00fcfen. <\/p>\n<p>Was ist jedoch zu tun, wenn Ihr System haupts\u00e4chlich auf Serverlogik basiert? Es gibt keine universelle L\u00f6sung oder Best Practices auf dem Markt. In der Regel l\u00f6sen Unternehmen dieses Problem, indem sie ihr eigenes ma\u00dfgeschneidertes Testsystem erstellen. Ein solches ma\u00dfgeschneidertes automatisiertes Testsystem wurde in unserem Projekt entwickelt, und dar\u00fcber werde ich in meinem Vortrag berichten. <\/p>\n<p><img decoding=\"async\" alt=\"Unit-Tests in Datenbanksystemen \u2014 wie wir es bei Sportmaster machen, Teil eins\" src=\"\/wp-content\/uploads\/2019\/08\/fee34f7214fb2075ee50fa0f4af14a44.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Wir testen die Loyalit\u00e4t<\/h2>\n<p>\nZun\u00e4chst sprechen wir \u00fcber das Projekt, in dem wir das automatisierte Testsystem implementiert haben. Unser Projekt ist das Loyalit\u00e4tssystem von Sportmaster (\u00fcbrigens haben wir bereits dar\u00fcber geschrieben in <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sportmaster_lab\/blog\/453252\/\">diesem Beitrag<\/a><\/noindex>).<\/p>\n<p>Wenn Ihr Unternehmen gro\u00df genug ist, wird Ihr Loyalit\u00e4tssystem drei Standardmerkmale aufweisen: <\/p>\n<ul>\n<li>Ihr System wird hochgradig belastet sein<\/li>\n<li>Ihr System wird komplexe Berechnungsprozesse enthalten<\/li>\n<li>Ihr System wird aktiv weiterentwickelt werden. <\/li>\n<\/ul>\n<p>\nFangen wir der Reihe nach an\u2026 Insgesamt, wenn man alle Marken von Sportmaster betrachtet, haben wir in Russland, der Ukraine, China, Kasachstan und Wei\u00dfrussland \u00fcber 1000 Gesch\u00e4fte. In diesen Gesch\u00e4ften werden t\u00e4glich etwa 300.000 K\u00e4ufe get\u00e4tigt. Das bedeutet, jede Sekunde gelangen 3-4 Quittungen in unser System. Nat\u00fcrlich ist unser Loyalit\u00e4tssystem hochgradig belastet. Und da es aktiv genutzt wird, m\u00fcssen wir die h\u00f6chsten Qualit\u00e4tsstandards sicherstellen, denn jeder Fehler in der Software f\u00fchrt zu erheblichen finanziellen, reputativen und anderen Verlusten. <\/p>\n<p>Gleichzeitig sind bei Sportmaster mehr als hundert verschiedene Aktionen aktiv. Die Aktionen sind sehr unterschiedlich: es gibt Produktaktionen, solche, die an bestimmten Wochentagen stattfinden, spezifisch an Gesch\u00e4fte gebundene Aktionen, sowie Aktionen, die an den Bestellbetrag oder die Anzahl der Produkte gekoppelt sind. Insgesamt ist das ziemlich komplex. Kunden haben Boni und Promocodes, die sie beim Einkaufen verwenden. All dies f\u00fchrt dazu, dass die Abrechnung jeder Bestellung eine recht anspruchsvolle Aufgabe ist. <\/p>\n<p>Der Algorithmus, der die Auftragsbearbeitung implementiert, ist wirklich schrecklich und kompliziert. Jede \u00c4nderung an diesem Algorithmus ist eine recht riskante Angelegenheit. Es stellte sich heraus, dass selbst die \u00e4u\u00dferlich unbedeutendsten \u00c4nderungen zu ziemlich unvorhersehbaren Ergebnissen f\u00fchren k\u00f6nnen. Gerade solche komplexen Berechnungsprozesse, die zudem kritische Funktionen implementieren, sind die besten Kandidaten f\u00fcr die Automatisierung. Die manuelle \u00dcberpr\u00fcfung dutzender identischer F\u00e4lle ist zeitaufwendig. Da der Einstiegspunkt in den Prozess unver\u00e4ndert bleibt, kann man, einmal beschrieben, recht schnell automatische Tests generieren und sich auf die Funktionalit\u00e4t verlassen.<\/p>\n<p>Da unser System aktiv genutzt wird, wird das Gesch\u00e4ft von Ihnen etwas Neues verlangen, um mit der Zeit Schritt zu halten und kundenorientiert zu sein. In unserem Treueprogramm erscheinen alle zwei Monate Releases. Das bedeutet, dass wir alle zwei Monate einen vollst\u00e4ndigen Regressionstest des gesamten Systems durchf\u00fchren m\u00fcssen. Zumal, wie in jeder modernen IT, die Entwicklung nicht sofort vom Entwickler in die Produktion gelangt. Sie entsteht zun\u00e4chst in der Entwicklungsumgebung, durchl\u00e4uft dann nacheinander die Testumgebung, die Release-Umgebung, die Abnahme und gelangt erst dann in die Produktion. Mindestens in der Test- und Release-Umgebung m\u00fcssen wir einen vollst\u00e4ndigen Regressionstest des gesamten Systems durchf\u00fchren. <\/p>\n<p>Die beschriebenen Eigenschaften sind standardm\u00e4\u00dfig f\u00fcr nahezu jedes Treueprogramm. Lassen Sie uns \u00fcber die Besonderheiten unseres Projekts sprechen.<\/p>\n<p>Technologisch liegt die Logik unseres Treueprogramms zu 90% auf Serverseite und ist in Oracle implementiert. Es gibt einen Client auf Delphi, der die Funktion des Administrator-Arbeitsplatzes ausf\u00fchrt. Es gibt auch Webdienste f\u00fcr externe Anwendungen (zum Beispiel die Website). Daher ist es durchaus logisch, dass wir, wenn wir ein automatisiertes Testsystem aufbauen, dies in Oracle tun werden.<\/p>\n<p>Das Loyalit\u00e4tssystem bei Sportmaster existiert seit \u00fcber 7 Jahren und wurde von einzelnen Entwicklern erstellt\u2026 Im Durchschnitt waren w\u00e4hrend dieser 7 Jahre 3-4 Entwickler an unserem Projekt beteiligt. Aber im letzten Jahr hat sich unser Team erheblich vergr\u00f6\u00dfert, und jetzt arbeiten 10 Personen an dem Projekt. Das bedeutet, dass neue Leute hinzukommen, die mit typischen Aufgaben, Prozessen und der Architektur nicht vertraut sind. Und es besteht ein erh\u00f6htes Risiko, dass wir Fehler \u00fcbersehen werden.<\/p>\n<p>Das Projekt zeichnet sich durch das Fehlen von dedizierten Testern als feste Mitarbeiter aus. Tests finden zwar statt, aber diese werden von Analysten durchgef\u00fchrt, zus\u00e4tzlich zu ihren anderen Hauptaufgaben: dem Kontakt mit den Gesch\u00e4ftskunden, den Nutzern, der Ausarbeitung von Systemanforderungen usw. Trotz der Tatsache, dass die Tests sehr qualitativ durchgef\u00fchrt werden (das sollte besonders erw\u00e4hnt werden, da m\u00f6glicherweise einige Analysten diesen Bericht lesen), bleibt die Effizienz der Spezialisierung und Konzentration auf ein einziges Thema unbestreitbar.<\/p>\n<p>Angesichts des Vorangegangenen erscheint die Idee der Automatisierung von Tests im Projekt als sehr logisch, um die Qualit\u00e4t des gelieferten Produkts zu erh\u00f6hen und die Entwicklungszeiten zu verk\u00fcrzen. In verschiedenen Phasen der Existenz des Loyalit\u00e4tssystems haben einzelne Entwickler versucht, ihren Code mit Unit-Tests abzudecken. Dies war insgesamt ein recht zersplitterter Prozess, bei dem jeder seine eigene Architektur und Methoden verwendete. Gemeinsam f\u00fcr die Unit-Tests waren die Endergebnisse: Die Tests wurden entwickelt, eine Zeit lang genutzt, in ein Versionsspeicher abgelegt, aber irgendwann h\u00f6rten sie auf, ausgef\u00fchrt zu werden, und wurden vergessen. Dies geschah in erster Linie, weil die Tests mehr an einen bestimmten Entwickler als an das Projekt gebunden waren.<\/p>\n<h2>Hier kommt utPLSQL ins Spiel<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Unit-Tests in Datenbanksystemen \u2014 wie wir es bei Sportmaster machen, Teil eins\" src=\"\/wp-content\/uploads\/2019\/08\/f21dfcb085aace687566dc51cb9b5613.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWissen Sie etwas \u00fcber Steven Feuerstein? <\/p>\n<p>Dies ist ein kluger Kerl, der einen gro\u00dfen Teil seiner Karriere der Arbeit mit Oracle und PL\/SQL gewidmet hat und zu diesem Thema eine betr\u00e4chtliche Anzahl von Arbeiten verfasst hat. Ein bekanntes Buch von ihm hei\u00dft: \u201eOracle PL\/SQL. F\u00fcr Profis\u201c. Steven ist der Entwickler der L\u00f6sung utPLSQL, was ausgeschrieben das Unit Testing Framework f\u00fcr Oracle PL\/SQL bedeutet. Die L\u00f6sung utPLSQL wurde 2016 entwickelt, wird jedoch weiterhin aktiv bearbeitet und neue Versionen werden herausgebracht. Zum Zeitpunkt des Vortrags war die letzte Version vom 24. M\u00e4rz 2019.<br \/>\nWas ist das eigentlich? Es handelt sich um ein separates Open-Source-Projekt. Es hat ein paar Megabyte, einschlie\u00dflich Beispiele und Dokumentation. Physisch stellt es ein separates Schema in der ORACLE-Datenbank dar, mit einem Satz von Paketen und Tabellen zur Organisation von Unit-Tests. Die Installation dauert nur wenige Sekunden. Ein herausragendes Merkmal von utPLSQL ist die Benutzerfreundlichkeit. <br \/>\nIm Gro\u00dfen und Ganzen stellt utPLSQL einen Mechanismus zum Ausf\u00fchren von Unit-Tests dar, wobei unter einem Unit-Test normale Oracle-Paketprozeduren verstanden werden, deren Organisation bestimmten Regeln entspricht. Neben der Ausf\u00fchrung speichert utPLSQL ein Protokoll aller Ihrer Testdurchl\u00e4ufe und bietet ein internes Berichtssystem.<\/p>\n<p>Lassen Sie uns am Beispiel sehen, wie der Code eines Unit-Tests aussieht, der nach dieser Methode implementiert ist.<\/p>\n<p><img decoding=\"async\" alt=\"Unit-Tests in Datenbanksystemen \u2014 wie wir es bei Sportmaster machen, Teil eins\" src=\"\/wp-content\/uploads\/2019\/08\/6fc8cc2d84c6c32a8b5269ebad1d2381.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSo, auf dem Bildschirm sehen wir den Code einer typischen Paket-Spezifikation mit Unit-Tests. Welche obligatorischen Anforderungen gibt es? Das Paket muss mit dem Pr\u00e4fix \u201eutp_\u201c beginnen. Genau der gleiche Pr\u00e4fix sollte auch f\u00fcr alle Testprozeduren verwendet werden. Im Paket m\u00fcssen unbedingt zwei Standardprozeduren vorhanden sein: \u201eutp_setup\u201c und \u201eutp_teardown\u201c. Die erste Prozedur wird vor jedem Unit-Test aufgerufen, die zweite nach der Ausf\u00fchrung.<\/p>\n<p>\u201eutp_setup\u201c bereitet in der Regel unser System auf die Ausf\u00fchrung des Unit-Tests vor, indem sie beispielsweise Testdaten erstellt. \u201eutp_teardown\u201c hingegen stellt alles auf die Ausgangseinstellungen zur\u00fcck und setzt die Ergebnisse der Ausf\u00fchrung zur\u00fcck.<\/p>\n<p>Hier ist ein Beispiel f\u00fcr den einfachsten Unit-Test, der die Normalisierung der eingegebenen Telefonnummer des Kunden auf das f\u00fcr unser Loyalit\u00e4tssystem standardisierte Format \u00fcberpr\u00fcft. Es gibt keine verbindlichen Standards daf\u00fcr, wie Verfahren mit Unit-Tests geschrieben werden sollten. In der Regel wird eine Methode des zu testenden Systems aufgerufen und das Ergebnis, das von dieser Methode zur\u00fcckgegeben wird, mit einem Referenzwert verglichen. Wichtig ist, dass der Vergleich zwischen dem Referenzwert und dem erhaltenen Ergebnis durch die standardm\u00e4\u00dfigen utPLSQL-Methoden erfolgt.<\/p>\n<p>In einem Unit-Test kann es beliebig viele \u00dcberpr\u00fcfungen geben. Wie im Beispiel zu sehen ist, f\u00fchren wir vier aufeinanderfolgende Aufrufe der getesteten Methode zur Normalisierung der Telefonnummer durch und bewerten nach jedem Aufruf das Ergebnis. Bei der Entwicklung des Unit-Tests muss ber\u00fccksichtigt werden, dass es \u00dcberpr\u00fcfungen gibt, die keinen Einfluss auf das System haben, w\u00e4hrend nach anderen zur\u00fcck zum urspr\u00fcnglichen Zustand des Systems gewechselt werden muss. <br \/>\nZum Beispiel formatieren wir im vorgestellten Unit-Test einfach die eingegebene Telefonnummer, was sich in keiner Weise auf das Loyalit\u00e4tssystem auswirkt. <\/p>\n<p>Wenn wir jedoch Unit-Tests f\u00fcr die Methode zur Erstellung eines neuen Kunden schreiben, wird nach jeder \u00dcberpr\u00fcfung ein neuer Kunde im System erstellt, was die nachfolgende Ausf\u00fchrung des Tests beeinflussen kann.<\/p>\n<p><img decoding=\"async\" alt=\"Unit-Tests in Datenbanksystemen \u2014 wie wir es bei Sportmaster machen, Teil eins\" src=\"\/wp-content\/uploads\/2019\/08\/7d649b354776c15d8a70a0d9a05363b4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSo werden Unit-Tests ausgef\u00fchrt. Es gibt zwei zul\u00e4ssige Ausf\u00fchrungsvarianten: die Ausf\u00fchrung aller Unit-Tests aus einem bestimmten Paket oder die Ausf\u00fchrung eines bestimmten Unit-Tests in einem bestimmten Paket.<\/p>\n<p><img decoding=\"async\" alt=\"Unit-Tests in Datenbanksystemen \u2014 wie wir es bei Sportmaster machen, Teil eins\" src=\"\/wp-content\/uploads\/2019\/08\/46628b60eb0fe0d20df822ddca914947.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSo sieht ein Beispiel f\u00fcr ein internes Berichtssystem aus. Auf Grundlage der Ergebnisse des Unit-Tests erstellt utPLSQL einen kleinen Bericht. In diesem sehen wir das Ergebnis jeder spezifischen \u00dcberpr\u00fcfung und das Gesamtergebnis der Ausf\u00fchrung des Unit-Tests. <\/p>\n<h2>6 Regeln f\u00fcr automatisierte Tests<\/h2>\n<p>\nBevor wir mit der Erstellung eines neuen automatisierten Testsystems f\u00fcr das Loyalit\u00e4tssystem beginnen, haben wir gemeinsam mit der Gesch\u00e4ftsf\u00fchrung die Prinzipien festgelegt, denen unsere zuk\u00fcnftigen automatisierten Tests entsprechen m\u00fcssen.<\/p>\n<p><img decoding=\"async\" alt=\"Unit-Tests in Datenbanksystemen \u2014 wie wir es bei Sportmaster machen, Teil eins\" src=\"\/wp-content\/uploads\/2019\/08\/84be59663203abb373e7074b9a6cd4e4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ol>\n<li>Automatisierte Tests m\u00fcssen effektiv sein und Nutzen bringen. Wir haben gro\u00dfartige Entwickler, \u00fcber die man unbedingt sprechen muss, da einige von ihnen wahrscheinlich diesen Bericht sehen werden, und sie schreiben hervorragenden Code. Doch selbst ihr hervorragender Code ist nicht perfekt und enthielt, enth\u00e4lt und wird Fehler beinhalten. Automatisierte Tests m\u00fcssen diese Fehler finden. Wenn dem nicht so ist, dann schreiben wir entweder schlechte Tests oder wir sind in einem toten Bereich, der grunds\u00e4tzlich nicht weiterentwickelt wird. In beiden F\u00e4llen machen wir etwas falsch und unser Ansatz ist einfach sinnlos.<\/li>\n<li>Automatisierte Tests m\u00fcssen verwendet werden. Es ist sinnlos, eine Menge Zeit und M\u00fche in die Erstellung eines Softwareprodukts zu investieren, das Repository zusammenzustellen und es dann zu vergessen. Tests sollten durchgef\u00fchrt werden, und zwar so regelm\u00e4\u00dfig wie m\u00f6glich.<\/li>\n<li>Automatisierte Tests m\u00fcssen stabil arbeiten. Unabh\u00e4ngig von der Tageszeit, dem Teststand und anderen Systemkonfigurationen sollten die Testergebnisse immer gleich sein. In der Regel wird dies sichergestellt, indem automatisierte Tests mit speziellen Testdaten und festen Systemeinstellungen arbeiten.<\/li>\n<li>Automatisierte Tests m\u00fcssen mit einer f\u00fcr Ihr Projekt akzeptablen Geschwindigkeit arbeiten. Diese Zeit wird individuell f\u00fcr jedes System festgelegt. Manche k\u00f6nnen es sich leisten, den ganzen Tag zu arbeiten, w\u00e4hrend andere unbedingt in Sekundenfrist fertig werden m\u00fcssen. Welche Geschwindigkeitsnormen wir in unserem Projekt erreicht haben, werde ich sp\u00e4ter erl\u00e4utern.<\/li>\n<li>Die Entwicklung automatisierter Tests sollte flexibel sein. Es ist unerw\u00fcnscht, auf die \u00dcberpr\u00fcfung bestimmter Funktionen zu verzichten, nur weil wir dies bisher nicht gemacht haben oder aus anderen \u00dcberzeugungen. utPLSQL setzt keine Einschr\u00e4nkungen bei der Entwicklung, und Oracle erlaubt grunds\u00e4tzlich die Umsetzung der unterschiedlichsten Dinge. Die meisten Probleme haben eine L\u00f6sung, es ist nur eine Frage der Zeit und des Aufwands.<\/li>\n<li>Deployability. Wir haben mehrere St\u00e4nde, an denen Tests durchgef\u00fchrt werden m\u00fcssen. An jedem dieser St\u00e4nde kann zu jeder Zeit ein Daten-Dump aktualisiert werden. Projekte mit automatisierten Tests m\u00fcssen so gef\u00fchrt werden, dass eine vollst\u00e4ndige oder teilweise Installation ohne Probleme m\u00f6glich ist.<\/li>\n<\/ol>\n<p>In dem n\u00e4chsten Beitrag in ein paar Tagen werde ich erz\u00e4hlen, was wir gemacht haben und welche Ergebnisse wir erzielt haben.<br \/>\n<br \/>Quelle: <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.1.1 - 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\/de\/blog\/administrirovanie\/unit-testy-v-subd-kak-my-delaem-eto-v-sportmastere-chast-pervaya\" \/>\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 \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\/de\/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 DBMS \u2013 so machen wir das bei Sportmaster, Teil eins | ProHoster","description":"Hallo, Habr! Mein Name ist Maxim Ponomarenko und ich bin Entwickler bei Sportmaster. Ich habe 10 Jahre Erfahrung im IT-Bereich. Ich habe meine Karriere im Bereich manuelles Testen begonnen und dann auf die Entwicklung von Datenbanken umgeschaltet.","canonical_url":"https:\/\/prohoster.info\/de\/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":"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 \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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/37495","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=37495"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/37495\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/28136"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=37495"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=37495"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=37495"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}