JSONを返せるREST ServerモックのEasyMockを試してみる

背景

JMeterの動作を確認するために、モックサーバが必要

ゴール

  • 自分で使用する際の、モックサーバの要件を定義する
  • EasyMockが要件を満たせるか確認する

環境

自分で使用する際の、モックサーバの要件を定義する

  • JSONを返すことができる
  • 80番ポートで開ける
  • HTTPリスポンスコード, HTTPヘッダがそれぞれが設定できる
  • APIのドキュメント生成してくれる
  • API仕様ドキュメントなどからスクリプトを使って多数のAPIを定義できる
  • リクエストヘッダ、ボディによって動作を変えれる
  • APIによってサーバを変えれる
  • クライアントから送られてくるPOST値が不正ならエラーを返す

EasyMockが要件を満たせるか確認する

インストール

$ npm install -g easymock

JSONを返すことができる

以下のようにする。取得できた。

$ cat user_get.json
{
  "name": "taro",
  "age": 22,
  "comment": "Hi"
}

$ easymock
Server running on http://localhost:3000
Documentation at: http://localhost:3000/_documentation/
Logs at:          http://localhost:3000/_logs/

別ターミナルで以下を実施
$ curl http://localhost:3000/user
{
  "name": "taro",
  "age": 22,
  "comment": "Hi"
}

80番ポートで開ける

-p でポートを指定し、sudoで実行することにより指定できる

$ sudo easymock -p 80
Password:
Server running on http://localhost:80
Documentation at: http://localhost:80/_documentation/
Logs at:          http://localhost:80/_logs/

HTTPリスポンスコード, HTTPヘッダがそれぞれが設定できる

指定することができる

$ cat change_status_code_get.json
< @status 301
< @header Location: http://www.cyberagent.co.jp

$ curl http://localhost:3000/change_status_code -v
* Hostname was NOT found in DNS cache
*   Trying ::1...
* connect to ::1 port 3000 failed: Connection refused
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 3000 (#0)
> GET /change_status_code HTTP/1.1
> User-Agent: curl/7.37.1
> Host: localhost:3000
> Accept: */*
>
< HTTP/1.1 301 Not there anymore, Bro
< x-powered-by: Express
< location: http://www.cyberagent.co.jp
< content-type: text/html; charset=utf-8
< content-length: 0
< date: Sat, 18 Apr 2015 07:27:35 GMT
< connection: keep-alive
<
* Connection #0 to host localhost left intact

APIのドキュメント生成してくれる

以下にアクセスすると自動的に定義したAPIがドキュメントとなっている

http://localhost:3000/_documentation/

リクエスト、レスポンスのログもでる

 http://localhost:3000/_logs/

API仕様ドキュメントなどからスクリプトを使って多数のAPIを定義できる

ドキュメントからjsonのレスポンスを定義したいのですが、json置くだけなので簡単にスクリプト組んでできそう。

リクエストヘッダ、ボディによって動作を変えれる

GETのパラメータによる値を受け取ることは可能。config.jsonを作りサーバ再起動で試す

$ cat config.json
{
  "routes": [
    "/item/:itemid"
  ]
}

$ cat item/itemid_get.json
{
  "id": "#{itemid}",
  "name": "wood"
}

サーバを再起動したあとに、以下のようにアクセス
$ curl http://localhost:3000/item/3
{
  "id": "3",
  "name": "wood"
}

POSTパラメータでも試してみる

$ cat item/itemid_post.json
{
  "id": "#{itemid}",
  "name": "wood"
}

$ curl http://localhost:3000/item/itemid -X POST -d "itemid=4"
{
  "id": "4",
  "name": "wood"
}

APIによってサーバを変えれる

config.jsonにproxyの項目を追加してサーバを再起動するだけで可能 ただし、proxyしたものはアクセスlogとしてのレスポンスは表示されない

$ cat config.json
{
  "proxy": {
    "server": "http://google.com",
    "default": false,
    "calls": {
      "/google": { "get": true, "post": false }
    }
  },
  "routes": [
    "/item/:itemid"
  ]
}

$ curl http://localhost:3000/google
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/google">here</A>.
</BODY></HTML>

クライアントから送られてくるPOST値が不正ならエラーを返す

なさそう

結果

概ね満たせそうな感じ

参考

https://github.com/CyberAgent/node-easymock