webentwicklung-frage-antwort-db.com.de

Gibt es ein Dbunit-ähnliches Framework, das nicht nach Java/Scala schreckt?

Ich dachte daran, ein neues, leichtgewichtiges Datenbanksystem zu erstellen. Ich hasse absolut Dbunit. Bevor ich das tue, möchte ich wissen, ob jemand es schon getan hat.

Dinge, die ich an dbunit nicht mag:

1) Das einfachste Format zum Schreiben und Starten ist veraltet. Sie möchten, dass Sie Formate verwenden, die aufgebläht sind. Einige erfordern sogar XML-Schemas. Ja, wie auch immer.

2) Sie füllen Zeilen nicht in der Reihenfolge aus, in der Sie sie schreiben, sondern in der Reihenfolge, in der Tabellen in der XML-Datei definiert sind. Das ist wirklich schlecht, weil Sie Ihre Daten nicht so ordnen können, dass Fremdschlüsseleinschränkungen keine Probleme verursachen. Dies zwingt Sie nur dazu, sie durcheinander zu bringen. 

Dies verschwendet auch Zeit und aufgebläht Ihre junit-Basisklassen mit Code, um die Fremdschlüsseleinschränkungen zu deaktivieren. Möglicherweise müssen Sie den Datenbanktyp (hsqldb usw.) testen und datenbankspezifisch deaktivieren. Das ist so schlimm.

Es könnte besser sein, wenn dbunit dabei geholfen hat, Fremdschlüsseleinschränkungen automatisch als Teil ihres Frameworks zu deaktivieren, dies jedoch nicht. Sie behalten die Dialekte im Auge ... warum also nicht dazu? Letztendlich zwingt dies den Programmierer dazu, Zeit zu verlieren und nicht schnell aufzustehen und zu testen.

3) XML ist schwer zu schreiben. Mehr muss ich dazu nicht sagen. Sie bieten auch so viele Möglichkeiten, dies zu tun, dass es meiner Meinung nach nur kompliziert wird. Bieten Sie einfach einen wirklich soliden Weg an und seien Sie damit fertig.

4) Wenn Ihre Daten groß werden, ist es ein königlicher Schmerz, die IDs und ihre konsistenten/korrekten Beziehungen zu verfolgen. 

Wenn Sie einen Monat lang nicht an einem Projekt arbeiten, wie sollten Sie sich dann daran erinnern, dass user_id 1 ein Administrator war, user_id 2 ein geschäftlicher Benutzer war, user_id 3 ein Ingenieur war und user_id 4 etwas anderes war? Wenn Sie zurückgehen, um dies zu überprüfen, verschwenden Sie mehr Zeit. Es sollte einen sinnvollen Weg geben, es anders als eine beliebige Nummer abzurufen.

5) Es ist langsam. Ich habe festgestellt, dass, wenn nicht hsqldb verwendet wird, es schmerzhaft langsam ist. Das muss nicht sein. Es gibt auch zahlreiche Möglichkeiten, seine Konfiguration durcheinander zu bringen, da es nicht einfach ist, "out of the box" zu arbeiten. Es gibt einen Buckel, den Sie durchlaufen müssen, damit es richtig funktioniert. Alles dies ermutigt die Menschen, es nicht zu benutzen oder sauer zu sein, wenn sie damit beginnen.

6) Manche Werte wiederholen sich häufig, mögen Datumsangaben. Es wäre schön, wenn Sie Standardwerte angeben oder sogar den Rahmen automatisch in Standardwerte setzen lassen, auch ohne dass Sie dazu aufgefordert werden. Auf diese Weise können Sie Objekte nur mit den gewünschten Werten erstellen und den Rest deaktivieren. Das schlägt sicher, jeden Winkel und Winkel einer Spalte anzugeben, wenn dies nicht erforderlich ist.

7) Wahrscheinlich ist das Ärgerlichste, dass der erste Eintrag ALLE Werte enthalten muss - auch keine Platzhalter -, oder in zukünftigen Zeilen werden die von Ihnen angegebenen Spalten nicht ausgewählt.

DBunit hat auch keinen sinnvollen Standard, um [NULL] in einen reellen Nullwert zu übersetzen. Sie müssen es manuell hinzufügen. Sag mal, wer hat das nicht mit dbunit gemacht? Jeder hat. Es sollte nicht so sein!

Dies bedeutet, dass Sie bei einem polymorphen Objekt alle Fremdschlüssel für die Verbindungstabellen jeder Unterklasse in der ersten Zeile deklarieren müssen, auch wenn sie null sind. Wenn Sie eine Tabelle für alle Unterklassenmuster erstellen, müssen Sie dennoch alle Felder in der ersten Zeile angeben. Das ist einfach schrecklich.

Gibt es irgendetwas, das mich zufrieden stellt, oder sollte ich der nächste Framework-Entwickler eines viel besseren Datenbank-Testing-Frameworks werden?

59
egervari

Ich kenne keine echte Alternative zu DbUnit und keines der von @Joe genannten Tools ist in meinen Augen:

  • Incanto : Nicht DB-Agnostiker
  • SQLUnit : ein Regressions- und Komponententest-Harness zum Testen gespeicherter Datenbankprozeduren (darum geht es nicht bei DbUnit)
  • Cactus : ein Tool für In-Container-Tests (ich kann nicht erkennen, wo es bei Datenbanken hilft)
  • Liquibase : ein Datenbankmigrationstool (lädt/prüft keine Daten)
  • ORMUnit : kann eine Datenbank initialisieren, aber das ist alles
  • JMock : konkurriert überhaupt nicht mit DbUnit

Ich habe DbUnit jedoch schon mehrmals erfolgreich für kleine und große Projekte verwendet und finde es sehr nützlich, vor allem, wenn ich Unitils und sein DbUnit-Modul verwende. Dies bedeutet nicht, dass es perfekt ist und nicht verbessert werden kann, aber mit anständigen Werkzeugen (entweder nach Maß oder ähnlich wie Unitils) war es eine anständige Erfahrung.

Lassen Sie mich einige Ihrer Punkte beantworten:

1) Das einfachste Format zum Schreiben und Starten ist veraltet. Sie möchten, dass Sie Formate verwenden, die aufgebläht sind. Einige erfordern sogar XML-Schemas. Ja, wie auch immer.

DbUnit unterstützt flaches oder strukturiertes XML, XLS, CSV. Welches revolutionäre Format möchten Sie verwenden? Im Übrigen ist eine DTD oder ein Schema bei der Verwendung von XML nicht zwingend erforderlich. Aber es gibt Ihnen schöne Dinge wie Validierung und Autovervollständigung. Wie ist das schlecht? Und Unitils kann es einfach für Sie generieren, siehe XSD oder DTD der Datenbankstruktur generieren .

Es könnte besser sein, wenn dbunit dabei geholfen hat, Fremdschlüsseleinschränkungen automatisch als Teil ihres Frameworks zu deaktivieren, dies jedoch nicht. Sie behalten die Dialekte im Auge ... warum also nicht dazu? Letztendlich zwingt dies den Programmierer dazu, Zeit zu verlieren und nicht schnell aufzustehen und zu testen.

Sie warten auf Ihren Patch. 

Inzwischen unterstützt Unitils die transparente Handhabung von Einschränkungen, siehe Deaktivieren von Einschränkungen und Aktualisieren von Sequenzen

3) XML ist schwer zu schreiben. Mehr muss ich dazu nicht sagen. Sie bieten auch so viele Möglichkeiten, dies zu tun, dass es meiner Meinung nach nur kompliziert wird. Bieten Sie einfach einen wirklich soliden Weg an und seien Sie damit fertig.

Ich denke, der Schmerz ist subjektiv, aber ich finde ihn nicht schmerzhaft, vor allem, wenn er ein Schema und eine Autovervollständigung verwendet. Was ist die silberne Kugel, die Sie vorschlagen?

4) Wenn Ihre Daten groß werden, ist es ein königlicher Schmerz, die IDs und ihre konsistenten/korrekten Beziehungen zu verfolgen. 

Halten Sie sie klein, das ist ein Wissen Best Practice . Sie gehen gegen eine bekannte Best Practice und beschweren sich dann ... 

Wenn Sie einen Monat lang nicht an einem Projekt arbeiten, wie sollten Sie sich dann daran erinnern, dass user_id 1 ein Administrator war, user_id 2 ein geschäftlicher Benutzer war, user_id 3 ein Ingenieur war und user_id 4 etwas anderes war? Wenn Sie zurückgehen, um dies zu überprüfen, verschwenden Sie mehr Zeit. Es sollte einen sinnvollen Weg geben, es anders als eine beliebige Nummer abzurufen.

Ja, die Taskumschaltung ist kontraproduktiv. Da Sie jedoch mit Daten auf niedriger Ebene arbeiten, müssen Sie wissen, wie diese dargestellt werden. Es gibt keine magische Lösung, es sei denn, Sie verwenden natürlich eine höhere API (dies ist jedoch nicht der Zweck von DbUnit).

5) Es ist langsam. Ich habe festgestellt, dass, wenn nicht hsqldb verwendet wird, es schmerzhaft langsam ist. Das muss nicht sein. Es gibt auch zahlreiche Möglichkeiten, seine Konfiguration durcheinander zu bringen, da es nicht einfach ist, "out of the box" zu arbeiten. Es gibt einen Buckel, den Sie durchlaufen müssen, damit es richtig funktioniert. Alles dies ermutigt die Menschen, es nicht zu benutzen oder sauer zu sein, wenn sie damit beginnen.

Dies ist inhärent für Datenbanken und JDBC, nicht für DbUnit. Verwenden Sie eine schnelle Datenbank wie H2, wenn Sie möchten, dass die Dinge so schnell wie möglich sind.

6) Das Ärgerlichste ist wahrscheinlich, dass der erste Eintrag ALLE Werte enthalten muss - sogar Nullplatzhalter -, oder in zukünftigen Zeilen werden die von Ihnen angegebenen Spalten nicht ausgewählt.

Nicht bei der Verwendung von Unitils, wie in Präsentationen wie Unitils - Home - JavaPolis 2008 oder Einheitstest: unitils & dbmaintain erwähnt. 

Gibt es irgendetwas, das mich zufrieden stellt, oder sollte ich der nächste Framework-Entwickler eines viel besseren Datenbank-Testing-Frameworks werden?

Wenn Sie glauben, dass Sie die Dinge verbessern können, tragen Sie möglicherweise zu bestehenden Lösungen bei. Wenn das nicht möglich ist und Sie glauben, Sie könnten das Testframework für Killer-Datenbanken erstellen, was soll ich sagen, tun Sie es. Vergessen Sie jedoch nicht, dass es einfach ist, zu meckern, und Lösungen mit eigenen Lösungen zu entwickeln, ist weniger der Fall.

96
Pascal Thivent

Als DbUnit-Entwickler bin ich für Kritik dankbar und muss Ihnen teilweise zustimmen. Wir beginnen gerade mit dem Design der nächsten DbUnit-Veröffentlichung und ich möchte Sie einladen, sowohl an der Diskussion als auch an der Entwicklung teilzunehmen.

Ich werde Ihre Punkte nicht beantworten, da Ihre Frage nicht wirklich mit DbUnit zusammenhängt, sondern mit DbUnit-Alternativen. Jedenfalls möchte ich nur hervorheben, dass Punkt 7 vollständig falsch ist: Sie müssen nicht mehr alle Spalten in der ersten Zeile angeben. Diese Funktion wird als Column Sensing bezeichnet. Ich werde Ihnen nicht sagen, warum es nicht standardmäßig aktiviert ist, da Sie sicherlich klug genug sind, es selbst zu verstehen.

Ich werde scaladbtest eingehend untersuchen, in der Hoffnung, dass wir ihre Ideen integrieren können.

26

Angesichts ähnlicher Bedenken bei der Verwendung von DBUnit habe ich Folgendes gefunden: http://dbsetup.ninja-squad.com/index.html , das Bedenken ansprechen kann. Anstatt die Testdaten in separaten Dateien darzustellen, ist der gesamte DB-Inhalt in der Java-Klasse selbst enthalten.

16
blue-sky

Wenn Sie Spring Framework verwenden (oder es zumindest nicht zum Testen verwenden), ist Spring DBUnit derzeit die beste (gewartete) Alternative zu einfachem DBUnit, die ich kenne und verwende. Zitieren ihrer Website:

Spring DBUnit ermöglicht die Integration zwischen den Spring-Tests Framework und das beliebte DBUnit-Projekt. Es ermöglicht Ihnen die Einrichtung und Abreißen von Datenbanktabellen mit einfachen Anmerkungen sowie Prüfen erwarteter Tabelleninhalt nach Abschluss eines Tests.

Spring DBUnit scheint die "etwas offizielle" Spring-Lösung für das Testen von DB-Einheiten (mit DBUnit) zu sein. Zumindest der Autor/Betreuer der Bibliothek, Phil Webb, arbeitet bei SpringSource/Pivotal.

4
Chriki

Ich verwende DBUnit mit ein paar Wrappern, um die rauen Kanten zu glätten. Ein schönes Werkzeug, das die Funktionalität entweder ergänzen oder überlappen kann, ist Jailer . Es kann Teilmengen von Daten aus einer Referenzdatenbank extrahieren und diese als DBUnit-kompatible XML-Dateien oder als "topologisch sortierte DML-Dateien" speichern, die die Fremdschlüsseleinschränkungen berücksichtigen.

3
retronym

Du machst einen hervorragenden Punkt. 

Ich habe in den letzten Jahren für viele Webportale gearbeitet, hauptsächlich mit PHP, gelegentlich auch mit Java.
Und wie Sie verstehe ich das nach all den Jahren nicht, da Frameworks und unaufdringliche Entwickler nicht wissen, wie viel Speicherhandling sich in den letzten zehn Jahren verändert hat ... Es reicht nicht aus, einfach create/insert/zu senden. Anweisungen auf eine Datenbank kürzen! Wenn Sie in großem Umfang arbeiten, setzen Sie am Ende alle Arten von Speicher-Backends ein, die in Ebenen organisiert sind, um heiße Inhalte schnell auszulagern. Außerdem gibt es an der Datenbank das Problem der Datenpartitionierung. Wenn Sie nicht über eine korrekte Fremdschlüssel-Abstraktion verfügen, werden Sie sicherlich verrückt, wenn sich Ihre Speichereinstellungen ändern. Und wenn wir gerade dabei sind: Fixture-Reihenfolge nach Fremdschlüssel-Prioritäten hat viele Fallstricke und ich habe noch keine echte Lösung dafür mit DBUnit gefunden. 

In jedem Fall ist der Punkt, dass nur ein einfacher Datenbankspeicher für unittesting vorhanden ist, nicht ausreichend für komplexe Speicheraufbauten, da sie Probleme in der Live-Umgebung oft nicht reproduzieren und der Aufwand für die Aufrechterhaltung des Problems sehr schwierig ist. 

Ohne sich wie ein Fanboy anhören zu wollen: Ein Ort, an dem die Dinge in Ordnung sind, ist Ruby on Rails. Das hat ein hartnäckiges Modellkonzept, an das sich die Leute tatsächlich zu beteiligen scheinen. Wenn Sie mit PHP zu tun haben, ist Symfony der richtige Ort für Sie. Es ist durch die Standardeinbeziehung von Doctrine begrenzt, ist aber auch ziemlich DB-zentrisch, hat aber saubere Schnittstellen und eine gute Erweiterbarkeit und kopiert das Rails-Befestigungssystem vollständig. Beruflich muss ich mich fürs Erste an homebrew-Lösungen halten, aber sie funktionieren gut.

2
carrion

Ich habe gerade eine Bibliothek namens JDBDT (Java Database Delta Testing) veröffentlicht, die Sie zum Einrichten und Validieren von Datenbanken in Softwaretests verwenden können.

Schauen Sie sich an http://jdbdt.org

Am besten, Eduardo

2
edrdo

Hier ist eine kurze Liste einiger Werkzeuge in dieser Richtung (neben DBunit), die ich besonders mag oder interessant finde. Zumindest können sie etwas Inspiration bieten:

Beachten Sie, dass keine davon in Bezug auf Umfang oder Feature-Sets eine echte Konkurrenz zu DBunit darstellt. Es gibt jedoch einige interessante Ideen, die einen Blick wert sind. Viel Glück!

1
Joseph Weissman

Wir schreiben Daleq als Wrapper um DbUnit, um einige der erwähnten Bedenken auszuräumen. Es ermöglicht das Auffüllen einer Datenbank nur innerhalb Ihres Komponententests, anstatt sich auf das Bearbeiten von XML-Dateien zu verlassen. 

1
Lars

Ich hatte auch ähnliche Probleme mit DBUnit. Speziell für die Verwendung zum Auffüllen lokaler Entwicklungsdaten und Exportieren von Daten aus einer echten Datenbank. Es gab mehrere Fälle, in denen ein Datensatz exportiert wurde, den es dann nicht importieren konnte.

Dies hat mich dazu inspiriert, eine neue Bibliothek dafür zu schreiben: https://github.com/jeffskj/phonydata

Dies verwendet ein grooviges DSL, um die Datensätze zu definieren, was eine sehr kompakte Darstellung der Daten ermöglicht und es möglich macht, coole Dinge wie das Erzeugen von Zufallsdaten zu tun, da es nur grooviger Code ist.

1
Jeff S

Die Situation von DBUnit ist manchmal frustrierend. Ein Teil des Problems wird aus Marc Philipp mit dbunit-datasetbuilder gelöst, insbesondere wenn Sie es mit dem validator kombinieren, der sich noch in einem sehr frühen Stadium befindet. Sie können es in Aktion unter SZE sehen.

Haftungsausschluss: Alle genannten github-Ressourcen werden von mir gepflegt.

0
niels

Ich habe gerade ein grooviges DSL-basiertes Framework namens Pedalloader veröffentlicht, das über github verfügbar ist. Dokumentation hier .

Sie können damit direkt mit der Abstraktion auf JPA-Entitätsebene arbeiten. Da es sich um ein grooviges Skript handelt, können Sie alle groovigen Konstrukte verwenden. 

Um Zeilen in eine Tabelle einzufügen, die von einer JPA-Entität mit dem Namen Student gesichert wird, mit Feldern (nicht Datenbankspalten, sondern zugeordneten Feldern) mit der Bezeichnung id, name und grade, gehen Sie wie folgt vor:

allStudents = table(Student, ['id', 'name', 'grade']) {
    row 1, 'Joe', Grade.A
    rowOfInterest = row 2, 'John', Grade.B
}

Grade ist eine Aufzählung in der Student-Klasse, die der Datenbankspalte zugeordnet ist (möglicherweise mithilfe der Annotation JPA 2.1 @Convert). allStudents ist eine Liste, die die Zeilen enthält, und rowOfInterest ist eine Referenz auf eine bestimmte Zeile. Diese Eigenschaften (allStudents und rowOfInterest) stehen für Ihren Komponententest zur Verfügung.

0
Καrτhικ

Eine Alternative mit Spring -Konfiguration und Specs2 -Testing kann hier gefunden werden.

0
pagoda_5b