REST Tester

REST Tester

Stand: 11/2015
Lesedauer: ca. 4 Minuten

Inhalt:

  • Anforderungen

  • Umsetzung

  • Test-Definition

  • Test-Ergebnis

  • Fazit

Ziel des REST Testers ist die einfache Umsetzung von komplexen und automatisierten Tests serverseitiger REST Schnittstellen.

Die Implementierung des REST Testers ist aus der Not entstanden, serverseitige REST-Schnittstellen während der Entwicklung von Anwendungen automatisiert zu testen. Hierbei sollte das Schreiben und Durchführen der Tests nicht die Entwicklung der Anwendung verlangsamen oder beeinflussen. Nach längerer Recherche wurde kein geeignetes System, welches alle Anforderungen erfüllt, gefunden.

Anforderungen

Die folgenden Anforderungen wurden an das System gestellt:

  • Das Erstellen von Tests muss einfach und schnell möglich sein.

  • Die Tests müssen sehr komplex ausfallen können, um beispielsweise ganze HTML-Seiten als Response auf eine REST-Abfrage testen zu können.

  • Die Tests müssen mit den von mir zum damaligen Zeitpunkt beherrschten Programmiersprachen erstellt werden können.

  • Verschiedene Tests müssen nacheinander durchgeführt und jedes Ergebnis einzeln, sowie ein Gesamtergebnis abgerufen werden können.

  • Tests müssen automatisiert durchgeführt werden können. Dies bedeutet, dass Tests durch Cronjobs oder sonstige Mechanismen getriggert werden können sollen.

  • Die Tests müssen ohne die Installation einer Software auf nahezu beliebigen Systemen durchgeführt werden können.

  • Die Tests sollten in die Anwendung integriert oder als eigenständige Datei/URL neben die Anwendung abgelegt werden können, so dass diese bei der Anwendung während der Entwicklung jederzeit mit enthalten sind.

Um alle Anforderungen zu erfüllen, wurde eine eigene Software zum Testen von REST-Schnittstellen entwickelt.

Umsetzung

Die Umsetzung der Software erfolgte mit JavaScript, da dies den Vorteil hat, dass die Testsoftware und Tests auf Serverseite zur REST-Schnittstelle mit abgelegt, von beliebigen Clients abgerufen und durch diese ausgeführt, die REST-Schnittstelle der Anwendung testen können.

Die Definition der Tests erfolgt hierbei einheitlich über reguläre Ausdrücke (RegEx), die erfüllt oder nicht erfüllt sind. Dies ermöglicht die einfache Erstellung von Tests und die Überprüfung beliebiger Rückgabewerte. Für Tests können beliebig viele reguläre Ausdrücke hinzugefügt werden. Ein automatisches Durchlaufen aller Ausdrücke erfolgt bei einem einmaligen Aufruf des REST-Testers. Zum Aufrufen der REST-Schnittstelle verwendet die Test-Software asynchrones AJAX, was HTTP-Methoden und Parameter einfach an die REST-Schnittstelle überträgt.

Test-Definition

Tests werden in JavaScript mit regulären Ausdrücken, sowie mit Statusinformationen spezifiziert. Hierbei besteht jede Testspezifikation aus drei verschiedenen Teilen:

  1. Definition der regulären Ausdrücke, die erfüllt sein müssen.

  2. Definition der regulären Ausdrücke, die nicht erfüllt sein dürfen.

  3. Parameter der Schnittstelle und erwartete Parameter der Rückgabe.

1. Zu erfüllende Ausdrücke

Zu Beginn werden alle regulären Ausdrücke spezifiziert, die die Antwort erfüllen muss.

messageRegExps.push(/^.{56}/);
messageRegExps.push(/\d/g);
messageRegExps.push(/c.*/g);

In diesem Beispiel muss die Antwort sowohl das <-Zeichen, das 'b'-Zeichen, sowie das 'c'-Zeichen mindestens einmalig enthalten.

2. Nicht zu erfüllende Ausdrücke

Als zweites werden alle regulären Ausdrücke angegeben, die die Antwort nicht erfüllen darf.

messageDontMatchRegExps.push("error");

In diesem Beispiel darf die Antwort nicht den Text "error" enthalten.

3. Parameter

Zum Schluss müssen die Parameter der zu überprüfenden REST-Schnittstelle, sowie die erwarteten Parameter der Antwort angegeben werden. Mit Aufruf dieser Funktion und Übermittlung der benötigten Parameter wird die AJAX-Anfrage durchgeführt und anschließend die Antwort des Servers überprüft.

/**
* This method creates the expected response array and perform the request
* @param method: HTTP-Method
* @param url: URL
* @param parameters: A string with the parameters like "id=4&e=3" OR the payload by POST and PUT like '{"id":5, ...}"
* @param statusCode: The expected HTTP-status-code
* @param statusText: The expected HTTP-status-text
* @param responseType: The expected mime-type
* @param responseURL: The expected request URL (to check, normally you don't need this check)
* @param regExps: An array of regular expressions to check the response body/message/content
* @return The response body/message/content
*/

tester.testCase(
    "GET",
    url+"test/index.htm",
    '',
    200,
    null,
    null,
    null,
    messageRegExps,
    messageDontMatchRegExps
);

In diesem Beispiel wird die REST-Schnittstelle mit der Methode "GET" und der URL url+"/test/index.htm" aufgerufen. Bei der Anfrage werden keine Parameter mit übergeben. Der Status-Code der Antwort vom Server muss 200 betragen, der Status-Text, der Response-Type und die Response-URL sind bei der Antwort in diesem Fall beliebig.

Test-Ergebnis

Mit dem Aufrufen der URL des Tests führt der Browser die Tests selbstständig aus und zeigt dem Benutzer in einer sehr einfach gehaltenen tabellarischen Übersicht alle nötigen Informationen jedes einzelnen Tests. [Abbildung 1]


Abbildung 1: Testergebnis

Fazit

Der selbst entwickelte REST-Tester erfüllt mit einer einfachen und schnellen Erstellung der Testfälle und der einfachen Verwendung alle gestellten Anforderungen. Tests können durch reguläre Ausdrücke sehr einfach, schnell und präzise erstellt und überprüft werden. Umfangreiche Tests können durch eine Vielzahl von Bedingungen abgebildet und automatisiert überprüft werden. Da für den entwickelten REST-Tester keinerlei Software installiert, sondern die JavaScript-Datei lediglich auf den Server zur Anwendung platziert werden muss, kann diese Implementierung für beliebige REST-Schnittstellen sehr einfach eingesetzt werden.