Unit-Tests in Datenbanksystemen — wie wir es bei Sportmaster machen, Teil eins

Hallo, Habra!

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Àftige ich mich mit der Automatisierung von Tests auf Ebene des DBMS.

Ich bin seit etwas mehr als einem Jahr im Team von Sportmaster und arbeite an einem grĂ¶ĂŸeren 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 „Unit-Tests im DBMS“, und jetzt möchte ich ihn mit Ihnen teilen. Es wird viel Text geben, daher habe ich beschlossen, den Vortrag in zwei Posts aufzuteilen. Im ersten werden wir ĂŒber Automatisierungstests und Testing im Allgemeinen sprechen, und im zweiten werde ich nĂ€her auf unser System der Unit-Tests und die Ergebnisse seiner Anwendung eingehen.

Unit-Tests in Datenbanksystemen — wie wir es bei Sportmaster machen, Teil eins

ZunĂ€chst ein wenig trockene Theorie. Was ist automatisiertes Testen? Das ist Testen, das mit Software-Tools durchgefĂŒhrt wird, und in der modernen IT wird es immer hĂ€ufiger bei der Softwareentwicklung eingesetzt. Das hĂ€ngt damit zusammen, dass Unternehmen wachsen, ihre Informationssysteme wachsen und dementsprechend auch die Anzahl der Funktionen, die getestet werden mĂŒssen, zunimmt. Es wird immer schwieriger, manuelle Tests durchzufĂŒhren.

Ich habe in einem großen Unternehmen gearbeitet, dessen Releases alle zwei Monate erscheinen. Dabei wurde ein ganzer Monat dafĂŒr aufgewendet, dass ein Dutzend Tester den Funktionsumfang manuell ĂŒberprĂŒften. Durch die Implementierung von Automatisierung mit einem kleinen Team von Entwicklern konnten wir die Testzeit in anderthalb Jahren auf 2 Wochen verkĂŒrzen. Wir haben nicht nur die Geschwindigkeit des Testens erhöht, sondern auch dessen QualitĂ€t verbessert. Automatisierte Tests werden regelmĂ€ĂŸig ausgefĂŒhrt und fĂŒhren stets alle in ihnen festgelegten PrĂŒfungen durch, das heißt, wir schließen den menschlichen Faktor aus.

FĂŒr die moderne IT ist charakteristisch, dass von einem Entwickler nicht nur erwartet wird, Produktcode zu schreiben, sondern auch Unit-Tests, die diesen Code ĂŒberprĂŒfen.

Was ist jedoch zu tun, wenn Ihr System hauptsĂ€chlich auf Serverlogik basiert? Es gibt keine universelle Lösung oder Best Practices auf dem Markt. In der Regel lösen Unternehmen dieses Problem, indem sie ihr eigenes maßgeschneidertes Testsystem erstellen. Ein solches maßgeschneidertes automatisiertes Testsystem wurde in unserem Projekt entwickelt, und darĂŒber werde ich in meinem Vortrag berichten.

Unit-Tests in Datenbanksystemen — wie wir es bei Sportmaster machen, Teil eins

Wir testen die LoyalitÀt

ZunĂ€chst sprechen wir ĂŒber das Projekt, in dem wir das automatisierte Testsystem implementiert haben. Unser Projekt ist das LoyalitĂ€tssystem von Sportmaster (ĂŒbrigens haben wir bereits darĂŒber geschrieben in diesem Beitrag).

Wenn Ihr Unternehmen groß genug ist, wird Ihr LoyalitĂ€tssystem drei Standardmerkmale aufweisen:

  • Ihr System wird hochgradig belastet sein
  • Ihr System wird komplexe Berechnungsprozesse enthalten
  • Ihr System wird aktiv weiterentwickelt werden.

Fangen wir der Reihe nach an
 Insgesamt, wenn man alle Marken von Sportmaster betrachtet, haben wir in Russland, der Ukraine, China, Kasachstan und Weißrussland ĂŒber 1000 GeschĂ€fte. In diesen GeschĂ€ften werden tĂ€glich etwa 300.000 KĂ€ufe getĂ€tigt. Das bedeutet, jede Sekunde gelangen 3-4 Quittungen in unser System. NatĂŒrlich ist unser LoyalitĂ€tssystem hochgradig belastet. Und da es aktiv genutzt wird, mĂŒssen wir die höchsten QualitĂ€tsstandards sicherstellen, denn jeder Fehler in der Software fĂŒhrt zu erheblichen finanziellen, reputativen und anderen Verlusten.

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Ă€fte 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ĂŒhrt dazu, dass die Abrechnung jeder Bestellung eine recht anspruchsvolle Aufgabe ist.

Der Algorithmus, der die Auftragsbearbeitung implementiert, ist wirklich schrecklich und kompliziert. Jede Änderung an diesem Algorithmus ist eine recht riskante Angelegenheit. Es stellte sich heraus, dass selbst die Ă€ußerlich unbedeutendsten Änderungen zu ziemlich unvorhersehbaren Ergebnissen fĂŒhren können. Gerade solche komplexen Berechnungsprozesse, die zudem kritische Funktionen implementieren, sind die besten Kandidaten fĂŒr die Automatisierung. Die manuelle ÜberprĂŒfung dutzender identischer FĂ€lle ist zeitaufwendig. Da der Einstiegspunkt in den Prozess unverĂ€ndert bleibt, kann man, einmal beschrieben, recht schnell automatische Tests generieren und sich auf die FunktionalitĂ€t verlassen.

Da unser System aktiv genutzt wird, wird das GeschĂ€ft 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Ă€ndigen Regressionstest des gesamten Systems durchfĂŒhren mĂŒssen. Zumal, wie in jeder modernen IT, die Entwicklung nicht sofort vom Entwickler in die Produktion gelangt. Sie entsteht zunĂ€chst in der Entwicklungsumgebung, durchlĂ€uft dann nacheinander die Testumgebung, die Release-Umgebung, die Abnahme und gelangt erst dann in die Produktion. Mindestens in der Test- und Release-Umgebung mĂŒssen wir einen vollstĂ€ndigen Regressionstest des gesamten Systems durchfĂŒhren.

Die beschriebenen Eigenschaften sind standardmĂ€ĂŸig fĂŒr nahezu jedes Treueprogramm. Lassen Sie uns ĂŒber die Besonderheiten unseres Projekts sprechen.

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ĂŒhrt. Es gibt auch Webdienste fĂŒr externe Anwendungen (zum Beispiel die Website). Daher ist es durchaus logisch, dass wir, wenn wir ein automatisiertes Testsystem aufbauen, dies in Oracle tun werden.

Das LoyalitĂ€tssystem bei Sportmaster existiert seit ĂŒber 7 Jahren und wurde von einzelnen Entwicklern erstellt
 Im Durchschnitt waren wĂ€hrend dieser 7 Jahre 3-4 Entwickler an unserem Projekt beteiligt. Aber im letzten Jahr hat sich unser Team erheblich vergrĂ¶ĂŸert, 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öhtes Risiko, dass wir Fehler ĂŒbersehen werden.

Das Projekt zeichnet sich durch das Fehlen von dedizierten Testern als feste Mitarbeiter aus. Tests finden zwar statt, aber diese werden von Analysten durchgefĂŒhrt, zusĂ€tzlich zu ihren anderen Hauptaufgaben: dem Kontakt mit den GeschĂ€ftskunden, den Nutzern, der Ausarbeitung von Systemanforderungen usw. Trotz der Tatsache, dass die Tests sehr qualitativ durchgefĂŒhrt werden (das sollte besonders erwĂ€hnt werden, da möglicherweise einige Analysten diesen Bericht lesen), bleibt die Effizienz der Spezialisierung und Konzentration auf ein einziges Thema unbestreitbar.

Angesichts des Vorangegangenen erscheint die Idee der Automatisierung von Tests im Projekt als sehr logisch, um die QualitĂ€t des gelieferten Produkts zu erhöhen und die Entwicklungszeiten zu verkĂŒrzen. In verschiedenen Phasen der Existenz des LoyalitĂ€tssystems 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ĂŒr die Unit-Tests waren die Endergebnisse: Die Tests wurden entwickelt, eine Zeit lang genutzt, in ein Versionsspeicher abgelegt, aber irgendwann hörten sie auf, ausgefĂŒhrt zu werden, und wurden vergessen. Dies geschah in erster Linie, weil die Tests mehr an einen bestimmten Entwickler als an das Projekt gebunden waren.

Hier kommt utPLSQL ins Spiel

Unit-Tests in Datenbanksystemen — wie wir es bei Sportmaster machen, Teil eins

Wissen Sie etwas ĂŒber Steven Feuerstein?

Dies ist ein kluger Kerl, der einen großen Teil seiner Karriere der Arbeit mit Oracle und PL/SQL gewidmet hat und zu diesem Thema eine betrĂ€chtliche Anzahl von Arbeiten verfasst hat. Ein bekanntes Buch von ihm heißt: „Oracle PL/SQL. FĂŒr Profis“. Steven ist der Entwickler der Lösung utPLSQL, was ausgeschrieben das Unit Testing Framework fĂŒr Oracle PL/SQL bedeutet. Die Lösung 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Ă€rz 2019.
Was ist das eigentlich? Es handelt sich um ein separates Open-Source-Projekt. Es hat ein paar Megabyte, einschließlich 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.
Im Großen und Ganzen stellt utPLSQL einen Mechanismus zum AusfĂŒhren von Unit-Tests dar, wobei unter einem Unit-Test normale Oracle-Paketprozeduren verstanden werden, deren Organisation bestimmten Regeln entspricht. Neben der AusfĂŒhrung speichert utPLSQL ein Protokoll aller Ihrer TestdurchlĂ€ufe und bietet ein internes Berichtssystem.

Lassen Sie uns am Beispiel sehen, wie der Code eines Unit-Tests aussieht, der nach dieser Methode implementiert ist.

Unit-Tests in Datenbanksystemen — wie wir es bei Sportmaster machen, Teil eins

So, 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Ă€fix „utp_“ beginnen. Genau der gleiche PrĂ€fix sollte auch fĂŒr alle Testprozeduren verwendet werden. Im Paket mĂŒssen unbedingt zwei Standardprozeduren vorhanden sein: „utp_setup“ und „utp_teardown“. Die erste Prozedur wird vor jedem Unit-Test aufgerufen, die zweite nach der AusfĂŒhrung.

„utp_setup“ bereitet in der Regel unser System auf die AusfĂŒhrung des Unit-Tests vor, indem sie beispielsweise Testdaten erstellt. „utp_teardown“ hingegen stellt alles auf die Ausgangseinstellungen zurĂŒck und setzt die Ergebnisse der AusfĂŒhrung zurĂŒck.

Hier ist ein Beispiel fĂŒr den einfachsten Unit-Test, der die Normalisierung der eingegebenen Telefonnummer des Kunden auf das fĂŒr unser LoyalitĂ€tssystem standardisierte Format ĂŒberprĂŒft. Es gibt keine verbindlichen Standards dafĂŒr, 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ĂŒckgegeben wird, mit einem Referenzwert verglichen. Wichtig ist, dass der Vergleich zwischen dem Referenzwert und dem erhaltenen Ergebnis durch die standardmĂ€ĂŸigen utPLSQL-Methoden erfolgt.

In einem Unit-Test kann es beliebig viele ÜberprĂŒfungen geben. Wie im Beispiel zu sehen ist, fĂŒhren 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ĂŒcksichtigt werden, dass es ÜberprĂŒfungen gibt, die keinen Einfluss auf das System haben, wĂ€hrend nach anderen zurĂŒck zum ursprĂŒnglichen Zustand des Systems gewechselt werden muss.
Zum Beispiel formatieren wir im vorgestellten Unit-Test einfach die eingegebene Telefonnummer, was sich in keiner Weise auf das LoyalitÀtssystem auswirkt.

Wenn wir jedoch Unit-Tests fĂŒr die Methode zur Erstellung eines neuen Kunden schreiben, wird nach jeder ÜberprĂŒfung ein neuer Kunde im System erstellt, was die nachfolgende AusfĂŒhrung des Tests beeinflussen kann.

Unit-Tests in Datenbanksystemen — wie wir es bei Sportmaster machen, Teil eins

So werden Unit-Tests ausgefĂŒhrt. Es gibt zwei zulĂ€ssige AusfĂŒhrungsvarianten: die AusfĂŒhrung aller Unit-Tests aus einem bestimmten Paket oder die AusfĂŒhrung eines bestimmten Unit-Tests in einem bestimmten Paket.

Unit-Tests in Datenbanksystemen — wie wir es bei Sportmaster machen, Teil eins

So sieht ein Beispiel fĂŒr ein internes Berichtssystem aus. Auf Grundlage der Ergebnisse des Unit-Tests erstellt utPLSQL einen kleinen Bericht. In diesem sehen wir das Ergebnis jeder spezifischen ÜberprĂŒfung und das Gesamtergebnis der AusfĂŒhrung des Unit-Tests.

6 Regeln fĂŒr automatisierte Tests

Bevor wir mit der Erstellung eines neuen automatisierten Testsystems fĂŒr das LoyalitĂ€tssystem beginnen, haben wir gemeinsam mit der GeschĂ€ftsfĂŒhrung die Prinzipien festgelegt, denen unsere zukĂŒnftigen automatisierten Tests entsprechen mĂŒssen.

Unit-Tests in Datenbanksystemen — wie wir es bei Sportmaster machen, Teil eins

  1. Automatisierte Tests mĂŒssen effektiv sein und Nutzen bringen. Wir haben großartige Entwickler, ĂŒber 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Ă€lt und wird Fehler beinhalten. Automatisierte Tests mĂŒssen diese Fehler finden. Wenn dem nicht so ist, dann schreiben wir entweder schlechte Tests oder wir sind in einem toten Bereich, der grundsĂ€tzlich nicht weiterentwickelt wird. In beiden FĂ€llen machen wir etwas falsch und unser Ansatz ist einfach sinnlos.
  2. Automatisierte Tests mĂŒssen verwendet werden. Es ist sinnlos, eine Menge Zeit und MĂŒhe in die Erstellung eines Softwareprodukts zu investieren, das Repository zusammenzustellen und es dann zu vergessen. Tests sollten durchgefĂŒhrt werden, und zwar so regelmĂ€ĂŸig wie möglich.
  3. Automatisierte Tests mĂŒssen stabil arbeiten. UnabhĂ€ngig 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.
  4. Automatisierte Tests mĂŒssen mit einer fĂŒr Ihr Projekt akzeptablen Geschwindigkeit arbeiten. Diese Zeit wird individuell fĂŒr jedes System festgelegt. Manche können es sich leisten, den ganzen Tag zu arbeiten, wĂ€hrend andere unbedingt in Sekundenfrist fertig werden mĂŒssen. Welche Geschwindigkeitsnormen wir in unserem Projekt erreicht haben, werde ich spĂ€ter erlĂ€utern.
  5. Die Entwicklung automatisierter Tests sollte flexibel sein. Es ist unerwĂŒnscht, auf die ÜberprĂŒfung bestimmter Funktionen zu verzichten, nur weil wir dies bisher nicht gemacht haben oder aus anderen Überzeugungen. utPLSQL setzt keine EinschrĂ€nkungen bei der Entwicklung, und Oracle erlaubt grundsĂ€tzlich die Umsetzung der unterschiedlichsten Dinge. Die meisten Probleme haben eine Lösung, es ist nur eine Frage der Zeit und des Aufwands.
  6. Deployability. Wir haben mehrere StĂ€nde, an denen Tests durchgefĂŒhrt werden mĂŒssen. An jedem dieser StĂ€nde kann zu jeder Zeit ein Daten-Dump aktualisiert werden. Projekte mit automatisierten Tests mĂŒssen so gefĂŒhrt werden, dass eine vollstĂ€ndige oder teilweise Installation ohne Probleme möglich ist.

In dem nÀchsten Beitrag in ein paar Tagen werde ich erzÀhlen, was wir gemacht haben und welche Ergebnisse wir erzielt haben.

Quelle: habr.com

60GB SSD 8Gb DDR4