2013-09-04 3 views
5

Ich bin auf der Suche nach Ratschlägen, wie jemand eine Feder-Web-Anwendung (mit Ruhezustand) in einer reinen TDD-Mode erstellen würde. Das bedeutet, dass Sie keinen Produktionscode schreiben sollten, ohne vorher einen fehlerhaften Komponententest zu haben.Wie würden Sie sich an TDD-in eine Feder Web-Anwendung

Würden Sie die Erstellung Ihres Anwendungskontexts Unit-Testing testen? Wenn ja, wie würdest du das machen?

Wäre es einfacher, eine Spring-App zu tendern, wenn Sie eine Java-Konfiguration anstatt einer XML- oder Annotation-basierten Konfiguration verwenden?

Antwort

11

Wenn Sie einen Test schreiben, der eine Spring ApplicationContext und eine Datenbank benötigt, dann ist dies ein Integrationstest, kein Komponententest. Die allgemeinen Regeln für Unit-Tests sind:

  • Sie testen eine Sache (dh Methode ruft zu anderen Klassen/Bohnen verpönt sind)
  • Sie haben eine schlanke Setup (dh kein Laden von Testdaten in eine Datenbank, keine Transaktionen, kein großer App Kontext)

Integrationstests, auf der anderen Seite:

  • langsam ist (Datenbankverbindung, Ladetestdaten in der Datenbank, großer Setup Schritt viele bea verdrahten erstellen ns, configure spring, ...)
  • Spröde (wegen der vielen Abhängigkeiten)
  • Wenn sie scheitern, wissen Sie nur, dass es irgendwo in den 500'000 Zeilen Code ausgeführt wurde.

Also für TDD, versuchen Sie Bohnen zu bauen, die Sie ohne Spring erstellen können. Schreiben Sie sie so, dass Sie Hibernate oder eine Datenbank nicht starten müssen. Der Hauptgrund dafür ist, dass TDD die Komponententests jeden Tag Hunderte Male durchführen muss. Wenn sie länger als 10 Sekunden laufen, werden Sie irgendwann das Gefühl haben, dass Sie Ihre Zeit damit verschwenden, auf die Tests zu warten.

Die nächste Frage ist normalerweise, wie Sie auf diese Weise etwas Nützliches testen können. Nun, denken Sie mal so: Hibernate funktioniert. Es hat bereits viele Komponententests. Das Testen des Winterschlafs ist Zeitverschwendung. Sie sollten also eine Schicht in Ihrer Anwendung erstellen, die Hibernate vollständig aus dem Code entfernt.

Anstatt eine FooDao zu verdrahten, verdrahten Sie eine IFooDao, die eine byId() Methode hat und gibt ein POJO zurück. In Komponententests können Sie eine Scheinimplementierung erstellen, die eine einzelne Instanz zurückgibt.

Wenn Sie wissen wollen, ob die echte FooDao funktioniert, schreiben Sie Integrationstests für die, die byId() ein paar Mal aufrufen.

Vermeiden Sie jedoch das "Objekt von DAO holen, Objekt bearbeiten, Objekt mit DAO erneut speichern". Dies sind drei verschiedene Tests (zwei IT, ein UT).

+0

Also schlagen Sie zum Beispiel vor, mit einem Test zu beginnen, der einen Controller testet, der beispielsweise einen anderen Dienst aufruft, diesen anderen Dienst vortäuscht, dann einen neuen Test schreibt, um diesen Dienst zu testen und so weiter, bis Sie hast du dein Ziel erreicht? –

+0

Ja. Einer der wichtigsten Kernwerte von TDD sind "kleine Schritte". Wenn ein Test mehr als 100 Zeilen Code ausführt, ist das kaum ein "kleiner Schritt". –