JavaScriptテストフレームワークmocha

ChainZ(クリエイター)
いろいろやってます。

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

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

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

mocha + should.js + superagent

mocha

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

should.js

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

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

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

superagent

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

サンプル

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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として保存します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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が他にもあります:

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

describe(description, callback)

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

it(description, callback)

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

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

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

テストを実行

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

1
mocha test/index.js

結果はこうなります。

mochaテスト結果

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

mochaテスト結果 猫バージョン

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

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

mochaテスト結果 猫バージョン