初めに
負荷試験の構築を検討しており、その際にmockサーバーが必要なので、その方法を検討してました。
そんな中、WireMock
を紹介してもらったので、ちょっとだけ触ってみた。
WireMock とは
名前でも分かる通り、mockサーバーでHTTPベースのAPIのシミュレータになります。
準備
Dockerでの使い方を紹介します。
ディレクトリ構成
ポイントとしては stubs
ディレクトリを作ってその中に __files
, mappings
を作ることです。
./
├── docker-compose.yml
└── stubs
├── __files
│ └── hello.json
└── mappings
└── hello.json
docker の設定
次に docker-compose
の設定になります。
DockerHub
で WireMock
で検索すると色々出てくるのですが、こいつが公式みたいです。
(さくっと動かしたかったのでalpine
を選びました)
あとは、stubs
をコンテナにマウントすれば OK です。
docker-compose.yaml
version: '3'
services:
mockserver:
# https://hub.docker.com/r/wiremock/wiremock/tags
image: wiremock/wiremock:2.32.0-alpine
ports:
- 8080:8080
volumes:
- ./stubs:/home/wiremock
stab の設定
-
__files
: ここではレスポンスで返すファイルを設定します。
stubs/__files/hello.json
{
"message": "Hello World !"
}
-
mappings
: ここではリクエストと、レスポンスのファイルを設定するものになります。
stubs/mappings/hello.json
{
"request": {
"method": "GET",
"url": "/hello"
},
"response": {
"status": 200,
"bodyFileName": "hello.json"
}
}
あと、試してないのですが、api で設定を登録することもできるみたいです
使ってみる
local で試す場合はこんな感じです。
❯ docker compose up -d
[+] Running 2/2
⠿ Network wiremock-playground_default Created 0.3s
⠿ Container wiremock-playground_mockserver_1 Started 1.1s
❯ curl http://localhost:8080/hello
{
"message": "Hello World !"
}
わざと間違えてみるとこんな結果が返ってきます(親切)
❯ curl http://localhost:8080/hellooooooo
Request was not matched
=======================
-----------------------------------------------------------------------------------------------------------------------
| Closest stub | Request |
-----------------------------------------------------------------------------------------------------------------------
|
GET | GET
/hello | /hellooooooo <<<<< URL does not match
|
|
--------------------------------------------------------------------------------------------------
その他
実際に使う場合、ラクマは外部連携が結構多いので、ある程度ディレクトリを分けたかったりします。なので、各ディレクトリに v1 を追加してみました。設定はこんな感じです。
.
├── docker-compose.yml
└── stubs
├── __files
│ ├── hello.json
│ └── v1
│ └── hello.json
└── mappings
├── hello.json
└── v1
└── hello.json
stubs/__files/v1/hello.json
{
"message": "Hello V1 !"
}
stubs/mappings/v1/hello.json
{
"request": {
"method": "GET",
"url": "/v1/hello"
},
"response": {
"status": 200,
"bodyFileName": "v1/hello.json"
}
}
動作確認をすると
❯ curl http://localhost:8080/v1/hello
{
"message": "Hello V1 !"
}
動きました!
所感
json の設定のみで完結するので比較的使いやすいのではないかと思います。負荷試験で使用する際は、きちんとコンテナ化で利用もできそうです。また、local や dev 環境でも使えるんじゃないかと勝手に思っています。