it-swarm.com.de

Unit-Test einer Hibernate-gesteuerten Anwendung?

Dies mag eine naive Frage sein, aber ich bin sowohl für das Junit- als auch für das Hibernate-Framework neu und habe mich gefragt, wie ich eine Anwendung testen kann, die größtenteils in den Ruhezustand versetzt wird, oder ob dies überhaupt erforderlich ist.

Was ist hier die beste Praxis?

BEARBEITEN:
Der Frühling scheint hier der große Vorschlag zu sein. Leider ist das vielleicht zu viel, um es für ein Projekt abzubeißen. Junit, Hibernate und Spring sind allesamt neu für mich, und obwohl es sich um Technologien handelt, die ich mir vorgenommen habe, finde ich es zu überwältigend, sie alle in ein Projekt zu integrieren.

Links zu Tutorials und/oder Buchvorschlägen sind willkommen.

32
James McMahon

Beachten Sie den Unterschied zwischen Komponententests und Integrationstests.

Unit-Tests sollten Code ohne externe Abhängigkeiten testen. Diese Abhängigkeiten werden mithilfe eines Frameworks wie beispielsweise JMock verspottet.

Integrationstests sind ebenfalls wichtig, haben jedoch den großen Nachteil, dass ihre Ausführung lange dauert. Sie können in wenigen Sekunden Tausende von echten Komponententests durchführen, bei Integrationstests ist dies jedoch nicht der Fall.

Abhängig von der Größe Ihres Projekt-/Entwicklungsteams möchten Sie möglicherweise echte Komponententests gegenüber Integrationstests priorisieren. Beide Arten von Tests sind wichtig, aber wenn Sie auf Ressourcen angewiesen sind, ist es möglicherweise besser, mit Unit-Tests zu arbeiten.

Ich habe selbst eine Anwendung geschrieben, mit der das Gerät das Web (mit Spring MVC ist dies einfach) und Service-Layer sowie Domänenobjekte getestet hat. Aber ich habe das DAO alleine gelassen, weil ich keine langsamen Integrationstests schreiben wollte. Wenn ich mehr Mitarbeiter hätte, hätte ich auch Integrationstests absolviert, aber in diesem Fall hätte ich nicht gedacht, dass sich die aufgewendete Zeit lohnen würde.

17
bpapa

Best Practices:

verwenden Sie nach Möglichkeit eine eingebettete Datenbank, um Ihre Tests auszuführen, sodass Sie keine vollständig implementierte relationale Datenbank benötigen, um Ihre Tests auszuführen (lokal oder auf Ihrem Continuous Build-Server, falls vorhanden). Auf diese Weise müssen Sie sich auch (nicht unbedingt) um ein Rollback usw. kümmern. Sie können die Datenbank einfach neu erstellen, wenn Sie dies benötigen. Das Testen mit einer eingebetteten Datenbank testet keine Besonderheiten, die auftreten könnten, wenn Sie Ihre spezifische Produktionsdatenbank verwenden, aber es testet Ihren Code, der ausreichen sollte.

Sie können auch DbUnit , eine Erweiterung von JUnit, verwenden, um die Datenbank einfach mit erwarteten Zeilen zu füllen und in einen bekannten Zustand zu versetzen, bevor Sie Ihre Ruhezustandstests ausführen.

5

Beste Übung? Ich benutze Spring und mache alle meine Tests transaktional. Ich führe den Test durch und setze alle Änderungen zurück, damit ich den Status der Datenbank nicht ändere.

3
duffymo

Ich verwende gerne ein im Speicher befindliches hsqldb zum Testen. Der Prozess für jedes POJO im Ruhezustand ist:

  1. Erstellen Sie das Objekt
  2. Bleib dran bei der DB
  3. Beenden Sie die Sitzung
  4. Hol es dir von der DB
  5. Stellen Sie sicher, dass die Objekte gleich sind.

Für DAOs erstelle und behalte ich genügend Objekte, um die Methoden genau zu testen, führe dann die Tests aus und lösche die Objekte nach Bedarf, um andere Tests nicht zu beeinträchtigen.

2
jon077

Die Quelle für den Ruhezustand enthält viele Komponententests. Ich würde empfehlen, diese durchzuarbeiten und einen ähnlichen Ansatz anzupassen.

Sie können sich auch den CaveatEmptor ansehen, den die Beispielanwendung für das Buch "Java Persistence with Hibernate" entwickelt hat.

2
kamal.gs

Wenn Sie Hibernate für domänenreiche Modelle verwenden, ist das Testen der Domänenlogik durch Unit-Tests so einfach wie das Testen eines POJO, und Hibernate steht Ihnen nicht im Weg. Die einzige Einschränkung ist, dass Sie bei bidirektionalen Zuordnungen das Objekt für Komponententests möglicherweise auf beiden Seiten festlegen müssen.

Integrationstests mit Datenbanken werden im Allgemeinen nicht für einfache Zuordnungen durchgeführt. Dies wird jedoch im Fall von exquisiten Zuordnungen wie der Vererbung einzelner Tabellen usw. empfohlen. Das Einzige, an das Sie sich hier erinnern müssen, ist, dass Sie manchmal explizit in die Datenbank schreiben müssen.

1
Sathish

Schreiben Sie eine einfache Ebene, die Anforderungen an den Ruhezustand weiterleitet. Verwenden Sie dann eine Verspottungsbibliothek wie EasyMock oder JMock , um zu bestätigen, dass Ihr Hibernate-Furnier-Layer von Ihren Anwendungsklassen korrekt aufgerufen wird. Dies ist im teilweise vollständigen JMock-Buch gut beschrieben (scrollen Sie nach unten zum Testgeruch "Alles ist verspottet").

0

Zwei Fälle sind einfach zu testen:

  1. Wenn möglich, führen Sie Ihre verschiedenen Berechnungen und Transformationen in Funktionen durch, die nichts über das Speichern oder Laden von Entitäten wissen. Wenn Sie diese reinen Funktionen machen können, um so besser.

  2. Für Funktionen, die nur in der Datenbank gespeichert werden, ohne dass sie aus der Datenbank gelesen werden, können Sie festlegen, dass sie beim Testen nicht gespeichert werden.

Die einfachste (gröbste) Möglichkeit, # 2 zu tun, besteht darin, der Funktion einen reallyUpdate -Parameter hinzuzufügen und dann jeden "save" -Aufruf mit folgenden Zeichen zu umgeben:

if (reallyUpdate) {
    HibernateUtil.saveOrUpdate(theThing);
}

Für mich waren dies die niedrigsten hängenden Früchte.

0
GlenPeterson

Sicher, Sie würden Ihre Persistenzstufe testen, wenn sie nicht in Hibernate geschrieben wäre, nicht wahr?

Erstellen Sie eine bestimmte Persistenzschnittstelle, die mit Hibernate implementiert wurde, instanziieren Sie einige Beispielobjekte, führen Sie CRUD-Operationen durch und fordern Sie JUnit auf, zu bestätigen, dass die Operationen erfolgreich waren. Wie jede andere Klasse.

0
duffymo

Hier kann Spring helfen.

Es hat ein großartiges Unit-Test-Framework, mit dem Sie CRUD-Operationen testen und dann Änderungen rückgängig machen können - großartig, wenn Sie nicht jedes Mal die Möglichkeit haben, eine Datenbank neu zu laden.

0
Fortyrunner