
node.jsのいろいろなモジュール22 – mochaでテストを書こう
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
mochaとは
mocha(モカ)は、javascriptの単体テストでよく使用されているテストフレームワークです。
node.jsやブラウザから実行ですることもできます。また、非同期のテストも可能になってます。
なお、mocha自体はアサーション機能は持っていません。なので、値の検証は標準のassertとかchaiとかshouldを使用します。
TDDやBDDスタイルでテストを記述でき、テスト結果もいろいろな形式で出力できます。
今回はmochaの基本的な使用方法について紹介します。
環境構築方法
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.7.4
 - Node.js : v0.8.15
 - npm : 1.1.66
 
適当なディレクトリを作成し、そこでnpmを使用してmochaをインストールします。
mochaコマンドを使用するので、gオプションつきでインストールしましょう。
% mkdir mocha % cd mocha % npm install -g mocha
テストを書いてみる
モジュールの作成
まずはテスト対象のモジュールを作成しましょう。
シンプルな関数を2つ持つ、myModule.jsファイルを作成します。
なお、greetAsyncはコールバックを受け取る非同期関数になっています。
//myModule.js
exports.greet = function(name) { 
	return "Hello,"+ name; 
}
exports.greetAsync = function(name,callback) {
    var greet = "Hello,"+ name;
    callback(greet);
}
テストモジュールの作成
次にテストモジュールを作成してみます。同じディレクトリにtest.jsを作成しましょう。
describeとitを使用してテストケースを区切ります。テストケース内ではassertモジュールを使用して値の検証をしています。
var assert = require('assert');
var myModule = require('./myModule');
describe('myModule', function () {
    describe('greet', function () {
        it('引数に応じて決まった文字列を返すこと', function () {
            assert.equal(myModule.greet('taro'), 'Hello,taro');
        });
    });
});
テスト実行
テストを実行してみましょう。
mocha <テストモジュール名>でテストが実行されます。
% mocha test.js ․ 1 test complete (1 ms)
非同期のテスト
greetAsync(非同期関数)のテストも追加してみましょう。この関数は、コールバック内でアサーションを行なっています。
describe('myModule', function () {
    describe('greet', function () {
        it('引数に応じて決まった文字列を返すこと', function () {
            assert.equal(myModule.greet('taro'), 'Hello,taro');
        });
    });
    describe('greetAsync', function () {
        it('引数に応じてコールバック内で決まった文字列になること', function (done) {
            myModule.greetAsync('hanako', function (greet) {
                assert.equal(greet, 'Hello,hanako');
                done();
            });
        });
    });
});
最後にdoneという関数を呼び出しています。この関数が呼ばれるまで次のテストは実行されません。
beforeとafter
describe関数やit関数が実行されるごと、または実行された後に特定の処理を行いたいケースがあります。
そのようなときに使用する関数があります。下記定義をtest.jsに追加してみましょう。
var assert = require('assert');
var myModule = require('./myModule');
before(function (done) {
    console.log('[describe]before test')
    done();
});
after(function (done) {
    console.log('[describe]after test')
    done();
});
beforeEach(function (done) {
    console.log('[it]before every test');
    done();
});
afterEach(function (done) {
    console.log('[it]after every test')
    done();
});
・
・
・
beforeは全テスト前、afterは全テスト後、beforeEachはitの前、afterEachはitの後に毎回実行されます。
出力形式
いままでのテスト結果は出力形式(reporter)が非常にシンプルなものでしたが、mochaではいろいろな形式のテスト結果を指定できます、
specというreporterを指定してみましょう。reporterは「-R」か「--reporter」で指定します。
% mocha -R spec test.js
  myModule
    greet
      ✓ 引数に応じて決まった文字列を返すこと
    greetAsync
      ✓ 引数に応じてコールバック内で決まった文字列になること
spec以外にもlist、progress、tap、jsonなど、さまざまなreporterが指定可能です。
ファイルの変更監視
テストの変更を検知して自動で実行する機能もあります。
下記コマンドを入力してください。コンソールに「watching」と表示され、待ち状態になるはずです。
% mocha -w test.js
この状態でtest.jsを変更すると、テストが実行されます。
まとめ
今回は高機能なテストフレームワーク、mochaについて紹介しました。
このフレームワークは非常に高機能で、紹介した以外にもいろいろな機能を持っています。
詳しくは公式サイトをご確認ください。







