最近自分のnode.jsプロジェクトに使ってるテスト方法を紹介します。

[-- more --]

何でテストコードを書くの?

一般的な考え方だと、テストコードを書けば、コードの信頼性が高まります。そして、プログラマーが自分の書いたコードに対して自信を持てるようになります。

もちろん、テストコードではなく、実際アプリを動かしてテストするのも問題ないですが、大きなプロジェクトやチームワークになると、このやり方は特定なコードをテストするのが難しいので、チームワークに参加するなら、テストコードを書くのが必須です。

mocha + should.js + superagent

mocha

mocha は非常に使いやすいJavaScript テストフレームワークです。バックエンドとフロントエンド両方とも使えます。

should.js

should.jsはmochaのプラグインです。should.jsを使えば

user.should.have.key('username');

このようなより自然な英語表現のコードが書けます。

superagent

superagentはhttpリクエストのライブラリです。superagentのAPIを使えば、アプリの動作などのテストコードが書けます。

サンプル

moduleplayerを作成し、player.jsとして保存します。

function Player(name){
	this.name = name;
}

Player.create = function(name) {
	return new Player(name);
}

Player.prototype.sayHello = function(){
	return 'こんにちは、' + this.name + 'です。';
}

module.exports = Player;

では、これからテストコードを書きましょう。

testフォルダを作成して、下記のコードをindex.jsとして保存します。

var should = require('should');
var Player = require('../player.js');

var p;

before(function(){
	p = new Player('ChainZ');
});

describe('Player', function(){
	it('はsayHello()で挨拶できます。', function(){
		p.sayHello().should.exactly('こんにちは、ChainZです。');
	});
});

before()

before(function(){})はすべてのテストを実行する前に実行します。mochaにはこのような便利なhookが他にもあります:

before(function(done) {
  // すべてのテスト実行する前に実行
  // ここで、データベースのクリアなどの初期化処理をすれば良いでしょう
})
after(function(){
  // すべてのテスト終わった後に実行
})
beforeEach(function(){
  // テスト実行する前に実行
})
afterEach(function(){
  // テストのあとに実行
})

describe(description, callback)

descriptionはテストの説明です、普通はテスト対象のmodule名になります。

it(description, callback)

descriptionmoduleの各動作のテスト説明になります。

p.sayHello().should.exactly('こんにちは、ChainZです。');

should.exactly()はメソードが返した値を検証することができます。shouldは期待値を検証するに使うメソードが多数あります、使い方はドキュメントを参考してください:<https://github.com/tj/should.js>

テストを実行

下記のコマンドを叩くと、テストが実行されます。

mocha test/index.js

結果はこうなります。

つまんなかったら、-R nyanオプションをつけると、かわいい結果画面になります。

おまけに、テストコードを1000回実行して、猫を走らせてみました。

	for (var i = 0; i < 1000; i++) {
		it('はsayHello()で挨拶できます。', function(){
			p.sayHello().should.exactly('こんにちは、ChainZです。');
		});
	}