APIのテストにはSuperTestが便利

node.js + expressでのテスト環境を探していて見つかったんだけど、これは便利

概要

色々なhttpリクエスト投げて、結果をMochaで表示できる。

リンク先

Site not found · GitHub Pages
visionmedia.github.io
 

導入

両方共グローバルにしてもいいかも。SuperTestはグローバルにする必要もないかと思ってしてない。

npm install supertest npm install -g mocha

使い方

以下のテストコードを走らせるとhttp://localhost:3000につないでrequest.get()などで接続したホストに対してリクエストを投げて、レスポンスをテストすることができる。

/**
 * テスト雛形
 * hostにつないで、各メソッド事のテストを書く
 * @author sato_shinichiro
 */ 
var request = require('supertest');
var host = 'http://localhost:3000';

describe('テスト種別1', function () {

	before(function() {
		console.log('テスト前に動く');
	});

	after(function() {
		console.log('テスト後に動く');
	});

	it('テストする内容(ステータスエラー)', function (done) {
		var status = 300;
		var res = {
			meta: {
				code: 200,
				message: "ok"
			},
			data: null
		};
		request(host)
			.get('/test')
			.expect(status, res, function(err) {
				console.log('テスト1終了');
				done(err);
			});
	});
	it('テストする内容(レスポンス内容エラー)', function (done) {
		var status = 200;
		var res = {
			meta: {
				code: 300,
				message: "ok"
			},
			data: null
		};
		request(host)
			.get('/test')
			.expect(status, res, function(err) {
				console.log('テスト2終了');
				done(err);
			});
	});
});

describe('テスト種別2', function () {
	it('テストする内容(成功)', function (done) {
		var status = 200;
		var res = {
			meta: {
				code: 200,
				message: "ok"
			},
			data: null
		};
		request(host)
			.get('/test')
			.expect(status, res, function(err) {
				console.log('テスト3終了');
				done(err);
			});
	});
});

テストを走らせるには以下のコマンド。./testにテスト用のjsがいる。mochaはフォルダを指定すると配下のjsファイルを実行してくれる。

mocha test

テスト結果はこんな感じ。

 テスト前に動く
テスト1終了
․テスト2終了
․テスト後に動く
テスト3終了
․

  ✖ 2 of 3 tests failed:

  1) テスト種別1 テストする内容(ステータスエラー):
     Error: expected 300 "Multiple Choices", got 200 "OK"
      stacktrace...

  2) テスト種別1 テストする内容(レスポンス内容エラー):
      
      actual expected
      
      1 | {
      2 |   "meta": {
      3 |     "code": 300200,
      4 |     "message": "ok"
      5 |   },
      6 |   "data": null
      7 | }

      stacktrace...

stacktraceって書いてる部分はパスが書いてあるから削った。本来はちゃんとstacktraceが出る。

もし、サーバを立てずにexpressだけで動かしたかったら以下の様なコードを書いてexportしたappをhostの代わりに指定してあげれば動く

var express = require('express');
var app = express.createServer();
exports.module = app;

まとめ

最初Express用のテストフレームワークかと思ったけど、一般的なサーバのAPIならこれで全て叩いてテストできるんじゃなかろうか。SuperTestは便利。