Node.jsのテストツールWhiskeyがよさげ

Node.jsのテストツールwhiskeyがよさげなのでメモ。

特徴

  • テストファイルごとにプロセスが分離されている
  • 複数のテストを並列実行できる(--concurrency オプション)
  • テストを実行する前のテスト初期化機能(-ti, --test-init-file オプション)
  • テストタイムアウト(--timeout オプション)
  • setUp/tearDownサポート
  • 色付きの整形されたテストレポート
  • コードカバレッジ(--coverage)
  • グローバルスコープにリークした変数の報告(--scope-leaks)

使い方

example/*のやつを見れば大体わかると思うけど、以下のような感じ。

初期化

example/init.js

var path = require('path');
var fs = require('fs');

var dirPath = path.join(process.cwd(), 'example/test-123456');
exports['init'] = function(callback) {
  fs.mkdir(dirPath, 0655, function(err) {
    callback();
  });
};

以下のように-tiオプションで指定する。

$ whiskey -ti init.js --tests "sometest.js"
setUp/tearDown

xUnit系のテストツールを使ったことがある人にはおなじみのsetUp/tearDownは以下のような感じ。

var n = 0;

exports['setUp'] = function(test, assert) {
  called = true;
  n++;
  test.finish();
};

exports['test_call'] = function(test, assert) {
    n++;
    test.finish();
};

exports['tearDown'] = function(test, assert) {
  assert.ok(called);
  assert.equal(n, 2);
  test.finish();
};
Assertの拡張

Assertに独自のメソッドを追加できます。
以下のように書いた上で、--custom-assert-module で指定すれば定義したメソッドを使用できます。

function assertThrow() {
  throw new Error('Assert thrown');
}

function assertNoop() {
}

exports.assertThrow = assertThrow;
exports.assertNoop = assertNoop;
$ whiskey --tests "sometest.js" --custom-assert-module /path/to/custom-assert-module
テストのスキップ

test.skip()を使用します。

exports['test_skip1'] = function(test, assert) {
  test.skip("some reason blah");
  assert.ok(false);
};

exports['test_skip2'] = function(test, assert) {
  assert.ok(true);

  setTimeout(function() {
    test.skip();
    assert.equal(1, 3);
  }, 10);
};
TAP出力

--test-reporterオプションを使用します。

$ whiskey --tests "sometest.js" --test-reporter tap

ただ残念なのが、TAP出力の際に行頭にスペースが入ってしまっているためにそのままだとproveでうまく扱えません。フィルタをかますなどして行頭のスペースを取り除けば問題ありません。
一応、forkしたリポジトリでは修正してありますが、本家のIssuesに上げておこうと思います。