2013年8月5日

【Node.js】MochaでIntegration Testing



今回はMochaを使った、APIのIntegration Testについてです。

アプリを作っていると、APIも見たり書いたり、アップデートしたりするのですが、
アップデートするごとに、他のAPIへ影響していないかをテストします。


Mochaは、JavaScriptのテストフレームワークです。

とりあえずインストールします。
npm install mocha -g

これでmochaコマンドが実行可能です。
次に、APIのテストなので、requestモジュールをインストールしました。
npm install request

requestに、APIの条件に合わせてqsやGET/POSTを変更しつつ、
ひと通りAPIを叩きますが、
まずは、成功するケース、失敗するケース等をひと通り書きだします。

ケースを出し終わったらプログラミングしていきます。
例として、xxxというAPIを叩くテストとしましょう。

var request = require('request')
  , assert = require('assert');

describe('xxx API test', function() {
  before(function(done) {
    // ログインや、テスト前に設定する事
    done();
  });
  after(function(done) {
    // 一連のテスト終了後に行う処理
    done();
  });
  it('ログインのテスト 成功ケース', function(done) {
    request({
      url : 'ログインURL',
      qs : {
        username : '正しいユーザ名',
         password : '正しいパスワード'
      }
    }, function(err, res, body) {
      assert.equal(err, null, 'Request Error ' + JSON.stringify(err));
      assert.equal(res.statusCode, 200, 'HTTP Status Code is not 200:' + res.statusCode);
      assert.notEqual(body, null, 'Body is null');
      var json = JSON.parse(body);
      assert.equal(json.status, 0, 'Status Code is not 0');
      done();
    });
  });
  it('ログインのテスト 不正ユーザ名', function(done) {
    request({
      url : 'ログインURL',
      qs : {
        username : '間違ったユーザ名',
         password : '正しいパスワード'
      }
    }, function(err, res, body) {
      assert.equal(err, null, 'Request Error ' + JSON.stringify(err));
      assert.equal(res.statusCode, 200, 'HTTP Status Code is not 200:' + res.statusCode);
      assert.notEqual(body, null, 'Body is null');
      var json = JSON.parse(body);
      assert.notEqual(json.status, 0, 'Status Code is not 0');
      assert.equal(json.error_message, 'ユーザ名かパスワードが不正です。', 'Error Message is wrong.\n' + body);
      done();
    });
  });
});


テストコードを書いたらこのテストを実行してみます。

mocha test_xxxx.js
それぞれのテストに対して成功・失敗の判定が出ます。
done()へ行くまでのassertが全て成功していれば成功になります。

TAP形式にて出力する場合は
mocha -R tap test_xxxx.js

ちなみに、TAP形式では、なぜかJenkinsでParseErrorになるので、
JUnit形式での出力にしています。

JUnit形式にて出力する場合は
mocha -R xunit test_xxxx.js

複数のファイルをテストする場合には、
mocha -R xunit test_*.js
と実行してやれば、名前順にテストを実行してくれます。