Test-driven JavaScript mit Jasmine
Kommentare

Die meisten JavaScript-Frameworks wie beispielsweise jQuery oder dojo bringen ihre eigenen Testframeworks mit. Daneben existieren aber auch unabhängige Testframeworks wie Jasmine, mit dem wir uns im Folgenden

Die meisten JavaScript-Frameworks wie beispielsweise jQuery oder dojo bringen ihre eigenen Testframeworks mit. Daneben existieren aber auch unabhängige Testframeworks wie Jasmine, mit dem wir uns im Folgenden eingehender beschäftigen werden.

Jasmine

Jasmine ist ein Testing-Framework für JavaScript. Es kann unabhängig von anderen Frameworks wie jQuery verwendet werden und basiert nicht auf dem DOM. So ist es möglich, Tests sowohl komplett ohne Framework als auch im Zusammenspiel mit jQuery, extJs oder dojo zu erstellen.

Die Besonderheit an Jasmine ist, dass es kein klassisches Unit-Test-Framework wie Qunit oder JSUnit ist, sondern Behavior-driven Development, BDD, unterstützt. Dabei soll das erwartete Verhalten besser und klarer beschrieben werden, damit auch nicht direkt an der Entwicklung beteiligte Personen in der Lage sind, die Tests zu verstehen. Ziel von BDD ist es, die Testfälle verstärkt aus der Sicht des Benutzers und in natürlicher Sprache zu formulieren.

In diesem Artikel gehen wir einen Schritt zurück und verwenden Jasmine beim Test-driven Development. Der Unterschied zwischen den beiden Vorgehensweisen ist, dass Test-driven Development auf einer niedrigeren, technischeren Ebene operiert. Es werden gewisse Vorbedingungen geschaffen, eine Funktion ausgeführt und geprüft, ob das Ergebnis den Erwartungen entspricht. BDD beschreibt die Ausgangssituation, dann die Durchführung und schließlich das Ergebnis ausführlicher und verständlicher.

Allgemeine Vorgehensweise

Im Folgenden sollen der Einsatz von Jasmine und seine Funktionalitäten im Rahmen von Test-driven Development dargestellt werden. Hierzu bedienen wir uns eines sehr einfachen Beispiels: der JavaScript-Klasse Cube, die Möglichkeiten zur Berechnung von Oberfläche und Volumen eines Würfels zur Verfügung stellt. Der erste Schritt beim Test-driven Development ist die Erstellung eines Tests. Ein Testfall wird mithilfe der it-Funktion von Jasmine erstellt. Der erste Parameter ist eine kurze Beschreibung des Tests, die später angezeigt wird und als Referenz für den Test dient. Der zweite Parameter ist eine Funktion, die die eigentliche Testlogik enthält. it steht als Substitut für das zu testende Element. In Jasmine ist das der Name der Testsuite, in der der einzelne Testfall liegt:

it('can calculate its surface', function () {
   ...
});

Die Testfälle werden in so genannten Suites gruppiert. Sie bilden den logischen Ausführungsrahmen und werden mittels der describe-Funktion erstellt. Der erste Parameter ist hier, wie auch bei den Tests, eine Beschreibung. Die sollte einen Hinweis auf die Klasse geben, die durch die Suite getestet wird. Der zweite Parameter ist eine Funktion, in der die einzelnen Tests liegen:

describe('Cube', function() {
    ...
});

Im Report der Tests werden die Beschreibungen dann entsprechend zusammengeführt. In unserem konkreten Fall lautet der Name der Testsuite „Cube“. Darauf folgt dann die Beschreibung der entsprechenden Tätigkeiten in Form der einzelnen Tests wie „can calculate its surface“. Das Ergebnis wäre in diesem Fall „Cube can calculate its surface“ (Abb. 1). Ein Test kann nur innerhalb einer Suite definiert werden. Will man lediglich einen Test definieren, benötigt man auch für diesen eine entsprechende Suite, ansonsten wirft Jasmine eine Exception und die Tests laufen nicht erfolgreich durch.

Abb. 1: Testergebnis

Um die Umgebung für die Tests korrekt zu initialisieren, existiert innerhalb einer Testsuite die Möglichkeit, mittels des beforeEach-Kommandos eine Funktion auszuführen. Gleiches gilt für etwaige Aufräumarbeiten nach jedem Test mit afterEach. Beide Aufrufe erhalten als Parameter eine Funktion. Verändert ein Test die Umgebung und soll diese Änderung nach dem Test wieder rückgängig gemacht werden, kann innerhalb der it-Funktion this.after() verwendet werden, um eine Funktion anzugeben, die nach Ausführung des Tests aufgerufen wird.


Themen der kommenden Seiten:

  • Allgemeine Vorgehensweise
  • Matchers
  • Test-Doubles
  • Asynchrone Tests
  • Ausführung im Browser
  • Integration in die IDE
  • Ausblick
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -