Datenbanken und der CI-Server

8

Ich habe einen CI-Server (Hudson), der fröhlich Unit-Tests erstellt, ausführt und in der Entwicklungsumgebung bereitstellt, aber ich möchte jetzt, dass er die Integrationstests ausführt.

Die Integrationstests treffen auf eine Datenbank und diese Datenbank wird ständig geändert, um die für den betreffenden Test relevanten Daten zu enthalten. Dies führt jedoch zu einem Problem: Wie stelle ich sicher, dass die Datenbank nicht mit Daten für einen Test bespritzt wird und dass diese Daten dann von einem zweiten Projekt überschrieben werden, bevor der erste Testsatz abgeschlossen ist?

Ich verwende derzeit die "Hoffnung" -Methode, die im Moment nicht allzu schlecht funktioniert, aber hauptsächlich aufgrund der Tatsache, dass wir nur eine kleine Anzahl von Integrationstests auf CI eingerichtet haben.

Aus meiner Sicht habe ich folgende Möglichkeiten:


  • Testlokale (im Speicher) Datenbanken Ich bin mir nicht sicher, ob In-Memory-Datenbanken die Unheimlichkeit von Oracles-Triggern und -Paketen usw. bewältigen, und alles andere, was ich nicht für einen lohnenden Test halte.
  • CI Executor-lokale Datenbanken
    Es wäre ein angemessener Arbeitsaufwand erforderlich, um dies einzurichten und auf dem neuesten Stand zu halten, aber trotzig eine Option (der größte Teil der Arbeit ist bereits erledigt, um die aktuelle CI-Datenbank auf dem neuesten Stand zu halten).
  • Einzelner "Integrationstest" -Exekutor
    Wahrscheinlich am einfachsten zu implementieren, würde aber bedeuten, dass die Integrationstests ziemlich weit zurückfallen könnten.
  • Sperren der Datenbank (oder einer Reihe von Tabellen)

Ich bin sicher, ich habe einige Möglichkeiten verpasst (bitte hinzufügen). Wie führen Sie datenbankbasierte Integrationstests auf dem CI-Server durch? Welche Probleme hatten Sie und welche Methode empfehlen Sie? (Hinweis: Während ich Hudson verwende, akzeptiere ich gerne Antworten für jeden CI-Server. Die Ideen sind sicher portabel, auch wenn die Details nicht zutreffen.)

Prost,
     Mlk

mlk
quelle
1
Diese Frage zum Stapelüberlauf kann für Sie hilfreich sein.
Michael K

Antworten:

1

Nur eine Idee, da ich dies noch nie getan habe, aber Sie könnten eine Aufgabe einrichten, um die DDL für das Datenbankschema abzurufen, gegen das Sie testen, und sie entweder im Speicher oder in einer anderen Datenbank neu erstellen. Es sieht so aus, als ob es in Oracle ziemlich einfach ist . Anschließend können Sie die neue Datenbank bei jeder Änderung automatisch generieren.

Es sieht so aus, als hätte Oracle eine In-Memory-Datenbank namens TimesTen . Es könnte sich lohnen, einen Blick darauf zu werfen. Ich würde definitiv die Verwendung einer In-Memory-Datenbank bevorzugen, wenn dies möglich ist, da diese normalerweise schneller als die Festplatte ist.

Michael K.
quelle
Ich habe vor ein paar Jahren In-Memory-DBS ausprobiert, aber ich fand es viel langsamer als die Verwendung einer echten Datenbank (ich bin froh, es noch einmal zu versuchen). Die echte Datenbank existiert mit dem Schema (aber ohne Inhalt). Der In-Memory muss gestartet und das Schema für jeden Test / Testlauf erstellt werden. Ich werde TimeTen ausprobieren und prüfen, ob ich es mit unserem vorhandenen System zum Klonen und Aktualisieren von Datenbanken verknüpfen kann.
mlk
Vielleicht könnten Sie einen Singleton erstellen, der den Verweis auf die Datenbank enthält, und die Tabellen nach jedem Test einfach bereinigen? Ich denke, meine Erfahrung war nicht mit ausreichend großen Datenmengen.
Michael K
Habe Apache Derby dafür benutzt, es funktioniert.
Tim Williscroft
1

Wir führen datenbankbasierte Integrationstests durch, indem wir einen Datenbankserver aufstellen, um mit der CI-Box zu arbeiten und die CI-Instanz zu hosten. Ein bisschen wie, wie Staging und Produktion jeweils einen eigenen Datenbankserver haben.

Wyatt Barnett
quelle
Wie gehen Sie mit Multiplikationstestprojekten um, die zur gleichen Zeit auf dieselbe Datenbank treffen, oder haben Sie eine Datenbank pro Executor?
mlk
2
Jeder erhält seine eigene Datenbank (oder Datenbanken nach Bedarf) in SQL Server-Begriffen, nicht sicher, wie sich dies auf Oracle-Land auswirkt.
Wyatt Barnett
Angenommen, ich lese das richtig, bekommt jeder CI-Executor seine eigene Datenbank? Wie konfigurieren Sie die app.config (/ wie auch immer Ihre Datenbankkonfiguration abgeschlossen ist) für jeden Executor neu?
mlk
1
Auch hier bin ich mir nicht sicher, ob ich Ihre Terminologie hier verstehe, aber für CI richten wir die Box mit denselben Konventionen ein, die wir im Entwicklungsteam verwenden, damit die Dinge einfach einrasten - z. B. verwendet jeder die Datenbank benannt "foo" auf dem SQL Server localhost \ SQLEXPRESS, so dass es einfach funktioniert.
Wyatt Barnett
Ah, Sie führen die Datenbank lokal aus oder ist SQLEXPRESS eine In-Memory-Datenbank? Wenn es lokal ist, beschränken Sie sich auf einen einzelnen Executor pro CI-Instanz.
mlk