ちょっと話題の記事

node.jsのいろいろなモジュール22 – mochaでテストを書こう

2013.03.04

この記事は公開されてから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について紹介しました。
このフレームワークは非常に高機能で、紹介した以外にもいろいろな機能を持っています。
詳しくは公式サイトをご確認ください。

参考サイトなど