Kurzeinführung in das Testen von Web-Services mit Karate und JUnit

Einführung

Karate ist ein neues Test-Framework, das auf der bekannten Cucumber-Bibliothek basiert und es ermöglicht, mit einer domänenbasierten Sprache (DSL) schnell aussagekräftige Tests für Web-Services zu schreiben.

Dabei bietet Karate einige interessante Features wie z.B. nativen JSON- und XML-Support, wiederverwendbare Script- und Feature-Definitionen, eine integrierte JavaScript-Engine, die es erlaubt, Funktionen in JavaScript zu definieren, Unterstützung für Konfigurationswechsel und Staging, multi-threaded parallele Ausführung von Tests und die Möglichkeit, Java-Klassen auszuführen.

Weitere Features sind auf der GitHub-Seite des Karate-Projekts dokumentiert.

Voraussetzungen

Die folgenden beiden Voraussetzungen sind erforderlich, um die untenstehenden Beispiele ausführen zu können:

Zu testender Service

Wir testen einen Web-Service, der uns eine aktuelle News im JSON-Format in der folgenden Form bereitstellt:

{
  "message": "Wichtige Eilmeldung: Die Sonne scheint!",
  "id": 12345
}

Verfügbar ist dieser Service unter der Adresse http://localhost:3000/news (GET).

Testaufbau

Zunächst fügen wir die Bibliothek für Karate in die Datei pom.xml unseres Maven-Projekts ein:

<dependency>
    <groupId>com.intuit.karate</groupId>
    <artifactId>karate-junit4</artifactId>
    <version>0.4.3</version>
</dependency>

Dann ergänzen wir eine Java-Klasse, damit unsere Tests vom JUnit Runner und damit verbundenen Standard-Werkzeugen wie dem Maven-Surefire-Plugin erkannt werden können:

package feature.news;
 
import org.junit.runner.RunWith;
 
import com.intuit.karate.junit4.Karate;
 
@RunWith(Karate.class)
public class NewsTest {}

Daten wie die Service-Adresse lagern wir in eine JavaScript-Konfigurationsdatei namens karate-config.js aus, damit wir diese für das Staging und die Ausführung auf dem Integrations-Server bequem ändern oder austauschen können:

function() {
  return {
    baseUrl: 'http://localhost:3000'
  }
}

Jetzt können wir unseren Test in einem Feature beschreiben, wir speichern dieses als news.feature ab.

Wir nehmen wir die folgenden Verifizierungen vor:

  • Der HTTP-Statuscode der Antwort ist 200.
  • in der zurückgelieferten JSON-Struktur ist die Nachricht nicht Null.
  • Die ID entspricht einem numerischen Format.

Eine Reihe von vordefinierten Regeln stehen hier bereits zur Verfügung – beispielsweise diese:

  • #ignore – Ignoriert das Feld.
  • #null – Der Wert muss Null betragen.
  • #notnull – Der Wert darf nicht Null betragen.
  • #array – Der Wert muss ein JSON-Array sein.
  • #object – Der Wert muss ein JSON-Object sein.
  • #boolean – Der Wert muss einem Boolschen Wert entsprechen.
  • #number – Der Wert muss in einem numerischen Format entsprechen.
  • #string – Der Wert muss einem textuellen Format entsprechen.
  • #uuid – Der Wert muss dem UUID-Format (Universally Unique Identifier) entsprechen.
  • #regex – Der Wert muss einem regulären Ausdruck entsprechen.

Eine detaillierte Beschreibung der zahlreichen Möglichkeiten der Karate-DSL ist auf dieser GitHub-Seite zu finden.

Feature: Nachrichtenempfang
 
Background:
* url baseUrl
 
Scenario: Empfangen einer einzelnen Nachricht
 
Given path '/news'
When method GET
Then status 200
And match $ == {message:'#notnull', id:'#number'}

Unsere Projektstruktur sieht nun wie folgt aus:

Karate Verzeichnisstruktur

Karate-Verzeichnisstruktur

Testausführung

Die Tests können schließlich wie gewohnt mittels Maven ausgeführt werden:

mvn test

Fazit

Das Karate-Framework ist ein praktisches und hilfreiches Werkzeug zum Testen komplexer Web-Services, das dem Entwickler das Leben leichter macht. Durch gut lesbare Tests erlaubt Karate es, sich auf die Funktionalität zu fokussieren. Und ja, es macht Spaß! 🙂 Hier sind weiterführende Ressourcen: Das Karate-Projekt auf GitHub, Webservices BDD Testing mit Java und Karate.

Ihr Partner für individuelle Software-Projekte

Planen Sie ein konkretes Software-Projekt? Oder gibt es bestimmte Prozesse in Ihrem Unternehmen, die Ihnen schon lange Kopfzerbrechen bereiten? Bremst ein System oder eine Schnittstelle Ihre Mitarbeiter auf der einen oder Ihre Kunden auf der anderen Seite aus? Dann sprechen Sie mit uns darüber! Wir entwickeln seit 1996 Software und freuen uns darauf, gemeinsam eine individuelle Lösung zu erschaffen – bei höchster Qualität und voller Kostenkontrolle.

Was agile Software-Projekte dem Kunden bringen
Individuelle Software-Entwicklung: Workflows, Branching-Modelle und Continuous Delivery
Der Beginn eines Happy Ends: Initialer Anforderungs-Workshop für erfolgreiche Projekte
Individuelle Software-Lösungen für die Versicherungsbranche

Artikel teilen:Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInEmail this to someonePrint this page