Test-driven JavaScript mit Jasmine
Kommentare

Asynchrone Tests
Durch die asynchrone Natur von JavaScript entstehen häufig Probleme. Variablen besitzen an verschiedenen Zeitpunkten unterschiedliche Werte, und es ist nicht direkt ersichtlich, wovon

Asynchrone Tests

Durch die asynchrone Natur von JavaScript entstehen häufig Probleme. Variablen besitzen an verschiedenen Zeitpunkten unterschiedliche Werte, und es ist nicht direkt ersichtlich, wovon das abhängt. Als Ergebnis von Ajax-Aufrufen oder durch das Eintreten bestimmter Events werden verschiedene Callback-Funktionen ausgeführt, die die Laufzeitumgebung einer Applikation entscheidend beeinflussen. Jasmine bietet hierfür die Möglichkeit, über die Funktionen runs, waits und waitsFor asynchrones Verhalten zu simulieren (Listing 4).

Listing 4
it('should test asynchronous', function() {
    console.log('1');
    runs(function() {
       console.log('2');
    }, 350);
    waits(100);
    runs(function() {
        console.log('4');
    });
    console.log('3');
});

In einem Test werden generell alle Statements außerhalb der runs-Blöcke ausgeführt. Danach werden die runs-Blöcke sequenziell ausgeführt. runs erhält als zweiten Parameter einen Timeout-Wert. Die innerhalb von runs definierte Funktion wird erst nach Ablauf dieser Zeitspanne ausgeführt. Die Funktion waits definiert eine Zeitspanne in Millisekunden, bis der nächste runs-Block ausgeführt wird.

waitsFor schließlich bietet eine weitere Möglichkeit des asynchronen Testens. Die Ausführung von waitsFor gliedert sich in die Reihenfolge der Abarbeitungen der runs-Blöcke ein. Als Parameter erhält sie eine Funktion, die ausgeführt werden soll, eine optionale Nachricht und einen Timeout-Wert. Die Funktion wird so lange ausgeführt, bis sie true zurückliefert oder der Timeout-Wert erreicht ist. In diesem Fall wird die Nachricht ausgegeben (Listing 5).

Listing 5
it('should test asynchronous', function() {
    runs(function() {
        console.log('runs1');
    });
    waitsFor(function() {
        console.log('waitsFor');
    }, 'Timeout reached', 100);
    runs(function() {
        console.log('runs2');
    });
});

Mit Jasmine können nahezu sämtliche Fälle, die innerhalb einer JavaScript-Applikation auftreten, getestet werden. Die Mächtigkeit von Jasmine als Testing-Framework zeigt sich vor allem in der Kombination der einzelnen Features, beispielsweise beim Einsatz von Spies und der Verwendung der asynchronen Ablaufsteuerung.

Neben der eigentlichen Erstellung der Tests im Rahmen von Test-driven Development ist es maßgeblich, diese Tests in einer sehr hohen Frequenz auszuführen. Eine Veränderung im Quellcode sollte einen Lauf der Tests nach sich ziehen. Um das umsetzen zu können, werden vor allem zwei Anforderungen an die Tests und ihre Umgebung gestellt: Die Tests müssen schnell durchlaufen, damit der Entwickler sofort Rückmeldung erhält, ob seine Änderung negative Auswirkungen auf die Anwendung hatte, und der Ablauf der Tests muss ohne größeren Aufwand gestartet werden können. Die Ausführung von Jasmine-Tests ist in verschiedenen Umgebungen möglich. Im Folgenden beschäftigen wir uns mit zwei ausgewählten Umgebungen, und zwar mit der Ausführung im Browser und mit der Integration in WebStorm/PHPStorm.

Ausführung im Browser

Die einfachste Variante, die erstellten Tests auszuführen, ist mithilfe des Webbrowsers. Zu diesem Zweck bringt Jasmine bereits eine vorkonfigurierte Umgebung mit, die sich in der Datei SpecRunner.html befindet und nur noch in Teilen angepasst werden muss, um die individuell erstellten Tests ausführen zu können.

Im ersten Schritt werden drei Dateien eingebunden: zunächst das jasmine.css Stylesheet, das dafür sorgt, dass die Testergebnisse optisch ansprechend präsentiert werden. Außerdem die Datei jasmine.js, die das eigentliche Testframework enthält, und jasmine-html.js, über die die HTML-Reports generiert werden.

Im nächsten Schritt integriert man seine Quell- und Spec-Dateien, die den zu testenden Quellcode beziehungsweise die Tests enthalten. Das ist auch die einzige Stelle, an der ein Eingriff des Programmierers notwendig ist, um die eigenen Tests lauffähig zu machen.

Den Abschluss bildet ein Funktionsblock, der dafür verantwortlich ist, die in den Spec-Files vorhandenen Tests auszuführen und im Anschluss daran einen HTML-Report zu generieren.

Für den Einstieg in Tests mit Jasmine ist die Steuerung der Tests im Browser völlig ausreichend. Auf Dauer ist diese Vorgehensweise jedoch etwas unpraktisch, und es wäre wünschenswert, die Testausführung direkt in die Entwicklungsumgebung zu integrieren, um nicht immer zwischen zwei verschiedenen Applikationen hin- und her zu wechseln, was den Fluss im Test-driven Development Mantra nur unnötig unterbricht.


Themen der letzten Seite:

  • Integration in die IDE
  • Ausblick
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -