JavaScript client- und serverseitig testen
Kommentare

JsTestDriver
Das letzte Framework, das wir im Rahmen dieses Artikels betrachten wollen, ist JsTestDriver. Dieses Framework verfolgt einen grundlegend anderen Ansatz als die Frameworks, die wir bisher gesehen

JsTestDriver

Das letzte Framework, das wir im Rahmen dieses Artikels betrachten wollen, ist JsTestDriver. Dieses Framework verfolgt einen grundlegend anderen Ansatz als die Frameworks, die wir bisher gesehen haben. Im Gegensatz zu QUnit und Jasmine, die komplett in JavaScript implementiert sind, wird JsTestDriver in Java entwickelt und daher auch komplett unabhängig von bestehenden JavaScript-Frameworks. Bisher wurden alle Unit Tests im Browser ausgeführt, beim JsTestDriver ist der Prozess hingegen etwas komplizierter. Daraus entstehen für Sie als Entwickler von Unit Tests viele Möglichkeiten, die Ihnen beispielsweise browserübergreifende Tests oder Automatisierung von Tests erlauben. Dazu aber im Verlauf der nächsten Abschnitte mehr.

Das Projekt JsTestDriver wird im Rahmen von code.google.com verwaltet und steht unter [5] in verschiedenen Varianten zum Download bereit. Zum Einstieg sollten Sie die Self-contained executable jar-Datei wählen, da Sie sich in diesem Fall nicht um die Auflösung bestehender Abhängigkeiten kümmern müssen. JsTestDriver ist wie alle bisher vorgestellten Testframeworks ein Open-Source-Projekt und unter der Apache-Lizenz 2.0 verfügbar.

Das grundsätzliche Layout einer Applikation, die mit JsTestDriver getestet werden soll, besteht aus einem Verzeichnis, in dem der Quellcode der Applikation liegt, einem weiteren Verzeichnis, in dem die Dateien liegen, die die Tests enthalten, und einer Konfigurationsdatei, die im YAML-Format verfasst wird.

Ausgeführt werden die Tests von der Kommandozeile des Systems aus. Zu diesem Zweck wird die Konfigurationsdatei vom JsTestDriver eingelesen. Diese gibt an, wo die Tests und auch der Quellcode zu finden sind. Außerdem wird der URL angegeben, über den der JsTestDriver-Server zu erreichen ist. Mit einer vollständigen Konfigurationsdatei können Sie die Serverkomponente mit dem Kommando java -jar JsTestDriver.jar -port 9876 starten. Sobald der Server läuft, können Sie einen Browser starten und sich mit dem Server verbinden. Über den URL http://localhost:9876/capture können Sie den Browser direkt mit dem Server verbinden. Anschließend können Sie die Tests über das Kommando java -jar JsTestDriver-1.3.5.jar –tests all im Verzeichnis, in dem die Konfigurationsdatei liegt, ausführen. Der entscheidende Vorteil dieses Testframeworks besteht darin, dass Sie mit einem Kommando sämtliche mit dem Server verbundene Browser ansprechen und steuern können. Im Gegensatz zu den bisherigen Testframeworks ist es so möglich, die Tests nicht nur in einem Browser auszuführen, sondern in beliebig vielen verschiedenen Browsern parallel.

Der Aufbau der einzelnen Testdateien ist relativ einfach. Jeder Test beginnt mit einem Funktionsaufruf der TestCase-Methode. Diese erhält eine Zeichenkette, die den Namen der Testsuite darstellt. Der Rückgabewert besteht aus einem Objekt, in dessen Prototypen die einzelnen Testmethoden eingehängt werden können. Die Namen der Testmethoden beginnen stets mit dem Präfix test, also beispielsweise testMyTestFunc. Wie bereits aus den übrigen Testframeworks bekannt, stehen Ihnen auch hier die Methoden setUp und tearDown zur Verfügung, über die Sie die Umgebung vor jedem Test vorbereiten beziehungsweise nach jedem Test die Umgebung wieder bereinigen können. Innerhalb der Tests können Sie auf eine Reihe von Assertions zurückgreifen, mit denen Sie die zu prüfenden Sachverhalte testen können. Wie Sie in Tabelle 4 sehen können, stehen Ihnen auch bei Tests mit JsTestDriver ähnliche Assertions zur Verfügung, wie Sie sie bereits aus QUnit und Jasmine kennen.

Abb. 4: Ausgabe von Unit Tests unter JsTestDriver

Zusätzlich zur TestCase-Funktion, mit der Sie Ihre Tests erstellen können, existiert mit AsyncTestCase eine weitere Funktion, mit der Sie Asynchronität innerhalb Ihrer Applikation testen können. Die einzelnen Test-Methoden erhalten zu diesem Zweck ein Queue-Objekt als Argument, dem Sie über die call-Methode Funktionen hinzufügen können, die sequenziell abgearbeitet werden, bis eine Assertion innerhalb der Callback-Funktionen fehlschlägt.

Durch seinen Ansatz, die Tests nicht direkt im Browser auszuführen, sondern über eine Serverkomponente, die in Java verfasst ist und die Ausführung im Browser vom eigentlichen Testablauf zu entkoppeln, bieten sich mit dem JsTestDriver eine Reihe von Möglichkeiten, die Ihnen in den anderen vorgestellten Frameworks nicht zur Verfügung stehen. So existieren beispielsweise für verschiedene Entwicklungsumgebungen wie Eclipse oder WebStorm Plug-ins, über die Sie Ihre Unit Tests direkt aus der IDE heraus ausführen können und nicht erst in einen Browser wechseln müssen. Über das Plug-in können Sie aus Ihrer Entwicklungsumgebung heraus den JsTestDriver-Server starten, per Mausklick verschiedene Browser hochfahren und diese gleichzeitig mit dem Server verbinden. Auf diesen Browsern werden dann die Tests ausgeführt, die sowohl über ein Kontextmenü als auch über ein Tastenkürzel gestartet werden können. Auch die Ausgaben werden Ihnen innerhalb Ihrer Entwicklungsumgebung präsentiert. So erhalten Sie noch direkteres Feedback über den Status Ihrer Tests und müssen nicht für jeden Testlauf in eine andere Applikation wechseln.

Fazit

Alle hier vorgestellten Testframeworks haben ihre Vor- und Nachteile. So haben Sie mit Jasmine ein sehr mächtiges Werkzeug mit der Möglichkeit, Ihre eigenen Assertions zu definieren, mit Spies-Funktionen zu überwachen und sie zu beeinflussen. Der Nachteil von Jasmine ist, dass Sie im Normalfall einen Browser zur Ausführung Ihrer Tests benötigen. Durch die Kombination verschiedener Testframeworks können Sie diese Nachteile allerdings ausgleichen. Für den JsTestDriver existieren beispielsweise verschiedene Plug-ins, mit denen Sie in die Lage versetzt werden, die Infrastruktur, die Ihnen JsTestDriver zur Verfügung stellt, mit anderen Frameworks, wie QUnit oder Jasmine, zu nutzen. Damit können Sie Ihre Tests in der Syntax des jeweiligen Frameworks schreiben, müssen jedoch nicht auf die Integration in Ihrer Entwicklungsumgebung verzichten.

Eine weitere sinnvolle Komponente, die Sie in Ihren Tests verwenden können, ist Sinon.JS, eine unabhängige Bibliothek, die Spies, Stubs und Mocks für Ihre Tests zur Verfügung stellt. Die Funktionalität von Sinon.JS geht weit über die Möglichkeiten hinaus, die die Spies von Jasmine bieten. Unter anderem stellt Sinon.JS auch Objekte zur Verfügung, mit denen Sie AJAX-Calls abfangen und ihr Verhalten anpassen können. So werden Ihre Tests vollständig unabhängig von der Serverkomponente, und Sie können Ihre Tests auch in einer lokalen Umgebung ausführen, ohne sich darum kümmern zu müssen, dass Ihnen ein Server zur Verfügung steht, der die Anfragen eines Tests beantwortet.

Die vorgestellten Features und Konzepte sind nur ein Bruchteil der Möglichkeiten, die Ihnen beim Unit Testing von JavaScript-Applikationen zur Verfügung stehen. Sehen Sie diesen Artikel als einen Einstieg in die Qualitätssicherung, testen Sie verschiedene Frameworks und finden Sie das Set-up, das sich für Ihre Zwecke am besten eignet.

Sebastian Springer arbeitet seit mehreren Jahren beim PHP-Dienstleister Mayflower in München und ist dort derzeit als Projekt-und Teamleiter tätig. Dabei liegt sein Fokus auf der Entwicklung und Qualitätssicherung von dynamischen Webapplikationen mit JavaScript und PHP.
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -