メモ。もうちょっと使いこなしてから加筆したい所。
導入
$ npm install supertest should --save-dev
test/api_test.jsを作成
var request = require('supertest');
describe("hoge",function(){
this.timeout(2000)
var agent = request.agent("http://hogeapp.app/")
it('send api', function (done) {
agent
.get('/debug')
.set('Accept', 'application/json')
.expect(function(res){
res.status.should.equal(404);
}).end(function(err,res){
if(err){
throw err;
}
done();
});
});
})
argent 変数の単位でセッションやクッキーが保持される。
実行時には以下のコマンドを叩く。
$ mocha test/api_test.js --requrie should
レスポンスの検証
expect
に渡すのコールバックの第一引数ではレスポンスオブジェクトが取得できます。
res.status
でステータスコード、res.body
でボディのJSONが取得できます。
ステータスコードの検証
res.status.should.equal(200);
レスポンス型の検証
res.type.should.equal("application/json");
プロパティの存在チェック
res.body.should.hasOwnProperty("status")
プロパティの値チェック
res.body.status.should.equal("OK");
プロパティが配列であることのチェック
res.body.item_list.should.be.Array();
その他shouldの使い方については、
http://shouldjs.github.io/
を参考にすると良いです。
テスト時のデバッグ
テストのコマンドは長くなりがちなのでMakefileなどに記述しておきます。
デバッグのためにnode-inspectorなどを使用するならなおさら。
.PHONY: test
test:
open http://127.0.0.1:8080/?port=5858 &
mocha test/api_test.js --require should --debug-brk
--debug-brk
オプションで最初にブレイクポイントが自動で付与され、カスタムのブレイクポイントを張る猶予が与えられる。
openコマンドを挟んで自動でデバッグ窓が開くようにしておくと便利です。
テスト設計
コード管理
- 設定を注入するモジュール
- APIの発行に関するモジュール
- シナリオのモジュール(正常系・異常系)
APIの発行に関するモジュール
APIの発行に関する処理と、正常系のexpectをモジュールにまとめておく。
シナリオごとにAPIを自由に組み合わせて使用できるので、様々なシナリオの検証を記述する際に苦になりにくい。
- argent は引数で受け取れるようにする。
- APIの発行と、正常系・異常系のexpectは分けておく。
次のシナリオに渡すための、レスポンスの加工とかまでやりだすとめんどいのでシンプルなexpectに留める。
デバッグ時にブレイクポイントを張る事を考えるなら共通のend用クロージャを作っておくのも良い。
複数の箇所にブレイクポイントを張る手間が省けて楽。
課題
- describe/itの明確な粒度設計
- テスト実行の手間。コマンド長い。requireくらいはソースの中で書けない?
- codeception みたいにもうちょっとカジュアルにデバッグしたい。inspectorは便利だけど窓が開くのは面倒に思う。