Unter Quarantäne: Tests isoliert ausführen

the next big thing  –  0 Kommentare

Wie in den Artikeln Unit-Tests mit Node.js und Parametrisierte Unit-Tests beschrieben, kann man mit dem Test-Framework Mocha und der dafür entwickelten Erweiterung cases auf einfache Weise leistungsfähige Tests für Node.js-Anwendungen schreiben, die verschiedene Testfälle abdecken.

Dieser Werkzeugkasten genügt allerdings nicht allen Anforderungen. Gelegentlich besteht nämlich Bedarf, innerhalb eines Tests auf das Dateisystem zuzugreifen. Diesen Zugriff muss man allerdings in einem isolierten Kontext durchführen, um die Wiederholbarkeit des Tests zu gewährleisten.

Das Modul isolated

Abhilfe schafft das Modul isolated, mit dem man einen Test in einem gesonderten Verzeichnis ausführen kann, ohne Dateien von Hand kopieren zu müssen. Um isolated verwenden zu können, muss man es zunächst mit npm in den lokalen Kontext der zu testenden Anwendung installieren:

$ npm install isolated

Danach kann man es durch den Aufruf der require-Funktion in die Datei, welche die Tests enthält, integrieren:

var isolated = require('isolated');

Um einen Test in einem isolierten Verzeichnis auszuführen, muss man zunächst die isolated-Funktion aufrufen, die einen Callback erwartet und diesem den Namen des zu verwendenden Verzeichnisses übergibt:

test('...', function (done) {
isolated(function (err, directory) {
// ...
});
});

Das angegebene Verzeichnis befindet sich innerhalb des System-Verzeichnisses /tmp, trägt aber einen zufälligen Namen. Das Modul isolated kümmert sich nach Abschluss der Tests eigenständig auch um das Entfernen des Verzeichnisses.

Dateien und Verzeichnisse bereitstellen

Im Standardfall erzeugt isolated lediglich ein leeres Verzeichnis. Einige Tests erwarten aber gegebenenfalls vordefinierte Dateien, die man daher vor der Ausführung des Tests in das neu erzeugte Verzeichnis kopieren muss. Zu diesem Zweck kann man der isolated-Funktion als ersten Parameter den Namen der zu kopierenden Datei übergeben, alles Weitere erledigt isolated dann intern:

test('...', function (done) {
isolated('foo.txt', function (err, directory) {
// ...
});
});

Benötigt man für einen Test mehr als eine Datei, kann man alternativ auch ein ganzes Array von Dateien übergeben:

test('...', function (done) {
isolated([ 'foo.txt', 'bar.txt' ], function (err, directory) {
// ...
});
});

Auch die Angabe von Verzeichnisnamen ist möglich, die isolated dann rekursiv mitsamt ihrem Inhalt in das neu erzeugte Verzeichnis kopiert.

tl;dr: Damit Tests wiederholbar sind, muss man sie isoliert ausführen. Das bedeutet, dass man auch Zugriffe auf das Dateisystem isolieren muss. Das Modul isolated stellt hierfür ein hilfreiches Werkzeug zur Verfügung, mit dem man auf einfache Art entsprechende Kontexte erzeugen und initialisieren kann.