29.072015

Behaviour-Driven-Development – Teil 3 – BDD in NodeJS mit Vows

Im letzten Artikel zu Behaviour-Driven-Development haben wir 2 Libraries kennengelernt, die BDD in Java unterstützen. Heute möchte ich mich vom eher traditionellen Java wegbewegen und euch ein BDD Testing-Framework für NodeJS vorstellen. Vows ist nicht nur von Grund auf ausgelegt um asynchrone Funktionen, wie sie in NodeJS zum guten Ton gehören, zu testen sondern parallelisiert auch die Testausführung um schneller Feedback zu geben. Natürlich unterstützt Vows BDD-bezogene Syntax. Halten wir uns also nicht länger mit der Einleitung auf und starten gleich durch:

Installation

Die Installation von Vows ist denkbar einfach:

npm install vows

Aufbau von Tests mit Vows

Tests, die in Vows geschrieben sind werden in Testsuites zusammen gefasst, wobei normalerweise eine Testsuite pro Testfile abgelegt wird.

var suite = vows.describe('subject');

suite.addBatch({
  // ...
});

Jede Suite besteht aus einem oder mehreren Batches, die sequentiell, also hintereinander, ausgeführt werden. In jedem Batch wiederum liegt mindestens ein Kontext. Diese werden parallel ausgeführt.

suite.addBatch({
   'Ein Kontext': {
        topic: function () {/* Definition des Themas (asynchron)  */},
        'Ich bin ein Versprechen': function (topic) {
            /* Teste das Ergebnis des Themas */
        }
    },
   'Another context': {}
});

Ein Kontext besteht entweder aus weiteren Unterkontexten oder einem Thema sowie einem oder mehreren Verprechen (Vows). Hierbei gibt das Thema das zu testende Element an und die Versprechen sind einzelne Tests zu dem definierten Thema. Getestet wird via Assertions

Ein einfacher Test könnte jetzt so aussehen:

var assert = require('assert');
[...]
{ topic: 42,
  'muss gleich 42 sein': function (topic) {
    assert.equal (topic, 42);
  }
}

Testen asynchroner Funktionalität

Nun kann das topic nicht nur ein elementarer Datentyp sondern eine Funktion sein. Um beispielsweise zu prüfen, ob eine Datei existiert kann die Funktion `topic`.callback genutzt werden wie im folgenden Beispiel gezeigt:

{ topic: function () {
    fs.stat('~/DATEI', this.callback);
  },
  'existiert': function (err, stat) {
    assert.isNull   (err);        // Er gab keinen Fehler
    assert.isObject (stat);       // Das stat-Objekt existiert
  },
  'ist nicht leer': function (err, stat) {
    assert.isNotZero (stat.size); // Dateigröße > 0 Byte
  }
}

Ebenso werden Event-Emitter out-of-the-box unterstützt.

Unabhängig davon, wie ihr euren Code testet: werft doch mal einen Blick auf Vows als Alternative zu Mocha und Jasmine und wie immer gilt: Probiert öfter mal was neues.