WireMockはAPIのリクエストとレスポンスをモック化してくれるものです。
公式を見たりいろいろと検索した感じ、テストで使われるのがメインになっているようです。
実際、自分も現場ではWireMockを使ってテストを実装しています。
ただプライベートではWireMockはテストではなく勉強として実装するアプリから利用する外部のAPIとして使ってます。
例えばHTTPリクエストを投げてレスポンスを処理する部分を勉強で実装してみたいとなったら、APIが必要になります。
このAPIは実際に世の中に公開されていてフリーで使うことができるものを使うという手段がありますが、今の自分にとって都合の良いAPIは意外と少なかったり、なんでもよかったとしても何使おうかって悩んだり調べたりする時間が煩わしかったりします。
自分はそこに時間は使いたくなかったので、WireMockを使って自分に都合のよいAPIを立てて使うようにしています。
WireMockは起動するだけでは利用はできません。起動した後にスタブ(リクエストとレスポンス)を設定する必要があります。
自分は普段Dockerを使ってWireMockを起動しているのですが、スタブの設定はコンテナを削除すると消えてしまいます。
コンテナを起動したままにすればいいというのは1つあるのですが、Docker for Macは重たいので常時起動させているのは嫌でした。
だからと言って毎回起動させてから設定するはスタブの数が増えると手間だし、スタブを設定したモックをDockerイメージに焼き込むという手はありますが、スタブを更新するたびにイメージを作成するもやりたくない。
そんなわがままを満たすべく、なんかいい感じにできないかなーって探していたら見つかった(普通に公式に書いてた。。)ので備忘も含めて記事にします。
サンプルコードはこちら
WireMock起動時に自動でスタブ設定を行う方法
前提として今回はdocker、もしくはdocker composeを使ってWireMockを起動する際に関して記載していきます。
結論から言うと、WireMock起動時に自動でスタブ設定を行う方法はWireMockのコンテナ内にある/home/wiremock/mappingsディレクトリにスタブの設定を書いたJSONファイルを配置すればスタブの設定は完了です。
今回は配置の方法をしてローカルのディレクトリをマウントするようにしようと思います。
ディレクトリ構成は下記のようになります。
wiremock-sample/
├ docker-compose/
└ docker-compose.yaml
├ wiremock/
└ mappings/
└ hello.json
hello.jsonがスタブの書かれたファイルになります。ですので起動時にこのファイルが配置されているディレクトリをマウントするようにすればOKです。
ちなみにhello.jsonは下記のようになっています。
{
"request": {
"method": "GET",
"url": "/hello"
},
"response": {
"status": 200,
"body": "Hello world!!",
"headers": {
"content-type": "text/plain"
}
}
}
簡単に説明をするとAPIのパスhelloにGETリクエストを投げるとステータス200でHello world!!ってメッセージが返ってくるというスタブです。
Dockerを使う場合
まずはシンプルにDockerを使って起動する場合です。
その場合は起動コマンド実行時に-vを使ってマウントするディレクトリを指定するだけです。
なのでコマンドとしては下記の通りです。
※下記コマンドはwiremock-sampleディレクトリで実行することを想定しています。
docker run -it -p 8080:8080 wiremock/wiremock -v $(pwd)/wiremock/mappings:/home/wiremock/mappings
これはWireMockというよりはDockerの仕様によるものなのですが、-vでマウントするディレクトリを指定する際は必ず絶対パスを使うようにしてください。
相対パスを使おうとするとエラーが発生したり、エラーが出なかったとしても正しくディレクトリがマウントできていなかったりするので注意です。
コマンドを実行するとWireMockが起動すると思います。
WireMocksが起動できると実際に確認してみます。
任意のブラウザを開いてURLを入力する欄にhttp://localhost:8080/__admin/mappingsと入力します。
すると下図のようにhello.jsonでのスタブを同じ情報がmappingに入っていることが表示されると思います。
もしmappingsの中になにも記載されていない場合はマウントに失敗している可能性があるので、スペルミスやマウントするディレクトリが間違っていないかを確認してください。
docker execコマンドを使ってWireMockのコンテナに入ってhome/wiremock/mappingsディレクトリに実際に何がマウントされているのかを確認するのも1つの手です。
今回の場合はコンテナの中に下図のように/home/wiremock/mappings直下にhello.jsonが配置されているのが正しい状態です。
スタブがしっかりと機能するか hello パスに curl を実行してみると想定したレスポンスが返ってきます。
% curl localhost:8080/hello
Hello world!!
これでDockerを使った場合のスタブの自動設定ができるようになりました。
Docker composeを使う場合
Docker composeを使う場合もDockerと同様でディレクトリをマウントすることで事前に用意したスタブを起動時に自動で設定するようにします。
ディレクトリ構成は先述した通りで、docker-compose.yamlは下記のようになります。
version: '3'
services:
wiremock:
image: wiremock/wiremock
ports:
- 8080:8080
volumes:
- ../wiremock/mappings:/home/wiremock/mappings
volumesの箇所にマウントするディレクトリを記載します。
YAMLファイルの作成が完了したら後は起動するだけです。
ターミナル等でdocker-compose.yamlが配置されているディレクトリに移動します。
移動したら下記のコマンドを実行します。
docker compose up
起動できたら任意のブラウザでhttp://localhost:8080/__admin/mappingsを入力して想定したスタブが設定されているかを確認します。
想定しているスタブが表示されればこれでOKです。
もしmappingsの中になにも記載されていない場合はマウントに失敗している可能性があるので、スペルミスやマウントするディレクトリが間違っていないかを確認してください。
docker execコマンドを使ってWireMockのコンテナに入ってhome/wiremock/mappingsディレクトリに実際に何がマウントされているのかを確認するのも1つの手です。
コンテナの中としては/home/wiremock/mappings直下にhello.jsonが配置されているのが正しい状態です。
スタブがしっかりと機能するか hello パスに curl を実行してみると想定したレスポンスが返ってきます。
% curl localhost:8080/hello
Hello world!!
これでDocker composeを使った場合のスタブの自動設定も完了です。
まとめ
ディレクトリをマウントすることで今後スタブの追加、更新、削除をする際はそのディレクトリに配置されたJSONファイル修正やファイルそのものを追加し、Dockerを再起動するだけでWIreMockのスタブ設定が更新されるので非常に便利です。
またJSONファイルにすることでGitでの管理ができるもの1つの利点だと思います。
ただ自動テストのような品質担保のためのテストで利用する場合は起動時に自動で実施するのではなく、各ケースごとにスタブを設定してリセットしていく方が望ましいです。
そうしないとテストの独立性が担保されず、他のテストの実行の影響を受ける可能性があり期待通りのテストができなかったりします。
今回はDockerに関して記載しましたが、時間がある時にKubernetesを使った場合も追記しようと思います。
やることとしてはDockerの場合と同じでマウントするディレクトリを指定するだけなので大した作業は必要ありません。
コメント