REST-Anwendungen testen mit REST-assured

RESTlos glückliches REST-Testen

Oliver B. Fischer


Der Erfolg von REST als Designparadigma für Schnittstellen ist ohne Ajax sowie JSON und die so mögliche Entstehung moderner, hoch interaktiver Webanwendungen nicht denkbar. Abgesehen davon besticht REST durch seine Interoperabilität, lose Kopplung und durch Möglichkeiten zur Performancesteigerung. So etabliert REST zunehmend auch Einsatz zur Entwicklung von Schnittstellen in verteilten Systemen und für öffentliche Web-Service-Schnittstellen.

Softwareentwickler stehen aber damit vor der Aufgabe, REST-Schnittstellen effizient zu testen. Praktisch bedeutet dies, dass wir im Falle einer HTTP-REST-Schnittstelle mit JSON oder XML in der Lage sein müssen, über den kompletten Stack hinweg zu testen. Das schließt das Verhalten der HTTP-Schicht genauso mit ein, wie die Prüfung der gelieferten Daten. REST-Schnittstellen können daher nur richtig in einem Integrationstest geprüft werden.

Das Rüstzeug

Das Rüstzeug für einen solchen Integrationstest stellen zwei Frameworks. Das erste ist das an dieser Stelle schon öfter vorgestellte Arquillian [1], das es erlaubt, automatisierte Tests für Java-EE-Container zu schreiben. Arquillian übernimmt damit den Infrastrukturteil des Integrationstests wie den Start und Stop des Containers, das Deployment der Applikation sowie die Testausführung. Das vom Unternehmen Jayway entwickelte Framework REST-assured [2] ist für die Testlogik verantwortlich (Jayway dürfte einigen auch als Erfinder des Mocking-Frameworks Powermock bekannt sein). REST-assured stellt hierfür ein vom Behavior-driven Development beeinflusstes Fluent-API bereit, über das alle Tests einer REST-Schnittstelle in der Form „Gegeben-Erwarte-Wenn“ formuliert werden können.

Listing 1 zeigt einen minimalen Test, nach dessen Aufbau sich alle weiteren Tests mit REST-assured richten. In diesem Test wird als HTTP-Body "Hi" an den URI http://localhost:8080/helloworld via HTTP-PUT geschickt und als Response mit dem HTTP-Status 200 erwartet.

Listing 1@Testpublic void getToResourceResultsIn200(){ RestAssured.given().body("Hi") .expect().status(200) .when().put("/helloworld");}

Natürlich sind die in der Realität abzubildenden Operationen komplexer als in diesem Beispiel. REST-assured ermöglicht es jedoch, nach diesem Schema beliebig komplexe Anfragen zu stellen und Antworten zu überprüfen. Die nachfolgenden Beispiele beruhen auf einem kleinen, für diesen Artikel entwickelten Showcase, bei dem via REST Nachrichten an einen imaginären Nachrichtendienst übergeben werden, wobei die ...

REST-Anwendungen testen mit REST-assured

RESTlos glückliches REST-Testen

Oliver B. Fischer


Der Erfolg von REST als Designparadigma für Schnittstellen ist ohne Ajax sowie JSON und die so mögliche Entstehung moderner, hoch interaktiver Webanwendungen nicht denkbar. Abgesehen davon besticht REST durch seine Interoperabilität, lose Kopplung und durch Möglichkeiten zur Performancesteigerung. So etabliert REST zunehmend auch Einsatz zur Entwicklung von Schnittstellen in verteilten Systemen und für öffentliche Web-Service-Schnittstellen.

Softwareentwickler stehen aber damit vor der Aufgabe, REST-Schnittstellen effizient zu testen. Praktisch bedeutet dies, dass wir im Falle einer HTTP-REST-Schnittstelle mit JSON oder XML in der Lage sein müssen, über den kompletten Stack hinweg zu testen. Das schließt das Verhalten der HTTP-Schicht genauso mit ein, wie die Prüfung der gelieferten Daten. REST-Schnittstellen können daher nur richtig in einem Integrationstest geprüft werden.

Das Rüstzeug

Das Rüstzeug für einen solchen Integrationstest stellen zwei Frameworks. Das erste ist das an dieser Stelle schon öfter vorgestellte Arquillian [1], das es erlaubt, automatisierte Tests für Java-EE-Container zu schreiben. Arquillian übernimmt damit den Infrastrukturteil des Integrationstests wie den Start und Stop des Containers, das Deployment der Applikation sowie die Testausführung. Das vom Unternehmen Jayway entwickelte Framework REST-assured [2] ist für die Testlogik verantwortlich (Jayway dürfte einigen auch als Erfinder des Mocking-Frameworks Powermock bekannt sein). REST-assured stellt hierfür ein vom Behavior-driven Development beeinflusstes Fluent-API bereit, über das alle Tests einer REST-Schnittstelle in der Form „Gegeben-Erwarte-Wenn“ formuliert werden können.

Listing 1 zeigt einen minimalen Test, nach dessen Aufbau sich alle weiteren Tests mit REST-assured richten. In diesem Test wird als HTTP-Body "Hi" an den URI http://localhost:8080/helloworld via HTTP-PUT geschickt und als Response mit dem HTTP-Status 200 erwartet.

Listing 1@Testpublic void getToResourceResultsIn200(){ RestAssured.given().body("Hi") .expect().status(200) .when().put("/helloworld");}

Natürlich sind die in der Realität abzubildenden Operationen komplexer als in diesem Beispiel. REST-assured ermöglicht es jedoch, nach diesem Schema beliebig komplexe Anfragen zu stellen und Antworten zu überprüfen. Die nachfolgenden Beispiele beruhen auf einem kleinen, für diesen Artikel entwickelten Showcase, bei dem via REST Nachrichten an einen imaginären Nachrichtendienst übergeben werden, wobei die ...

Neugierig geworden?


    
Loading...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang