プロぽこ

【プログラムの品質向上に!】Mocha を使ってNode.jsのテストを書こう

プログラムの品質を担保するためにはテストが必要不可欠です。テストプログラムがないのにこのプログラムは動くと主張されてもなんの説得力も感じないものです。

Node.jsはサーバーサイドJavascriptとして近年注目を集めている技術の一つです。そんなNode.jsの有名なテストフレームワークとして「Mocha」というものが存在します。

本記事では簡単な例を示しながら実際に「Mocha」の使い方を解説します。是非参考にしていただければ幸いです。

準備

まずテストを行える環境を整える必要があります。「Mocha」はnpmでインストールしましょう。(Nodeが入っている前提で進めますが、Node>jsのバージョンが低い場合はupdateしてから進めることをお勧めします。)

npm install mocha -g

正常にインストールできれば「mocha」コマンドが使えるようになります。「-V」オプションで現在のバージョンを、「-h」オプションで使えるオプションを一覧表示することができます。

npm -V
# 3.2.0

簡単なテストを書いてみる

まず「Hello」という文字列を返すだけの関数を書いてそのテストを書いてみましょう。

exports.hello = function() {
  return "Hello";
}

上記のプログラムをテストするプログラムを書いてみます。テストプログラムのファイル名を好きに決めて良いですが「test.js」としておけば「mocha」と打つだけでテストを実行できるのでここでは「test.js」とします。
describe関数の第1引数にはテスト対象を記述しましょう。その中で個々の関数のテストを記述していきます。個々のテストは「it」関数を使って記述します。
第1引数にはテストの説明を書きましょう。テストの内容が簡潔にわかるように書くと良いでしょう。

var assert = require('assert');
var hello = require('./hello');

describe('Hello', function () {
    it('Hello という文字列が返される', function () {
       let result = hello.hello()
       assert.equal(result, 'Hello');
    });
});

上記のテストを実行してみましょう。「mocha [テストファイル名]」と入力しましょう。「it」関数の第1引数に記述した内容が表示されるはずです。

mocha test.js

Hello
  ? Hello という文字列が返される

1 passing (7ms)

「hello.js」に渡した値をそのまま返す関数を追加してみます。この関数は引数で受け取った値をそのままreturnするものです。

exports.repeat = function(value) {
  return value;
}

次にテストファイルに下記のようなテストプログラムを追加します。「数値」や「文字列」でも渡した値がちゃんと返却されることをテストします。

it('渡した文字列が返される', function () {
   let result1 = hello.repeat(1)
   assert.equal(result1, 1);
   let result2 = hello.repeat("str")
   assert.equal(result2, "str");
});

Node.jsではコールバック関数が数多く登場するのでそのためのテストも書く必要があります。「Mocha」ではそのための仕組みも存在します。

以下のようにコールバック関数を受け取ってその関数に値を渡すようなプログラムを作ってみます。

一応説明しておくと下記の関数の第2引数は関数が渡される想定のものです。この第2引数で渡された関数はこの関数に第1引数で渡された値をさらに引数として受け取って動作します。

exports.callback = function (value, func) {
  func(value);
}

上記のようなプログラムをテストを行う場合コールバックを渡すようなテストを書く必要があります。test.jsに下記のようなテストプログラムを追加してみましょう。

先ほどの「callback」関数の第2引数は関数を受け取る想定で書きました。そのため、そのテストである下記プログラムではその第2引数に関数を渡し、その内部でテストの評価式を書きます。

またコールバック関数のテストをする場合「done」関数を使ってコールバック内部でテストが終了したことを示す必要があります。

it('渡した文字列が返される(コールバック)', function (done) {
   hello.callback(1, function(value) {
     assert.equal(value, 1);
     done();
   });
});

ここまで記述したところでもう一度テストを実行してみます。3つのテストが全て成功したので「3 passing」と表示されます。

mocha test.js

  Hello
    ? Hello という文字列が返される
    ? 渡した文字列が返される
    ? 渡した文字列が返される(コールバック)


  3 passing (8ms)

例外をテストする

次に異常系のテストとして関数に異常なデータが渡ったときに「ちゃんと意図したエラーがでるか」のテストを書いてみましょう。

hello.jsに下記のようなプログラムを追加します。下記のプログラムは「isNaN」関数で数値かどうかをチェックして数値でなければエラーを投げるものです。

exports.get_num = function(number) {
  if (isNaN(number)) {
    throw new Error('数値じゃありません');
  }
  return number;
}

上記のプログラムをテストするプログラムが下記です。確かめる方法は「throws」メソッドを使いましょう。このメソッドはエラーが投げられることを予期したテストを書く場合に使うものです。
functionでくくる必要があることに注意する必要があります。上記のプログラムに文字列を渡すものなのでエラーとなるはずです。

it('数値以外渡されたときにエラーが出る', function () {
   assert.throws(function() {
     hello.get_num("str")
   });
});

テストが通ることを確認しましょう。

mocha test.js


  Hello
    ? Hello という文字列が返される
    ? 渡した文字列が返される
    ? 渡した文字列が返される(コールバック)
    ? 数値以外渡されたときにエラーが出る


  4 passing (8ms)
  

まとめ

この記事では「Mocha」というテストフレームワークを使ってNode.jsのプログラムのテストを書く方法を解説しました。

Node.jsではコールバック関数など、慣れていないと少し複雑な点もありますが、このMochaを使うことで簡単にテストを書くことができます。

しっかりテストを書いてプログラムの品質を高めましょう。