2010-10-14 5 views
23

Ich schreibe gerade eine Java Client Server Anwendung. Also möchte ich zwei Bibliotheken implementieren, eine für den Client und eine für den Server. Die Client Server Kommunikation hat ein sehr striktes Protokoll, das ich mit JUnit testen möchte.HowTo Unit Test Client Server Code

Als Build-Tool im mit Maven und einem Husdon Server für die fortgesetzte Integration.

Eigentlich habe ich keine gute Idee, wie diese Client/Server-Bibliotheken zu testen.

Ich habe folgende Ansätze:

  1. einfach ein Dummy-Client schreiben für den Server zu testen und einen Dummy-Server schreiben Sie den Client zu testen. Nachteile: Leider führt dies zu vielen zusätzlichen Arbeiten. Ich konnte nicht 100% ig sicher sein, dass Client und Server zusammenarbeiten könnten, weil ich nicht sicher bin, ob die Tests vollständig identisch sind.

  2. Schreiben Sie ein separates Testprojekt, das den Client und den Server zusammen testet.
    Nachteile: Die Komponententests gehören nicht zum Projekt selbst, daher wird Hudson sie nicht automatisch ausführen. Jeder, der etwas in einer dieser Bibliotheken ändert, muss die Tests manuell ausführen, um sicherzustellen, dass alles korrekt ist. Außerdem erhalte ich keinen Code Coverage Report.

Gibt es bessere Ansätze, solche Codes zu testen? Vielleicht testen Sie ein Maven Multi Module Project oder so ähnlich.

Ich hoffe, jemand hat eine gute Lösung für dieses Problem.

Danke.

Antwort

2

So endlich die Auflösung war ein Multi-Modul-Projekt, mit einem separaten Testmodul zu bauen, die den Server und die Client-Modul enthalten in husdon großen Werke. Und noch besser in der Eclipse IDE. Danke @ Aaron für den Hinweis

8

Denken Sie an all Ihrem Code als „Eingang zum Ausgang verwandelt“: X -> [A] -> Y

X sind die Daten, die in geht, [A] der Transformator, Y ist der Ausgang. In Ihrem Fall haben Sie diese Einstellung:

[Client] -> X -> [Server] -> Y -> [Client] 

So sind die Unit-Tests funktionieren wie folgt aus:

  1. Sie benötigen einen Test, der den Client-Code läuft X zu erzeugen. Stellen Sie sicher, dass der Code X mit einer Assert tatsächlich produziert. X sollte ein final static String im Code sein.

  2. Verwenden Sie die Konstante X in einem zweiten Test, um den Servercode aufzurufen, der es in Y (eine andere Konstante) umwandelt.

  3. Ein dritte Test stellt sicher, dass der Client-Code die Eingabe Y

Auf diese Weise analysieren kann, können Sie die Tests halten unabhängig und immer noch darauf achten, dass die wichtige Teile arbeiten: Die Schnittstelle zwischen die Komponenten.

+1

Hmm diese Nähte genau die Art und Weise eine separate Einheit Test für den Server zu implementieren und den Kunden . In der Tat wird dies dazu führen, dass Copy die Konstanten in beide Projekte einfügt und so einen "Dummy Client"/"Dummy Server" implementiert. Das ist der erste Ansatz, den ich oben aufgeführt habe. – StaticBR

+0

Warum setzen Sie Client und Server in verschiedene Projekte ein? * verwirrt * Wie auch immer, wenn du das wirklich willst, dann erstelle ein drittes Unit-Test-Projekt, das die anderen beiden importiert, also brauchst du die Konstanten nur einmal. –

+2

Hmm zwei Projekte, weil der Client auf Low-Ressource-Geräte gehen muss. Und das Testprojekt ist der zweite Ansatz, den ich bereits im Voraus aufgeführt habe. Und ich habe auch die Nachteile dieses Ansatzes geschrieben. – StaticBR

0

Sie können jedes Mock-Objekt-Framework verwenden, um Mock-Objekte zu erstellen - Versuchen Sie jmockit.

1

würde Mein Vorschlag zu verwenden, um zwei Teststufen sein:

  1. Für Ihre Client/Server-Projekt, beinhalten einige spöttisch in die Komponententests die Objektschnittstellen, um sicherzustellen, wie erwartet funktioniert.

  2. Nach dem Build muss ein umfangreicherer Integrationstest ausgeführt werden, mit Automatisierung, um den kompilierten Client und Server auf einem oder mehreren Testsystemen zu installieren. Dann können Sie sicherstellen, dass alle Einzelheiten des Protokolls gründlich getestet werden. Lassen Sie dieses Integrationstestprojekt bei jedem erfolgreichen Build des Client/Server-Projekts auslösen. Sie können dafür JUnit verwenden und erhalten weiterhin den konventionellen Bericht von Hudson.

1

Der neueste Ansatz zur Lösung dieses Problems ist die Verwendung von Docker-Containern. Erstellen Sie eine Andockdatei, die ein Basisimage und alle erforderlichen Abhängigkeiten für Ihre Client-Server-Anwendung enthält. Erstellen Sie einen separaten Container für jeden Knotentyp Ihres verteilten Client-Server-Systems und testen Sie alle API/Client-Interaktionen des Zugriffspunktservers mit TestNG oder JUnit. Der beste Teil dieses Ansatzes ist, dass Sie keine Serviceaufrufe verspotten. In den meisten Fällen können Sie alle End-to-End-Client-Server-Interaktionen orchestrieren.

Es gibt ein bisschen Lernkurve in diesem Ansatz beteiligt, aber Docker wird in der Dev-Community besonders beliebt, um dieses Problem zu lösen. Hier

ist ein Beispiel dafür, wie Sie Docker Client api verwenden könnte Docker Bilder in Ihrem JUnit-Test zu ziehen: https://github.com/influxdb/influxdb-java/blob/master/src/test/java/org/influxdb/InfluxDBTest.java