Ich suche derzeit nach Möglichkeiten, automatisierte Tests für einen JAX-RS- basierten Webdienst (Java API for RESTful Web Services) zu erstellen .
Grundsätzlich brauche ich eine Möglichkeit, um bestimmte Eingaben zu senden und zu überprüfen, ob ich die erwarteten Antworten erhalte. Ich würde dies lieber über JUnit tun, bin mir aber nicht sicher, wie dies erreicht werden kann.
Mit welchem Ansatz testen Sie Ihre Webdienste?
Update: Wie entzik betonte, kann ich durch Entkoppeln des Webdienstes von der Geschäftslogik die Geschäftslogik einem Unit-Test unterziehen. Ich möchte jedoch auch auf die richtigen HTTP-Statuscodes usw. testen.
Antworten:
Jersey wird mit einer großartigen RESTful-Client-API geliefert, die das Schreiben von Komponententests wirklich einfach macht. Siehe die Unit-Tests in den Beispielen, die mit Jersey geliefert werden. Wir verwenden diesen Ansatz, um die REST-Unterstützung in Apache Camel zu testen. Wenn Sie interessiert sind, finden Sie die Testfälle hier
quelle
Sie können REST Assured ausprobieren, wodurch es sehr einfach ist, REST-Services zu testen und die Antwort in Java zu validieren (mit JUnit oder TestNG).
quelle
Wie James sagte; Es gibt ein eingebautes Test-Framework für Jersey. Ein einfaches Beispiel für eine Hallo-Welt kann folgendermaßen aussehen:
pom.xml für die Maven-Integration. Wenn du rennst
mvn test
. Frameworks starten einen Grizzly-Container. Sie können Jetty oder Tomcat verwenden, indem Sie Abhängigkeiten ändern.ExampleApp.java
HelloWorld.java
HelloWorldTest.java
Sie können diese Beispielanwendung überprüfen .
quelle
jersey-hk2
als Abhängigkeit hinzufügen, da einjava.lang.IllegalStateException: InjectionManagerFactory
nicht gefundener Fehler angezeigt wurde (siehe diese Frage ). Ansonsten funktioniert dieses Beispiel gut.Sie haben wahrscheinlich Java-Code geschrieben, der Ihre Geschäftslogik implementiert, und dann den Webdienst-Endpunkt dafür generiert.
Eine wichtige Aufgabe ist es, Ihre Geschäftslogik unabhängig zu testen. Da es sich um reinen Java-Code handelt, können Sie dies mit regelmäßigen JUnit-Tests tun.
Da der Webdienstteil nur ein Endpunkt ist, möchten Sie sicherstellen, dass die generierten Leitungen (Stubs usw.) mit Ihrem Java-Code synchronisiert sind. Sie können dies tun, indem Sie JUnit-Tests schreiben, die die generierten Java-Clients des Webdienstes aufrufen. Auf diese Weise erfahren Sie, wann Sie Ihre Java-Signaturen ändern, ohne die Webdienste zu aktualisieren.
Wenn Ihre Web-Service-Installation bei jedem Build automatisch von Ihrem Build-System generiert wird, müssen die Endpunkte möglicherweise nicht getestet werden (vorausgesetzt, alles wird ordnungsgemäß generiert). Hängt von Ihrer Paranoia ab.
quelle
Obwohl es ab dem Datum der Veröffentlichung der Frage zu spät ist, dachte ich, dass dies für andere nützlich sein könnte, die eine ähnliche Frage haben. Jersey wird mit einem Testframework namens Jersey Test Framework geliefert, mit dem Sie Ihren RESTful-Webdienst einschließlich der Antwortstatuscodes testen können. Sie können es verwenden, um Ihre Tests auf leichten Containern wie Grizzly, HTTPServer und / oder EmbeddedGlassFish auszuführen. Das Framework kann auch verwendet werden, um Ihre Tests auf einem normalen Webcontainer wie GlassFish oder Tomcat auszuführen.
quelle
Ich verwende Apaches HTTPClient (http://hc.apache.org/) , um Restful Services aufzurufen. Mit der HTTP-Client-Bibliothek können Sie auf einfache Weise Abrufen, Veröffentlichen oder andere von Ihnen benötigte Vorgänge ausführen. Wenn Ihr Dienst JAXB für die XML-Bindung verwendet, können Sie einen JAXBContext erstellen, um die Ein- und Ausgaben der HTTP-Anforderung zu serialisieren und zu deserialisieren.
quelle
Schauen Sie sich den Alchemy Rest Client Generator an . Dies kann eine Proxy-Implementierung für Ihre JAX-RS-Webservice-Klasse mithilfe des Jersey-Clients hinter den Kulissen generieren. Tatsächlich werden Sie Webservice-Methoden als einfache Java-Methoden aus Ihren Unit-Tests bezeichnen. Behandelt auch die http-Authentifizierung.
Es ist keine Codegenerierung erforderlich, wenn Sie einfach Tests ausführen müssen, damit dies bequem ist.
Haftungsausschluss: Ich bin der Autor dieser Bibliothek.
quelle
Halte es einfach. Schauen Sie sich https://github.com/valid4j/http-matchers an, die aus Maven Central importiert werden können.
Anwendungsbeispiel:
quelle
Ich würde sicherlich nicht davon ausgehen, dass die Person, die den JAX-RS-Code geschrieben hat und die Schnittstelle einem Unit-Test unterziehen möchte, aus irgendeinem bizarren, unerklärlichen Grund die Vorstellung nicht wahrnimmt, dass sie andere Teile des Programms einem Unit-Test unterziehen kann. einschließlich Geschäftslogikklassen. Es ist kaum hilfreich, das Offensichtliche zu sagen, und es wurde wiederholt darauf hingewiesen, dass auch die Antworten getestet werden müssen.
Sowohl Jersey als auch RESTEasy verfügen über Clientanwendungen, und im Fall von RESTEasy können Sie dieselben Anmerkungen verwenden (sogar die mit Anmerkungen versehene Schnittstelle und die Verwendung auf der Client- und Serverseite Ihrer Tests berücksichtigen).
REST nicht, was dieser Service für Sie tun kann; RESTEN Sie, was Sie für diesen Service tun können.
quelle
Soweit ich weiß, besteht der Hauptzweck des Autors dieses Problems darin, die JAX RS-Schicht von der Business-Schicht zu entkoppeln. Und Unit-Test nur der erste. Zwei grundlegende Probleme müssen wir hier lösen:
Der erste wird mit Arquillian gelöst. Der zweite ist perfekt in Arquillican und Mock beschrieben
Hier ist ein Beispiel für den Code. Er kann abweichen, wenn Sie einen anderen Anwendungsserver verwenden. Ich hoffe jedoch, dass Sie die Grundidee und die Vorteile erhalten.
Ein paar Anmerkungen:
Hoffe, es wird helfen.
quelle