簡単・軽量・柔軟なモックサーバ を作る(gostub)
モックサーバ
「バックエンドが完成していなくて(API完成していない)、フロント側の開発・テストが進まない。」
よくある話だと思います。
そんな場合は、任意のレスポンスを静的に返すモックサーバを用意することがよくある解決策だと思います。
自分もモックサーバが必要になり、
”gostub”というGolangのモックサーバライブラリを見つけました。
調べて使ってみると、要件にかなりマッチしていたので紹介します。
@moaible(もあいぶる🗿(@moaible)さん | Twitter)さん作。
求めていた要件
求めていた要件はこんな感じ。
- 環境構築が簡単なこと(簡単)
- 設定も簡単なこと(簡単)
- 軽量であること(軽量)
- ある程度細かなハンドリングを行えること(柔軟)
- headerの内容に応じてレスポンスを変える等
環境構築
環境構築 手順です。
とても簡単なので、GitHubのREADME見れば分かると思いますが念のため書いておきます。
*Golangのインストール、GOPATHなどのGolangの環境構築手順は省略します。
「Golang 環境構築」のようなキーワードでGoogle検索すると、わかりやすい記事がたくさん出てきます
Golangの環境構築完了後に、以下のコマンドを実行します。
go get github.com/gostub/gostub
GOPATHで指定されているPATHにダウンロードされます。
基本的な使い方
使い方も簡単&シンプルです。
設定
リクエストに対して、どのようなレスポンスを返すのかをJSONで定義します。
${HTTPメソッド}.json
ファイルを作成し、routing定義を行います。
GETの場合は$GET.json
です。
* POSTの場合は$POST.json
、PUTの場合は$PUT.json
というファイル名にします
*ファイル名先頭に$を入れるので、コマンドを実行する際は先頭にバックスラッシュを入れる必要があります(例:vi \$GET.json)
モックサーバ上のディレクトリ構成がそのままURLのパスになります。
以下のディレクトリ構成の場合、GET /mock/test
をリクエストすると、test/
ディレクトリ配下の$GET.json
の内容でroutingされます。
default.json
がレスポンス内容を定義するファイルです。
. └ mock/ └ test/ └ $GET.json └ default.json
mock/test/$GET.json
{ "default" : { "body": "default.json", "status": 200 } }
mock/test/default.json
{ "msg": "Hello, World!" }
起動
gostub -p {ポート番号} -o {gostubのルートディレクトリ}
-p
待ち受けるポート番号を指定します。
デフォルトは8181。
-o
モックサーバ (gostub)のルートディレクトリを指定します。
ディレクトリ構成が/home/testuser/mock/test
で、mock/
をルートディレクトリにする場合は、gostub -o /home/testuser/mock/
と指定します。
*同時に複数ポートで待ち受けることはできないので、待ち受ける場合はgostubを複数起動します
レスポンス
gostub -p 8888
で起動しcurl localhost:8888
を実行すると、以下のレスポンスが返ってきます。
{ "msg": "Hello, World!" }
もう少し踏み込んだ使い方
ここからはもう少し踏み込んだ使い方の説明です。
クエリーの内容に応じてレスポンスを変更する
クエリーの内容が以下の場合に、{ "msg": "Cat is cute!" }
を応答する設定をします。
curl localhost:8888/mock/test?type=cat&age=5
type = cat かつ age = 5
設定内容は以下。
handlers
配下のparam
に条件を指定します。
$GET.json
{ "default": { "body": "default.json", "status": 200 }, "handlers" : [ { "content": { "body": "response_cat.json", "status": 200 }, "param": { "type" : "cat", "age" : "5" } } ] }
response_cat.json
{ "msg": "Cat is cute!" }
条件にマッチしない場合は、"default": {
の内容が実行されます。
. └ mock/ └ test/ └ $GET.json └ default.json └ response_cat.json
豆知識
上記設定の場合は、age = 500
でも{ "msg": "Cat is cute!" }
を応答してしまうため、完全一致(age = 5)の場合にのみ応答させる場合は正規表現を使います。
"param": { "type" : "cat", "age" : "5$" }
ハンドリングに利用できるパラメータ種別は、クエリー、ヘッダー、パスです。
おわりに
サクッと、それなりに柔軟性のあるモックサーバ を作れるgostubはかなりオススメです。
モックサーバ をこれから作られる方は選択肢の1つにぜひ。