{"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 DBMS \u2013 so machen wir das bei Sportmaster, Teil eins","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hallo, Habr!<\/p>\n<p>Mein Name ist Maksim Ponomarenko und ich bin Entwickler bei Sportmaster. Ich habe 10 Jahre Erfahrung in der IT-Branche. Meine Karriere begann im Bereich manuelles Testen, bevor ich zur Datenbankentwicklung wechselte. In den letzten 4 Jahren setze ich das Wissen, das ich im Testen und Entwickeln gesammelt habe, zur Automatisierung von Tests auf Datenbankebene ein.<\/p>\n<p>Ich bin seit etwas mehr als einem Jahr im Team von Sportmaster und arbeite an einem gro\u00dfen Projekt, in dem ich automatisierte Tests entwickle. Im April haben wir mit den Kollegen aus Sportmaster Lab auf einer Konferenz in Krasnodar einen Vortrag gehalten, mein Thema lautete \u201eUnit-Tests in der Datenbank\u201c. Jetzt m\u00f6chte ich diesen Vortrag mit Ihnen teilen. Es wird viel Text geben, daher habe ich beschlossen, den Vortrag auf zwei Beitr\u00e4ge aufzuteilen. Im ersten Teil sprechen wir \u00fcber automatisierte Tests und Testen im Allgemeinen, und im zweiten Teil werde ich genauer auf unser Unit-Test-System 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 DBMS \u2013 so machen wir das bei Sportmaster, Teil eins\" src=\"\/wp-content\/uploads\/2019\/08\/4e521cc85eb3a3806860a40ab2e4050f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p>Zun\u00e4chst einige theoretische Grundlagen. Was ist automatisiertes Testen? Dabei handelt es sich um Testprozesse, die mit Software-Werkzeugen durchgef\u00fchrt werden und im modernen IT-Umfeld zunehmend bei der Softwareentwicklung eingesetzt werden. Das liegt daran, dass Unternehmen wachsen, ihre Informationssysteme sich ausdehnen und dementsprechend die Anzahl der Funktionen, die getestet werden m\u00fcssen, steigt. Manuelles Testen wird daher immer aufw\u00e4ndiger.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nIch habe in einem gro\u00dfen Unternehmen gearbeitet, dessen Releases alle zwei Monate ver\u00f6ffentlicht werden. Ein ganzer Monat wurde darauf verwendet, dass ein Dutzend Tester den Funktionsumfang manuell \u00fcberpr\u00fcften. Durch die Implementierung von Automatisierung in einem kleinen Entwicklerteam gelang es uns, die Testzeit innerhalb von anderthalb Jahren auf 2 Wochen zu verk\u00fcrzen. Wir haben nicht nur die Geschwindigkeit des Testens erh\u00f6ht, sondern auch die Qualit\u00e4t verbessert. Automatisierte Tests werden regelm\u00e4\u00dfig durchgef\u00fchrt und durchlaufen immer alle vorgesehenen \u00dcberpr\u00fcfungen, wodurch wir den menschlichen Faktor ausschlie\u00dfen. <\/p>\n<p>Moderne IT-Fachkr\u00e4fte m\u00fcssen nicht nur Produktcode schreiben, sondern auch Unit-Tests, die diesen Code \u00fcberpr\u00fcfen. <\/p>\n<p>Was aber, wenn Ihre Systeme \u00fcberwiegend auf serverseitiger Logik basieren? Es gibt keine universelle L\u00f6sung oder Best Practices auf dem Markt. In der Regel l\u00f6sen Unternehmen dieses Problem, indem sie ein eigenes, ma\u00dfgeschneidertes Testsysteem entwickeln. 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 DBMS \u2013 so machen wir das bei Sportmaster, 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>\nLassen Sie uns mit dem Projekt beginnen, 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 standardisierte Eigenschaften aufweisen: <\/p>\n<ul>\n<li>Ihr System wird stark 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>\nLass uns der Reihe nach vorgehen... Insgesamt haben wir, wenn wir alle Marken von Sportmaster betrachten, \u00fcber 1.000 Gesch\u00e4fte in Russland, der Ukraine, China, Kasachstan und Wei\u00dfrussland. In diesen Gesch\u00e4ften werden t\u00e4glich etwa 300.000 K\u00e4ufe get\u00e4tigt. Das bedeutet, dass jede Sekunde 3-4 Belege in unser System gelangen. Nat\u00fcrlich ist unser Loyalit\u00e4tssystem stark belastet. Da es intensiv genutzt wird, sind wir verpflichtet, die h\u00f6chsten Qualit\u00e4tsstandards bereitzustellen, denn jeder Fehler in der Software hat gro\u00dfe finanzielle, reputationsbezogene und andere Verluste zur Folge. <\/p>\n<p>Gleichzeitig laufen bei Sportmaster \u00fcber einhundert verschiedene Aktionen. Die Aktionen sind sehr vielf\u00e4ltig: Es gibt Produktaktionen, solche, die an bestimmte Wochentage gebunden sind, sowie solche, die an ein bestimmtes Gesch\u00e4ft gekn\u00fcpft sind, und Aktionen, die sich auf den Bestellwert oder die Anzahl der Produkte beziehen. Kurz gesagt, es ist beeindruckend. Die Kunden haben Boni und nutzen Promo-Codes bei ihren Eink\u00e4ufen. All dies f\u00fchrt dazu, dass die Abrechnung jeder Bestellung eine durchaus anspruchsvolle Aufgabe darstellt. <\/p>\n<p>Der Algorithmus, der die Auftragsverarbeitung implementiert, ist wirklich komplex und problematisch. Jede \u00c4nderung an diesem Algorithmus ist eine riskante Angelegenheit. Selbst scheinbar geringf\u00fcgige Anpassungen k\u00f6nnen zu unvorhersehbaren Ergebnissen f\u00fchren. Solche komplexen Berechnungsprozesse, die zudem kritische Funktionen realisieren, sind ideal f\u00fcr die Automatisierung. Manuell Dutzende von \u00e4hnlichen F\u00e4llen zu \u00fcberpr\u00fcfen, kostet viel Zeit. Da der Einstiegspunkt im Prozess unver\u00e4ndert bleibt, gen\u00fcgt es, ihn einmal zu beschreiben, um schnell automatisierte Tests zu erstellen und sicherzustellen, dass die Funktionalit\u00e4t einwandfrei arbeitet.<\/p>\n<p>Da unser System aktiv genutzt wird, erwartet das Gesch\u00e4ft von Ihnen st\u00e4ndige Neuerungen, um mit der Zeit Schritt zu halten und kundenorientiert zu sein. In unserem Loyalit\u00e4tsprogramm erscheinen alle zwei Monate neue Releases. Das bedeutet, dass wir alle zwei Monate einen vollst\u00e4ndigen Regressionstest des gesamten Systems durchf\u00fchren m\u00fcssen. Wie in jeder modernen IT-Umgebung geht die Entwicklung nicht direkt vom Entwickler in die Produktion. Der Prozess beginnt im Entwickler-Kontourn, durchl\u00e4uft dann nacheinander die Test-, Release- und Abnahmeumgebung und landet schlie\u00dflich in der Produktion. Mindestens in den Test- und Release-Konturen m\u00fcssen wir einen vollst\u00e4ndigen Regressionstest des gesamten Systems durchf\u00fchren. <\/p>\n<p>Die genannten Eigenschaften sind standardm\u00e4\u00dfig f\u00fcr nahezu jedes Loyalit\u00e4tssystem. Lassen Sie uns \u00fcber die Besonderheiten unseres Projekts sprechen.<\/p>\n<p>Die technische Logik unseres Loyalit\u00e4tssystems basiert zu 90 % auf Servertechnologie und wurde auf Oracle implementiert. Es gibt einen Delphi-Client, der die Funktion eines Administrationsarbeitsplatzes erf\u00fcllt. Zudem stehen Web-Services f\u00fcr externe Anwendungen (wie zum Beispiel die Website) zur Verf\u00fcgung. Daher ist es nur logisch, dass wir, wenn wir ein automatisiertes Testsystem aufbauen, dies auf Oracle realisieren werden.<\/p>\n<p>Das Loyalit\u00e4tssystem bei Sportmaster existiert seit \u00fcber 7 Jahren und wurde von einzelnen Entwicklern geschaffen. Die durchschnittliche Anzahl der Entwickler in unserem Projekt lag w\u00e4hrend dieser 7 Jahre bei 3-4 Personen. Im letzten Jahr hat sich unser Team jedoch stark vergr\u00f6\u00dfert, und nun arbeiten 10 Personen an dem Projekt. Das bedeutet, dass neue Mitglieder ins Team kommen, die mit den typischen Aufgaben, Prozessen und der Architektur nicht vertraut sind. Dadurch besteht ein erh\u00f6htes Risiko, dass wir Fehler \u00fcbersehen.<\/p>\n<p>F\u00fcr das Projekt ist charakteristisch, dass es keine dedizierten Tester als feste Mitarbeiter gibt. Es findet zwar Testing statt, doch diese Aufgabe wird von den Analysten neben ihren weiteren Hauptaufgaben \u00fcbernommen: Sie kommunizieren mit den Gesch\u00e4ftsauftraggebern, den Nutzern und arbeiten an den Anforderungen des Systems usw. Obwohl das Testing sehr qualitativ durchgef\u00fchrt wird (dieser Hinweis ist besonders relevant, da es einem der Analysten, der diesen Bericht sieht, auffallen k\u00f6nnte), ist die Effizienz von Spezialisierung und Fokussierung auf eine einzige T\u00e4tigkeit nicht zu untersch\u00e4tzen.<\/p>\n<p>Unter Ber\u00fccksichtigung all dieser Punkte erscheint die Idee, das Testen im Projekt zu automatisieren, um die Qualit\u00e4t des Endprodukts zu verbessern und die Entwicklungszeiten zu verk\u00fcrzen, \u00e4u\u00dferst logisch. In verschiedenen Phasen der Loyalit\u00e4tssystem-Entwicklung haben einzelne Entwickler versucht, ihren Code mit Unit-Tests abzudecken. Dieser Prozess war insgesamt recht fragmentiert, da jeder seine eigene Architektur und Methoden verwendete. Gemeinsam bei den Unit-Tests waren die endg\u00fcltigen Ergebnisse: Tests wurden entwickelt, eine Zeit lang verwendet, in einem Versionsspeicher abgelegt, aber irgendwann wurden sie nicht mehr ausgef\u00fchrt und gerieten in Vergessenheit. Dies geschah in erster Linie, weil die Tests mehr an den jeweiligen 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 DBMS \u2013 so machen wir das bei Sportmaster, 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>Das ist ein kluger Mann, der einen Gro\u00dfteil seiner Karriere der Arbeit mit Oracle und PL\/SQL gewidmet hat und zu diesem Thema eine beachtliche Anzahl von Arbeiten verfasst hat. Ein bekanntes Buch von ihm tr\u00e4gt den Titel: \u201eOracle PL\/SQL. F\u00fcr Profis\u201c. Steven ist der Entwickler der L\u00f6sung utPLSQL, die f\u00fcr Unit Testing Framework f\u00fcr Oracle PL\/SQL steht. Die L\u00f6sung utPLSQL wurde 2016 ins Leben gerufen, wird aber weiterhin aktiv weiterentwickelt und es erscheinen neue Versionen. Zum Zeitpunkt des Vortrags war die letzte Version vom 24. M\u00e4rz 2019.<br \/>\nWas ist das genau? 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 einer Sammlung von Paketen und Tabellen zur Organisation von Unit-Tests. Die Installation dauert nur wenige Sekunden. Ein herausragendes Merkmal von utPLSQL ist die Einfachheit der Handhabung. <br \/>\nWeltweit betrachtet ist utPLSQL ein Mechanismus zum Ausf\u00fchren von Unit-Tests, wobei unter einem Unit-Test die \u00fcblichen Oracle-Paketprozeduren verstanden werden, deren Organisation bestimmten Regeln entspricht. Neben der Ausf\u00fchrung speichert utPLSQL ein Protokoll aller Ihrer Testdurchl\u00e4ufe und verf\u00fcgt \u00fcber ein internes Berichtssystem.<\/p>\n<p>Lassen Sie uns anhand eines Beispiels anschauen, wie der Code eines Unit-Tests aussieht, der nach dieser Methode umgesetzt wurde.<\/p>\n<p><img decoding=\"async\" alt=\"Unit-Tests in DBMS \u2013 so machen wir das bei Sportmaster, Teil eins\" src=\"\/wp-content\/uploads\/2019\/08\/6fc8cc2d84c6c32a8b5269ebad1d2381.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAuf dem Bildschirm sehen Sie den Code einer typischen Paket-Spezifikation mit Unit-Tests. Welche Anforderungen sind verpflichtend? Das Paket muss das Pr\u00e4fix \u201eutp_\u201c tragen. Alle Testprozeduren m\u00fcssen ebenfalls das gleiche Pr\u00e4fix haben. 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 danach.<\/p>\n<p>Die Prozedur \u201eutp_setup\u201c bereitet in der Regel unser System f\u00fcr die Ausf\u00fchrung des Unit-Tests vor, zum Beispiel durch das Erstellen von Testdaten. \u201eutp_teardown\u201c hingegen stellt alles auf die urspr\u00fcnglichen Einstellungen zur\u00fcck und l\u00f6scht die Ergebnisse des Durchlaufs.<\/p>\n<p>Dies ist ein Beispiel f\u00fcr den einfachsten Unit-Test, der die Normalisierung der eingegebenen Telefonnummer des Kunden in das f\u00fcr unser Loyalit\u00e4tssystem standardisierte Format \u00fcberpr\u00fcft. Es gibt keine verbindlichen Standards daf\u00fcr, wie Verfahren mit Unit-Tests zu schreiben sind. In der Regel wird eine Methode des zu testenden Systems aufgerufen, und das Ergebnis, das von dieser Methode zur\u00fcckgegeben wird, wird mit einem Referenzwert verglichen. Es ist wichtig, dass der Vergleich zwischen dem Referenzwert und dem erhaltenen Wert \u00fcber die standardm\u00e4\u00dfigen utPLSQL-Methoden erfolgt.<\/p>\n<p>Im 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 das Ergebnis nach jedem Aufruf. Bei der Entwicklung des Unit-Tests muss ber\u00fccksichtigt werden, dass es \u00dcberpr\u00fcfungen gibt, die die Systemintegrit\u00e4t nicht beeinflussen, und dass nach bestimmten \u00dcberpr\u00fcfungen zum urspr\u00fcnglichen Zustand des Systems zur\u00fcckgerollt werden muss. <br \/>\nZum Beispiel formatieren wir im pr\u00e4sentierten Unit-Test einfach die eingehende Telefonnummer, was sich nicht auf das Loyalit\u00e4tssystem auswirkt. <\/p>\n<p>Wenn wir Unit-Tests f\u00fcr die Methode zur Erstellung eines neuen Kunden schreiben, wird nach jeder \u00dcberpr\u00fcfung ein neuer Kunde im System angelegt, was den nachfolgenden Testlauf beeinflussen kann.<\/p>\n<p><img decoding=\"async\" alt=\"Unit-Tests in DBMS \u2013 so machen wir das bei Sportmaster, Teil eins\" src=\"\/wp-content\/uploads\/2019\/08\/7d649b354776c15d8a70a0d9a05363b4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSo werden Unit-Tests gestartet. Es sind zwei Ausf\u00fchrungsvarianten zul\u00e4ssig: 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 DBMS \u2013 so machen wir das bei Sportmaster, 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. Basierend auf den Ergebnissen des Unit-Tests erstellt utPLSQL einen kleinen Bericht. Darin sehen wir das Ergebnis jeder spezifischen \u00dcberpr\u00fcfung sowie 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 Systems f\u00fcr automatisierte Tests des Loyalit\u00e4tssystems beginnen, haben wir gemeinsam mit der Gesch\u00e4ftsf\u00fchrung die Prinzipien festgelegt, die unsere zuk\u00fcnftigen automatisierten Tests erf\u00fcllen m\u00fcssen.<\/p>\n<p><img decoding=\"async\" alt=\"Unit-Tests in DBMS \u2013 so machen wir das bei Sportmaster, 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 einen Mehrwert bieten. Wir haben gro\u00dfartige Entwickler, die unbedingt erw\u00e4hnt werden sollten, denn einige von ihnen werden diesen Bericht sicherlich lesen, und sie schreiben hervorragenden Code. Doch selbst ihr hervorragender Code ist nicht perfekt und enth\u00e4lt, enth\u00e4lt und wird Fehler enthalten. Automatisierte Tests m\u00fcssen diese Fehler finden. Wenn das nicht der Fall ist, schreiben wir entweder schlechte automatisierte Tests oder wir befinden uns im Toten Winkel, 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, viel Zeit und M\u00fche in die Erstellung eines Softwareprodukts zu investieren, es in ein Repository zu legen und es dann zu vergessen. Tests sollten ausgef\u00fchrt werden, und zwar so regelm\u00e4\u00dfig wie m\u00f6glich.<\/li>\n<li>Automatisierte Tests m\u00fcssen stabil laufen. Unabh\u00e4ngig von der Tageszeit, der Testumgebung und anderen Systemeinstellungen sollten die Testl\u00e4ufe immer zum gleichen Ergebnis f\u00fchren. In der Regel wird dies dadurch gew\u00e4hrleistet, dass automatisierte Tests mit speziellen Testdaten arbeiten, die mit fixen Systemeinstellungen konfiguriert sind.<\/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. Einige k\u00f6nnen den ganzen Tag arbeiten, w\u00e4hrend es f\u00fcr andere entscheidend ist, in Sekundenbruchteilen abzuschlie\u00dfen. Welche Leistungsstandards wir in unserem Projekt erreicht haben, werde ich Ihnen sp\u00e4ter erkl\u00e4ren.<\/li>\n<li>Die Entwicklung automatisierter Tests sollte flexibel sein. Es ist nicht ratsam, die \u00dcberpr\u00fcfung von Funktionen aufzugeben, nur weil wir das bisher noch nicht gemacht haben oder aus anderen \u00dcberzeugungen. utPLSQL setzt keine Beschr\u00e4nkungen f\u00fcr die Entwicklung, und Oracle erlaubt grunds\u00e4tzlich die Umsetzung vielf\u00e4ltiger L\u00f6sungen. Die meisten Aufgaben haben L\u00f6sungen, wobei die Frage nur die Zeit und den Aufwand betrifft.<\/li>\n<li>Bereitstellbarkeit. Wir haben mehrere St\u00e4nde, an denen Tests gestartet werden m\u00fcssen. An jedem dieser St\u00e4nde kann jederzeit ein Daten-Dump aktualisiert werden. Es ist notwendig, ein Projekt mit automatisierten Tests so zu f\u00fchren, dass eine vollst\u00e4ndige oder teilweise Installation problemlos durchgef\u00fchrt werden kann.<\/li>\n<\/ol>\n<p>In einem zweiten Beitrag in ein paar Tagen werde ich dar\u00fcber berichten, 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 4.9.10 - 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. \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\" \/>\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) 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 \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. \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\" \/>\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 der Datenbank \u2014 so machen wir das bei Sportmaster, Teil eins | ProHoster","description":"Hallo, Habr! Ich bin Maxim Ponomarenko und arbeite als Entwickler bei Sportmaster. Ich habe 10 Jahre Erfahrung in der IT-Branche. Meine Karriere begann im Bereich manuelles Testen, bevor ich zur Datenbankentwicklung wechselte. In den letzten 4 Jahren habe ich mein Wissen aus dem Testen und der Entwicklung geb\u00fcndelt, um die Automatisierung von Datenbanktests voranzutreiben. Seit etwas mehr als einem Jahr bin ich Teil des Sportmaster-Teams.","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. \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","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"},"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}]}}