JavaScript client- und serverseitig testen
Kommentare

Jasmine
Mit Jasmine verlassen wir nun die xUnit-Frameworks und widmen uns einer anderen Art der Softwaretests. Jasmine ist ein Framework für Behavior-driven Development, das den Ansatz verfolgt, die Tests

Jasmine

Mit Jasmine verlassen wir nun die xUnit-Frameworks und widmen uns einer anderen Art der Softwaretests. Jasmine ist ein Framework für Behavior-driven Development, das den Ansatz verfolgt, die Tests verständlicher zu formulieren. Jasmine kann mit seiner einfachen und gut verständlichen Syntax jedoch auch für klassisches Unit Testing von JavaScript-Applikation verwendet werden. Es zählt zu den unabhängigen Frameworks, das bedeutet, dass weder ein zusätzliches JavaScript-Framework noch eine weitere Bibliothek benötigt wird. Wie auch schon die beiden anderen Frameworks, die wir uns bereits angesehen haben, können auch die Jasmine-Tests direkt aus dem Browser heraus ausgeführt werden.

Jasmine ist wie die anderen Testframeworks auch eine Open-Source-Software und wird auf GitHub entwickelt. Der Quellcode ist unter der MIT-Lizenz verfügbar. Die Webseite des Projekts finden Sie unter [4].

Die Installation verläuft ähnlich wie schon bei JsUnit und QUnit: Laden Sie das Standalone-Release herunter und entpacken es, haben Sie bereits eine voll funktionsfähige Installation von Jasmine. Der Einstiegspunkt besteht aus der Datei SpecRunner.html. Öffnen Sie diese in Ihrem Browser, werden die vordefinierten Tests ausgeführt. Sie können im nächsten Schritt sowohl die Tests als auch den Quellcode durch Ihre eigene Applikation und die entsprechenden Tests ersetzen und können Jasmine verwenden. In der SpecRunner.html-Datei wird das Jasmine-Style-Sheet eingebunden, außerdem der Quellcode von Jasmine selbst und eine Datei, die dafür sorgt, dass die Ausgabe im HTML-Format erfolgt. Für die Ausführung der Tests selbst sorgt ein Codeblock, der ebenfalls Bestandteil der mitgelieferten SpecRunner-Datei ist.

Bei der Formulierung von Tests mit Jasmine können Sie ebenfalls auf eine Reihe von Assertions zurückgreifen. In Jasmine werden sie als Matcher bezeichnet. Ein Test beginnt nach dem Aufbau der Umgebung und der Durchführung der Aktion stets mit dem Aufruf der expect-Funktion. Diese erhält den Wert, der geprüft werden soll, als Parameter. Auf dem Rückgabewert der expect-Funktion können Sie dann den Matcher aufrufen. Der Test selbst wird durch einen Aufruf der it-Funktion von Jasmine definiert. Dieser Funktion werden zwei Parameter mitgegeben. Der erste ist die Beschreibung des Tests und der zweite ist eine Callback-Funktion, die den Test enthält. Die Tests werden in Testsuites gruppiert. Der erste Parameter, die Beschreibung, wird nach dem Durchlauf der Tests mit den Ergebnissen angezeigt, damit der Test bei einem eventuellen Fehlschlag zugeordnet werden kann. Eine Testsuite kann dabei einen oder mehrere Tests beinhalten. Eine Testsuite wird durch einen Aufruf der describe-Funktion erstellt. Die Zeichenkette, die als Erstes an die Funktion übergeben wird, beschreibt die Gruppe der Tests, die in der Testsuite enthalten sind. Als Zweites wird ein Callback übergeben, der die einzelnen Aufrufe der it-Funktion enthält. Analog zu den setup– und teardown-Funktionen von JsUnit und QUnit existieren in Jasmine die Funktionen beforeEach und afterEach. Sie werden aufgerufen, um die Umgebung für die Tests bereitzustellen oder nach den Tests aufzuräumen. Beiden Funktionsaufrufen werden Funktionen übergeben, die vor beziehungsweise nach jedem Test ausgeführt werden.

Mit Tabelle 3 erhalten Sie einen Überblick über einen Teil der verfügbaren Matcher von JavaScript. Die Matcher können negiert werden, indem zwischen dem Aufruf von expect und dem eigentlichen Matcher ein .not gestellt wird, also expect(x).not.toBe(y). Mit Jasmine haben Sie die Möglichkeit, die Palette der existierenden Matcher um Ihre eigenen Matcher zu erweitern. Das bietet sich vor allem an, wenn Sie in Ihren Tests häufig spezielle Sachverhalte prüfen müssen, für die entweder eine Helper-Funktion definiert werden muss oder die nur sehr aufwändig geprüft werden können.

Abb. 3: Ausgabe von Unit Tests unter Jasmine

Wie auch schon bei QUnit geht der Funktionsumfang von Jasmine weit über die reinen Assertions hinaus. Ihnen als Entwickler stehen mit den so genannten „Spies“ Wrapper-Funktionen zur Verfügung, mit denen Sie die Verwendung bestimmter Funktionen innerhalb Ihres Tests überwachen und wiederum Assertions auf die Spies durchführen können. Spies dienen jedoch nicht nur der Überwachung, sondern können auch dazu verwendet werden, das Verhalten einer Funktion aktiv zu verändern. So können Sie mit der andReturn-Methode eines Spy-Objekts bestimmen, welchen Wert ein Aufruf auf die Funktion zurückgeben soll, über der der Spy liegt.

Mit der Methode jasmine.Clock.useMock erhalten Sie außerdem die Kontrolle über die Zeit innerhalb Ihrer Tests. Mit dem Aufruf dieser Methode vergeht innerhalb Ihres Tests keine Zeit, wenn Sie die Funktionen setTimeout und setInterval verwenden. Sie können jasmine.Clock.tick verwenden, um die Uhr in Ihren Tests weiterzudrehen. Zu diesem Zweck geben Sie der Methode die Anzahl an Millisekunden mit, die ablaufen sollen.

Mit einer Kombination der Funktionen run und waitFor erhalten Sie die Möglichkeit, innerhalb Ihrer Tests auch asynchrone Funktionen zu testen. Dabei kapseln Sie die zu testende Funktion in einer Callback-Funktion, die an die run-Funktion übergeben wird. Darauf folgt ein Aufruf von waitFor. Dieser erhält ebenfalls eine Callback-Funktion, eine Zeichenkette und einen Time-out-Wert. Die Callback-Funktion wird so oft ausgeführt, bis sie den Wert true zurückgibt oder das Time-out abgelaufen ist. Ist das Time-out erreicht, wird die Zeichenkette als Fehlermeldung ausgegeben.

Durch die gut lesbare Syntax und die umfangreichen Funktionalitäten hat sich Jasmine in letzter Zeit zu einem der beliebtesten Testframeworks im JavaScript-Umfeld entwickelt und wird häufig in Projekten eingesetzt.


Themen der letzten Seite:

  • JsTestDriver
  • Fazit
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -