Frage

Ich arbeite an einem Spring MVC-Projekt, und ich habe Unit-Tests für alle der verschiedenen Komponenten im Quellbaum.

Zum Beispiel, wenn ich einen Controller HomeController haben, die eine LoginService hinein injiziert haben muss, dann in meiner Unit-Test HomeControllerTest ich einfach das Objekt als normale instanziiert (außerhalb des Frühlings) und injizieren die Eigenschaft:

protected void setUp() throws Exception {
    super.setUp();
    //...
    controller = new HomeController();
    controller.setLoginService( new SimpleLoginService() );
    //...
}

Dies funktioniert gut für jede Komponente als isolierte Einheit testen - außer jetzt, dass ich ein paar Dutzenden Klassen im Projekt habe, nachdem eine Klasse zu schreiben und einen erfolgreichen Unit-Test für sie zu schreiben, ich vergesse immer wieder meinen Spring MVC Kontext zu aktualisieren Datei, die die tatsächliche Verdrahtungs-up in der entfalteten Anwendung der Fall ist. Ich finde heraus, dass ich vergessen, die Kontext-Datei zu aktualisieren, wenn ich das Projekt auf Tomcat implementieren und eine Reihe von NullPointers von nicht verdrahteten-up Bohnen finden.

So, hier sind meine Fragen:

  1. Dies ist mein erster Frühling Projekt - ist es normal, Unit-Tests für die einzelnen Bohnen zu schaffen, wie ich getan habe, und dann eine zweite Reihe von Tests (Integrationstests) zu schaffen, dass alles zu testen, funktioniert wie erwartet mit der tatsächliche Anwendungskontext? Gibt es eine etablierte Best Practice für das?

  2. Darüber hinaus, wie Sie trennen die Unit-Tests von den Integrationstests? Ich habe alle des Quellcodes in src, die Unit-Tests in test - sollte es einen zweiten Testordner (wie test-integration) sein für die Integration von Testfällen

Da dies mein erstes Frühlings Projekt, ich bin gespannt, wie andere gehen in der Regel über diese Art der Sache zu tun -. Und nicht neu erfinden das Rad, frage ich lieber den Rest der Gemeinschaft

War es hilfreich?

Lösung

ich eine bewährte Methode zu sein, kann nicht sprechen, aber hier ist es, was ich in der Vergangenheit getan haben.

Unit-Tests:

  • Erstellen Sie Unit-Tests für nicht-triviale Bohnen (dh die meisten Ihrer Frühling im Zusammenhang Bohnen)
  • Verwenden Sie Mocks für injizierte Dienste, bei denen praktisch (dh die meisten, wenn nicht die ganze Zeit).
  • Verwenden Sie eine Standard-Namenskonvention für diese Tests im Projekt test Verzeichnis. Mit Test oder TestCase als Präfix oder Suffix an den Klassennamen scheint weit verbreitet zu sein.

Integration Tests:

  • Erstellen Sie eine AbstractIntegrationTestCase, die eine Spring WebApplicationContext für den Einsatz in intetgration Test clases einrichtet.
  • Verwenden Sie eine Namenskonvention für Integrationstests im test Verzeichnis. Ich habe IntTest oder IntegrationTest als Präfix oder Suffix für diese Tests verwendet.

Einrichten von drei Ant test Ziele:

  1. test-alle (oder was auch immer Sie wollen, es nennen): Lauf Einheit und Integration Tests
  2. Test: Führen Sie Unit-Tests (nur weil test scheint die häufigste Verwendung für Unit-Tests zu sein
  3. Test-Integration. Ausführen, um die Integrationstests

Wie bereits erwähnt, können Sie die Namenskonventionen verwenden, die sinnvoll für Ihr Projekt zu machen.

Als Einheit von Integrationstests in ein separates Verzeichnis zu trennen, ich glaube nicht, es wichtig ist, solange die Entwickler und ihre Werkzeuge können sie leicht finden und ausführen.

Als Beispiel das letzte Java Projekt, das ich mit Frühling gearbeitet verwendete genau das, was oben beschrieben ist, mit Integrationstests und Unit-Tests in dem gleichen test Verzeichnis leben. Grails Projekte, andererseits explizit separate Einheit und Integrationstest Verzeichnisse unter einem allgemeinen Testverzeichnis.

Andere Tipps

Ein paar einzelnen Punkte:

Ja, es ist ein gemeinsames Konzept Tests zum Frühling - separaten Unit-Tests und Integrationstests, wo die ehemaligen keine Feder Kontext nicht geladen.

Für Ihre Unit-Tests, sollte vielleicht spöttisch, um sicherzustellen, dass Ihre Tests auf einem isolierten Modul fokussiert sind.

Wenn Sie Tests werden die Verdrahtung in einer Tonne von Abhängigkeiten dann sind sie nicht wirklich Unit-Tests. Sie sind Integrationstests, wo Sie Verdrahtung von Abhängigkeiten sind mit neuen, anstatt Dependency Injection. Eine Verschwendung von Zeit und dupliziert Aufwand, wenn Ihre Produktion Anwendung verwendet Frühling!

Grundintegrationstests Ihre Spring-Kontexte sind nützlich zu bringen.

Die @required Anmerkung können Sie helfen, sicherzustellen, dass Sie erforderliche Abhängigkeiten in Ihrem Frühling Verdrahtung fangen.

Vielleicht Maven schauen, in die Sie explizit Phasen geben Sie Ihre Modul- und Integrationstests zu binden, an. Maven ist ziemlich weit verbreitet in der Frühlings-Community.

Viele der mühsamen Doppelbuchhaltungs mit Feder weggeht, wenn Sie auch auf ein rein kommentierten Regime wechseln, wo Sie alle Ihre Bohnen mit Anmerkungen versehen mit @Component, @Controller, @Service und @Repository. Fügen Sie einfach @Autowired zu den Attributen, die Sie bekommen injizieren müssen.

Abschnitt 3.11 der Feder Referenzhandbuch. http: //static.springframework. org / Frühjahr / docs / 2.5.x / reference / beans.html # Bohnen-Annotation-config

Über einen entsprechenden Hinweis, wir haben die Abteilung Einheit / Integratrion Tests verwenden, die Keng beschreiben. In meinem letzten Regime haben wir führten auch eine dritte „Klasse“ von Tests „ComponentTests“. Diese liefen mit voller Feder Verdrahtung, aber mit verdrahteten Stub-Implementierungen (unter Verwendung von Komponenten-scan-Filter und Annotationen im Frühjahr).

Der Grund, warum wir dies taten, war, weil für einige der „Service“ Ebene, die Sie mit einem horrenden Betrag von Hand codierte Verdrahtungslogik am Ende manuell die Bohne verkabeln, und manchmal lächerliche Beträge von Mock-Objekten. 100 Zeilen Verdrahtung für 5 Zeilen-Test ist nicht ungewöhnlich. Die Komponententests, dieses Problem lindern.

Mit der InitializingBean Schnittstelle (implementiert ein Verfahren „afterPropertiesSet“) oder eine Init-Methode für Ihre Bohnen angeben. InitializingBean ist in der Regel einfacher, weil Sie sich nicht erinnern müssen, um die Init-Methode in Ihre Bohnen hinzuzufügen.

Mit afterPropertiesSet, um sicherzustellen, alles wird als nicht-null injiziert, wenn es null ist, eine Ausnahme aus.

Wenn ich Integrationstests für Web-Anwendungen erstellt habe, habe ich sie in einem separaten Verzeichnis. Sie sind mit eingebauten jUnit oder TestNG und die Interaktion mit dem zu testenden System wie etwas mit Selen , die den Web-Seiten Hits als ob sie die Benutzer. Der Zyklus würde so gehen: kompilieren, führen Sie Unit-Tests, das Web-App entwickeln, einzusetzen, es zu einem laufenden Server, die Tests ausführen, undeploy die App und Ergebnisse berichtet. Die Idee ist, das ganze System zu testen.

Im Hinblick auf die Einheit Lauftests getrennt von Integrationstests, ich habe alle diese in einem Integrationstest und führen Sie sie mit IDE / Ant mit einem Ansatz wie dieses . Funktioniert bei mir.

die Differenz zwischen Unit-Test und Integrationstest ist, ist Unit-Test nicht unbedingt Ihren Kontext laden, die Sie auf den Code konzentrieren, die Sie geschrieben haben - es funktioniert schnell ausfällt, dh mit und ohne Ausnahmen von spöttischen jede Anrufe abhängig drin. Aber im Fall von Integrationstests, laden Sie Kontext und führen Endtest wie tatsächliche Szenarien zu beenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top