© Excellent backgrounds/Shutterstock.com
Java Magazin
RESTful Services effizient testen

Der REST-Test


Nicht nur durch die Microservices-Bewegung werden RESTful Services immer populärer. Umso wichtiger ist es, sie automatisch zu testen. Leider ist dies häufig ein mühseliges Unterfangen, da man sich dabei um viele Low-Level-Angelegenheiten kümmern muss. Die Gefahr ist groß, dass Tests unleserlich und fragil werden, bis sie schließlich kaum noch zu warten sind. Glücklicherweise existieren Bibliotheken und Best Practices, die zu wartbaren, prägnanten und robusten Tests führen.

Video: REST-Architekturen erstellen und dokumentieren

Als Standardbibliothek für das Testen von RESTful Services hat sich REST-assured [1] durchgesetzt. Es erlaubt mit einem Fluent-API die Definition von Requests und Assertions über die Response. Besonders interessant ist die Verwendung von RequestSpecifications, mit denen sich häufig verwendete Request-Konfigurationen wie Content Type, Basis-URL oder Logging wiederverwenden lassen.

Nehmen wir an, wir wollen einen Service testen, der Informationen über Blogs bereitstellt. Denkbare Ressourcen sind dabei /blogs/ und /blogs/<blogId>. Dann sähe eine Request-Konfiguration wie in Listing 1 aus.

Listing 1: Request-Konfigurationen

private static RequestSpecification spec; @BeforeClass public static void initSpec(){ spec = new RequestSpecBuilder() .setContentType(ContentType.JSON) .setBaseUri("http://localhost:8080/") .addFilter(new ResponseLoggingFilter()) .addFilter(new RequestLoggingFilter()) .build(); } @Test public void statusCode200(){ given().spec(spec).param("limit", 20) .when().get("blogs") .then().statusCode(200); }

Ein häufiges Ärgernis beim Schreiben von Tests für RESTful Services ist das Erstellen des JSON Payloads für den Request oder das Auswerten von JSON in der Response. Schlimmstenfalls werden direkt Strings verkettet oder ausgewertet. Die Verwendung von javax.json.JSONObject ist ebenfalls nicht viel besser, da hierbei der Code schnell aufbläht und immer noch JSON Properties mit Strings adressiert werden müssen. Das ist fummelig und fehleranfällig. Viel besser ist es, POJOs und Object Mapping in den Tests zu verwenden. Für die POJOs empfehlen sich Fluent Setter. Gegenüber normalen Settern ohne Rückgabewert erlauben sie prägnanteren Code und sind trotzdem sehr gut lesbar und weniger fehleranfällig. Dies ist beispielsweise bei Konstruktoren mit vielen Parametern nicht gegeben, da man schnell den Überblick verliert, welches Argument welche Bedeutung hat. So schleichen sich schnell Fehler ein. Angenehm ist, dass wir die Fluent...

Java Magazin
RESTful Services effizient testen

Der REST-Test

Nicht nur durch die Microservices-Bewegung werden RESTful Services immer populärer. Umso wichtiger ist es, sie automatisch zu testen. Leider ist dies häufig ein mühseliges Unterfangen, da man sich dabei um viele Low-Level-Angelegenheiten kümmern muss. Die Gefahr ist groß, dass Tests unleserlich und fragil werden, bis sie schließlich kaum noch zu warten sind. Glücklicherweise existieren Bibliotheken und Best Practices, die zu wartbaren, prägnanten und robusten Tests führen.

Philipp Hauer


Nicht nur durch die Microservices-Bewegung werden RESTful Services immer populärer. Umso wichtiger ist es, sie automatisch zu testen. Leider ist dies häufig ein mühseliges Unterfangen, da man sich dabei um viele Low-Level-Angelegenheiten kümmern muss. Die Gefahr ist groß, dass Tests unleserlich und fragil werden, bis sie schließlich kaum noch zu warten sind. Glücklicherweise existieren Bibliotheken und Best Practices, die zu wartbaren, prägnanten und robusten Tests führen.

Video: REST-Architekturen erstellen und dokumentieren

Als Standardbibliothek für das Testen von RESTful Services hat sich REST-assured [1] durchgesetzt. Es erlaubt mit einem Fluent-API die Definition von Requests und Assertions über die Response. Besonders interessant ist die Verwendung von RequestSpecifications, mit denen sich häufig verwendete Request-Konfigurationen wie Content Type, Basis-URL oder Logging wiederverwenden lassen.

Nehmen wir an, wir wollen einen Service testen, der Informationen über Blogs bereitstellt. Denkbare Ressourcen sind dabei /blogs/ und /blogs/<blogId>. Dann sähe eine Request-Konfiguration wie in Listing 1 aus.

Listing 1: Request-Konfigurationen

private static RequestSpecification spec; @BeforeClass public static void initSpec(){ spec = new RequestSpecBuilder() .setContentType(ContentType.JSON) .setBaseUri("http://localhost:8080/") .addFilter(new ResponseLoggingFilter()) .addFilter(new RequestLoggingFilter()) .build(); } @Test public void statusCode200(){ given().spec(spec).param("limit", 20) .when().get("blogs") .then().statusCode(200); }

Ein häufiges Ärgernis beim Schreiben von Tests für RESTful Services ist das Erstellen des JSON Payloads für den Request oder das Auswerten von JSON in der Response. Schlimmstenfalls werden direkt Strings verkettet oder ausgewertet. Die Verwendung von javax.json.JSONObject ist ebenfalls nicht viel besser, da hierbei der Code schnell aufbläht und immer noch JSON Properties mit Strings adressiert werden müssen. Das ist fummelig und fehleranfällig. Viel besser ist es, POJOs und Object Mapping in den Tests zu verwenden. Für die POJOs empfehlen sich Fluent Setter. Gegenüber normalen Settern ohne Rückgabewert erlauben sie prägnanteren Code und sind trotzdem sehr gut lesbar und weniger fehleranfällig. Dies ist beispielsweise bei Konstruktoren mit vielen Parametern nicht gegeben, da man schnell den Überblick verliert, welches Argument welche Bedeutung hat. So schleichen sich schnell Fehler ein. Angenehm ist, dass wir die Fluent...

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