Unit-Tests in DBMS – wie wir das im Sportmaster machen, Teil zwei

Der erste Teil — hier.

Unit-Tests in DBMS – wie wir das im Sportmaster machen, Teil zwei

Stellen Sie sich die Situation vor. Sie stehen vor der Aufgabe, eine neue FunktionalitĂ€t zu entwickeln. Sie haben Material von Ihren VorgĂ€ngern. Angenommen, Sie haben keine moralischen Verpflichtungen, wie wĂŒrden Sie handeln?

Meistens geraten alle alten Entwicklungen in Vergessenheit und alles beginnt von neuem. Niemand mag es, sich in fremdem Code zu verlieren, und wenn man Zeit hat, warum nicht ein eigenes System schaffen? Dies ist ein typischer Ansatz und in vielerlei Hinsicht richtig. Aber in unserem Projekt haben wir es anders gemacht. Wir haben das Fundament fĂŒr das zukĂŒnftige System automatischer Tests auf den Grundlagen der Unit-Tests auf utPLSQL von unseren VorgĂ€ngern aufgebaut und dann in mehreren parallelen Richtungen gearbeitet.

  1. Wiederherstellung alter Unit-Tests. Unter Wiederherstellung verstehen wir die Anpassung der Tests an den aktuellen Zustand des LoyalitÀtssystems und die Anpassung der Tests an die Standards von utPLSQL.
  2. Lösung des Problems des VerstĂ€ndnisses, welche Methoden und Prozesse durch automatisierte Tests abgedeckt sind. Wir mĂŒssen entweder diese Informationen im Kopf behalten oder Schlussfolgerungen basierend auf dem Code der automatisierten Tests ziehen. Daher haben wir beschlossen, ein Verzeichnis zu erstellen. Jeder automatisierte Test erhielt einen einzigartigen Mnemonik-Code, wir formulierten eine Beschreibung und hielten die Einstellungen fest (zum Beispiel unter welchen Bedingungen er gestartet werden soll oder was passieren sollte, wenn der Test fehlgeschlagen ist). Im Wesentlichen haben wir Metadaten ĂŒber die automatisierten Tests gesammelt und diese Metadaten in die Standardtabellen des utPLSQL-Schemas eingefĂŒgt.
  3. Definition der Erweiterungsstrategie, d.h. Auswahl der FunktionalitĂ€t, die durch automatisierte Tests ĂŒberprĂŒft werden soll. Wir haben beschlossen, uns auf drei Dinge zu konzentrieren: neue Erweiterungen des Systems, VorfĂ€lle aus der Produktion und SchlĂŒsselprozesse des Systems. Auf diese Weise entwickeln wir uns parallel mit dem Release weiter, gewĂ€hrleisten eine höhere QualitĂ€t und erweitern gleichzeitig das Regressionsvolumen und sichern die ZuverlĂ€ssigkeit des Systems an kritischen Stellen. Der erste Engpass war der Prozess der Verteilung von Rabatten und Boni auf den Beleg.
  4. NatĂŒrlich haben wir uns mit der Entwicklung neuer automatisierter Tests beschĂ€ftigt. Eine der ersten Release-Aufgaben bestand in der Bewertung der Leistung vordefinierter Abfragen des LoyalitĂ€tssystems. In unserem Projekt gibt es einen Block fest definierter SQL-Abfragen, die Kunden nach bestimmten Kriterien auswĂ€hlen. Zum Beispiel eine Liste aller Kunden zu erhalten, deren letzter Einkauf in einer bestimmten Stadt erfolgt ist, oder eine Liste von Kunden, deren durchschnittlicher Einkaufswert ĂŒber einem bestimmten Betrag liegt. Nachdem wir automatische Tests geschrieben hatten, haben wir die vordefinierten Abfragen ĂŒberprĂŒft, die Referenzparameter der Leistung festgehalten, und zudem unser Lasttestverfahren eingefĂŒhrt.
  5. Die Arbeit mit automatischen Tests sollte benutzerfreundlich sein.Am hĂ€ufigsten werden zwei Aktionen durchgefĂŒhrt: das Starten automatischer Tests und das Erstellen von Testdaten. So wurden in unserem System zwei Hilfsmodulen geschaffen: ein Startmodul und ein Datenmodul.

    Das Startmodul wird als eine universelle Prozedur mit einem Texteingabeparameter dargestellt. Als Parameter kann der Mnemonik-Code des automatischen Tests, der Paketname, der Name des Tests, die Konfiguration des automatischen Tests oder ein reserviertes SchlĂŒsselwort ĂŒbergeben werden. Die Prozedur wĂ€hlt und startet alle automatischen Tests, die die Bedingungen erfĂŒllen.

    Das Datenmodul wird in Form eines Pakets dargestellt, in dem fĂŒr jedes Objekt des zu testenden Systems (Tabelle in der DB) eine spezielle Prozedur erstellt wurde, die dort Daten einfĂŒgt. In dieser Prozedur sind die Standardwerte maximal ausgefĂŒllt, was die Erstellung von Objekten buchstĂ€blich auf Knopfdruck ermöglicht. FĂŒr die Benutzerfreundlichkeit wurden Vorlagen fĂŒr die zu erstellenden Daten erstellt. Zum Beispiel, einen Kunden bestimmten Alters mit einer Testtelefonnummer und einem getĂ€tigten Einkauf zu erstellen.

  6. Automatische Tests sollten in einer fĂŒr Ihr System akzeptablen Zeit gestartet und ausgefĂŒhrt werden. Daher wurde ein tĂ€glicher nĂ€chtlicher Start organisiert, nach dessen Ergebnis ein Bericht ĂŒber die Ergebnisse erstellt und an das gesamte Entwicklungsteam ĂŒber die Unternehmens-E-Mail versendet wird. Nach der Wiederherstellung alter automatischer Tests und der Erstellung neuer hatte die Gesamtdauer 30 Minuten betragen. Diese Leistung war fĂŒr alle akzeptabel, da der Start außerhalb der Arbeitszeiten stattfand.

    Aber die Optimierung der Geschwindigkeit erforderte einige Arbeit. Das Update des LoyalitĂ€tssystems im Produktionsumfeld erfolgt nachts. Im Rahmen eines der Releases mussten wir nachts kurzfristig Änderungen vornehmen. Eine halbe Stunde Warten auf die Ergebnisse der automatisierten Tests um drei Uhr morgens machte die verantwortliche Person fĂŒr das Release nicht glĂŒcklich (liebe GrĂŒĂŸe an Alexey Vasyukov!), und am nĂ€chsten Morgen wurden viele warme Worte in Richtung unseres Systems ausgesprochen. Letztendlich wurde eine Norm von fĂŒnf Minuten fĂŒr die Bearbeitung festgelegt.

    Zur Beschleunigung der Leistung haben wir zwei Methoden verwendet: Die automatisierten Tests laufen nun in drei parallelen Streams, was aufgrund der Architektur unseres LoyalitĂ€tssystems sehr praktisch ist. Außerdem haben wir auf den Ansatz verzichtet, dass der automatisierte Test keine Testdaten fĂŒr sich selbst erstellt, sondern versucht, etwas Passendes im System zu finden. Nach den Änderungen wurde die Gesamtdauer auf 3-4 Minuten reduziert.

  7. Das Projekt mit den automatisierten Tests muss auf verschiedenen StĂ€nden einsatzbereit sein. Zu Beginn gab es Versuche, eigene Batch-Skripte zu schreiben, aber es wurde klar, dass die selbstgeschriebene automatisierte Installation ein völliger Albtraum war, und wir wĂ€hlten stattdessen industrielle Lösungen. Da im Projekt sehr viel direkt Code vorhanden ist (vor allem speichern wir den Code der automatisierten Tests) und nur sehr wenige Daten vorhanden sind (die Hauptdaten sind Metadaten ĂŒber die automatisierten Tests), erwies sich die Implementierung von Liquibase im Projekt als sehr einfach.

    Dies ist eine datenbankunabhĂ€ngige Open-Source-Bibliothek zum Verfolgen, Verwalten und Anwenden von Änderungen am Datenbankschema. Sie wird ĂŒber die Kommandozeile oder Frameworks wie Apache Maven verwaltet. Das Prinzip von Liquibase ist ziemlich einfach. Wir haben ein nach bestimmten Kriterien organisiertes Projekt, das aus Änderungen oder Skripten besteht, die auf den Zielserver angewendet werden mĂŒssen, sowie Steuerdateien, die definieren, in welcher Reihenfolge und mit welchen Parametern diese Änderungen installiert werden sollen.

    Auf der Ebene der Datenbank wird eine spezielle Tabelle erstellt, in der Liquibase die Änderungsprotokolle speichert. Jede Änderung hat einen berechneten Hash, der jedes Mal zwischen dem Projekt und dem Zustand in der Datenbank verglichen wird. Dank Liquibase können wir Änderungen an unserem System problemlos in jede Umgebung ĂŒbernehmen. Die automatisierten Tests werden derzeit in Test- und Release-Umgebungen sowie in Containern (persönliche Entwicklungsumgebungen) gestartet.

Unit-Tests in DBMS – wie wir das im Sportmaster machen, Teil zwei

Lassen Sie uns also ĂŒber die Ergebnisse der Anwendung unseres Unit-Test-Systems sprechen.

  1. ZunĂ€chst einmal sind wir ĂŒberzeugt, dass wir mit der Entwicklung qualitativ hochwertigerer Software begonnen haben. Die automatisierten Tests werden tĂ€glich durchgefĂŒhrt und finden bei jeder Veröffentlichung Dutzende von Fehlern. Dabei stehen einige dieser Fehler nur indirekt im Zusammenhang mit der FunktionalitĂ€t, die wir tatsĂ€chlich Ă€ndern wollten. Es bestehen große Zweifel, dass diese Fehler durch manuelle Tests entdeckt wurden.
  2. Das Team hat das Vertrauen gewonnen, dass spezifische Funktionen korrekt arbeiten
 Dies betrifft insbesondere unsere kritischen Prozesse. Zum Beispiel hatten wir in den letzten sechs Monaten keine Probleme mit der Verteilung von Rabatten und Boni auf Rechnungen, trotz regelmĂ€ĂŸiger Änderungen in jeder Veröffentlichung, wĂ€hrend wir in frĂŒheren ZeitrĂ€umen mit gewissen Fehlern konfrontiert waren.
  3. Es ist uns gelungen, die Anzahl der Testiterations zu reduzieren. Da die automatisierten Tests fĂŒr neue Funktionen geschrieben werden, erhalten die Analysten und gleichzeitig Tester Code von höherer QualitĂ€t, da dieser bereits ĂŒberprĂŒft wurde.
  4. Ein Teil der Entwicklungen im Bereich der automatisierten Tests wird von den Entwicklern genutzt. Zum Beispiel werden Testdaten in Containern mithilfe des Moduls zur Objekterzeugung erstellt.
  5. Es ist wichtig zu erwĂ€hnen, dass sich eine Akzeptanz des automatisierten Testsystems seitens der Entwickler entwickelt hat. Es besteht das VerstĂ€ndnis, dass dies wichtig und nĂŒtzlich ist. Aus eigener Erfahrung kann ich jedoch sagen, dass dies bei weitem nicht so ist. Automatisierte Tests mĂŒssen geschrieben, gewartet und weiterentwickelt werden; die Ergebnisse mĂŒssen analysiert werden, und oft sind diese zeitlichen AufwĂ€nde einfach nicht gerechtfertigt. Es ist viel einfacher, in der Produktion nach Problemen zu suchen. Bei uns stellen sich jedoch die Entwickler in eine Schlange und bitten darum, ihre FunktionalitĂ€t durch automatisierte Tests abdecken zu lassen.

Was kommt als nÀchstes

Unit-Tests in DBMS – wie wir das im Sportmaster machen, Teil zwei

Lassen Sie uns ĂŒber die PlĂ€ne zur Weiterentwicklung des Projekts zur automatisierten Testung sprechen.

NatĂŒrlich kann das Testautomatisierungssystem von Sportmaster, solange es lebt und sich weiterentwickelt, nahezu endlos weiterentwickelt werden. Daher ist die Hauptentwicklungsrichtung die Erweiterung des Testabdeckungsbereichs.

Mit zunehmender Anzahl an Testautomatisierungen wird die Gesamtzeit fĂŒr deren AusfĂŒhrung konstant steigen, und wir werden erneut auf das Thema Performance zurĂŒckkommen mĂŒssen. Wahrscheinlich wird die Lösung in der Erhöhung der Anzahl paralleler Threads liegen.

Aber das sind offensichtliche Entwicklungsmöglichkeiten. Wenn wir ĂŒber etwas weniger Triviales sprechen, heben wir Folgendes hervor:

  1. Zurzeit erfolgt das Management der Testautomatisierungen auf der Ebene der Datenbankverwaltungssysteme, d.h. es sind PL/SQL-Kenntnisse erforderlich, um erfolgreich zu arbeiten. Bei Bedarf kann das Systemmanagement (z.B. das AusfĂŒhren von Tests oder das Erstellen von Metadaten) in ein Administrations-Tool ausgelagert werden, indem man Jenkins oder etwas Ähnliches verwendet.
  2. Alle lieben quantitative und qualitative Kennzahlen. FĂŒr automatisierte Tests ist eine solche universelle Kennzahl die Code Coverage oder die Metrik der Codeabdeckung. Mithilfe dieser Kennzahl können wir bestimmen, welcher Prozentsatz des Codes unseres zu testenden Systems durch Testautomatisierungen abgedeckt wird. Seit Version 12.2 bietet Oracle Möglichkeiten zur Berechnung dieser Metrik an und empfiehlt die Verwendung des Standardpakets DBMS_PLSQL_CODE_COVERAGE.

    Unseres Testautomatisierungssystems ist etwas mehr als ein Jahr alt und vielleicht ist jetzt der beste Zeitpunkt fĂŒr eine EinschĂ€tzung der Abdeckung. In meinem vorherigen Projekt (wobei es sich nicht um Sportmaster handelt) war das ebenfalls der Fall. Ein Jahr nach dem Beginn der Arbeit an den Testautomatisierungen gab die GeschĂ€ftsfĂŒhrung den Auftrag, den Prozentsatz des abgedeckten Codes zu bewerten. Bei ĂŒber 1% Abdeckung wĂ€re die GeschĂ€ftsfĂŒhrung zufrieden gewesen. Wir Entwickler erwarteten jedoch ein Ergebnis von etwa 10%. Wir haben die Code Coverage integriert, gemessen und kamen auf 20%. In unserer Freude sind wir zur PrĂ€mie gegangen, aber wie wir das gemacht haben und wohin wir danach gegangen sind, ist eine ganz andere Geschichte.

  3. Testautomatisierungen können die bereitgestellten Webdienste ĂŒberprĂŒfen. Oracle erlaubt dies durchaus, und wir werden nicht mehr mit einer Reihe von Problemen konfrontiert.
  4. Und natĂŒrlich kann unser automatisiertes Testsystem auch in einem anderen Projekt angewendet werden. Die Lösung, die wir gefunden haben, ist universell und erfordert lediglich die Nutzung von Oracle. Ich habe gehört, dass es in anderen Projekten von Sportmaster Interesse an automatisiertem Testen gibt und möglicherweise werden wir dorthin gehen.

Das DBMS Tarantool ist ein attraktives, zukunftstrÀchtiges Produkt zur Erstellung von hochbelasteten Anwendungen.

Lassen Sie uns zusammenfassen. In dem Projekt zur Kundenbindung bei Sportmaster ist es uns gelungen, ein automatisiertes Testsystem zu implementieren. Die Basis dafĂŒr bildet die utPLSQL-Lösung von Steven Feuerstein. Rund um utPLSQL sind der Code der automatisierten Tests und die unterstĂŒtzenden selbstgeschriebenen Module angeordnet: das Startmodul, das Modul zur Datengenerierung und andere. Die automatisierten Tests werden tĂ€glich ausgefĂŒhrt und, was am wichtigsten ist, sie funktionieren und bringen Nutzen. Wir sind ĂŒberzeugt, dass wir begonnen haben, Software von höherer QualitĂ€t zu veröffentlichen. Dabei ist die erhaltene Lösung universell und kann problemlos in jedem Projekt verwendet werden, in dem automatisiertes Testen auf Oracle-Datenbanken benötigt wird.

P.S. Dieser Artikel ist nicht sehr konkret geworden: Es gibt viel Text und praktisch keine technischen Beispiele. Wenn das Thema global interessant ist, sind wir bereit, es fortzusetzen und mit weiteren Informationen zurĂŒckzukehren, in denen wir erlĂ€utern, was sich in den letzten sechs Monaten geĂ€ndert hat und Beispiele fĂŒr Code bringen.

Schreiben Sie Kommentare, wenn es Punkte gibt, die in Zukunft hervorgehoben werden sollten, oder Fragen, die beantwortet werden mĂŒssen.

Nur registrierte Benutzer können an der Umfrage teilnehmen. Bitte einloggen.

Schreiben wir weiter darĂŒber?

  • Ja, natĂŒrlich

  • Nein, danke

12 Benutzer haben abgestimmt. 4 Benutzer haben sich enthalten.

Quelle: habr.com

ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server đŸ”„ ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster