Node.jsでユニットテスト: 標準モジュール編
node.jsを使ったアプリケーションを書くにあたって、ユニットテストをする方法を勉強しておきたかったので、連休中にちょこっと調査など。
一番手っ取り早くユニットテストをするには、node.jsに標準で付属しているAssertモジュールを使うのが手軽でよいです。今日時点で最新版のドキュメントを読むと分かるとおり、テストのための値の比較メソッドがひととおり用意されているので、これを使ってテストをしていくことになります。node.jsのAssertモジュールは、CommonJSのUnit Testing 1.0に準拠したものみたいですね。
では実際にAssertモジュールを使ってみます。以下のように、まずテスト対象となるモジュール sample.js と、そのユニットテストを実行するための sampe_test.js をそれぞれ用意します。
exports.add = function(a, b) {
return a + b;
};
exports.sub = function(a, b) {
return a - b;
};
// モジュールの読み込み
var assert = require('assert');
var sample = require('./sample');
// モジュールの確認
console.log('Checking module');
assert.ok(sample);
// add()メソッドのテスト
console.log('Testing add() medthod');
assert.equal(sample.add(1, 1), 2);
assert.notEqual(sample.add(1, 1), 1);
assert.equal(sample.add('1', 1), 2);
2つのファイルが用意できたら、下記のようにユニットテストを実行します。これは通常のnode.jsでスクリプトを実行する手順と変わりません。
$ node sample_test.js
Checking module.
Testing add() medthod.
node.js:66
throw e; // process.nextTick error, or 'error' event on first tick
^
AssertionError: 2 == "11"
at Object.<anonymous> (/Users/moto/UnitTest/node/sample_test1.js:13:8)
at Module._compile (node.js:357:32)
at Object..js (node.js:365:14)
at Module.load (node.js:288:27)
at Array.<anonymous> (node.js:379:26)
at EventEmitter._tickCallback (node.js:58:24)
実行すると、最後のassert.equal()の結果が期待した 2 にならずに ’11’ になっており、テストに失敗してしまいました。これは add() メソッドが引数を受け取ってそのまま + 演算子で計算した結果を返していることが原因なので、下記のように整数に変換した上で計算結果を返すように実装を変えて、再度テストを実行します。
exports.add = function(a, b) {
return parseInt(a) + parseInt(b);
};
exports.sub = function(a, b) {
return parseInt(a) - parseInt(b);
};
$ node sample_test.js
Checking module.
Testing add() medthod.
今度はきちんとテストが完了しました。こんな感じで、標準モジュールを利用したユニットテストの流れを知ることができたわけですが、これはちょっとめんどくさい。Perlのモジュールを開発するときみたいに、複数のユニットテストコードをまとめて走らせて、結果がオールグリーンだったら満足、みたいなことをしたいわけです。
そういった仕組みは、調べたところだとユニットテスト用のフレームワークを使えばできるようなので、これからいくつかフレームワークを試してみようと思います。