REST API のテストツール Frisby.js を使ってみた。
導入
npm で Frisby.js を導入する。
jasmine-node は依存パッケージで、config は必須ではないけど本番環境と開発環境の切り替えに使う。
$ npm i -D frisby jasmine-node config
ファイル構成はこんな感じになった。
$ tree
.
├── package.json
├── node_modules
├── config
│ └── test
│ └── api
│ └── v1
│ ├── development.json
│ └── production.json
└── test
└── api
└── v1
├── bar.spec.js
└── foo.spec.js
設定ファイルには、とりあえずAPIのURLだけ追加。
{
"url": "http://api.example.com/v1",
"url-auth": "http://test:password@api.example.com/v1"
}
package.json
にテストを実行するタスクを追加する。
"scripts": {
"test:api:development": "export NODE_ENV=development && export NODE_CONFIG_DIR=./config/test/api/v1 && jasmine-node ./test/api/v1",
"test:api:production": "export NODE_ENV=production && export NODE_CONFIG_DIR=./config/test/api/v1 && jasmine-node ./test/api/v1"
},
テストを実行する。
$ npm run test:api:production
JSON レスポンス 内の型を検証する
例えば以下のようなレスポンスが返るAPIの場合。
{
"id": 1,
"name": "hikarock",
"url": "http://hika69.com"
}
以下の users.spec.js
を用意する。
var frisby = require('frisby');
var config = require('config');
frisby.create('GET:users')
.get(config.get('url') + '/users/hikarock')
.expectStatus(200)
.expectHeaderContains('content-type', 'application/json')
.expectJSONTypes({
id: Number,
name: String,
url: String
})
.toss();
配列の検証
配列内の1レコードの検証を行いたい場合は expectJSONTypes
の第一引数に users.0
のような独自の記法で指定する。
複数レコードの検証を行う場合は users.*
のようにワイルドカードも指定できる。
例えば以下のようなレスポンスが返るAPIの場合。
{
users: [
{
"id": 1,
"name": "hikarock",
"url": "http://hika69.com"
},
{
"id": 2,
"name": "foo",
"url": "http://example.com"
}
...
]
}
1レコード目を検証する場合は以下のように記述する。
frisby.create('GET:users')
.get(config.get('url') + '/users')
.expectStatus(200)
.expectHeaderContains('content-type', 'application/json')
.expectJSONTypes('users.0', {
id: Number,
name: String,
url: String
})
.toss();
まとめ
導入も楽で、いい感じ。
今回はGETの正常系しか試してないので、実行順を考慮する必要のある更新系なども試してみたい。