66
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Systemi(株式会社システムアイ)Advent Calendar 2023

Day 9

APIモックサーバーのWireMockを動かしてみる。

Last updated at Posted at 2023-12-08

概要

システムアイ Advent Calendar 2023の9日目の記事になります。
この概要を書いているときに、去年も同じ9日目に記事を書いていたことに気づきました。
去年のアドベントカレンダー以降、何も書いていなかった自分に反省しつつ、今回も現場で使用していたツールWireMockの紹介をしようと思います。

WireMockって何?

WireMockはHttpベースのサービスやAPIのテストやシミュレーションを行うためのツールです。
ユニットテストのモックフレームワークや、CI実行時のスタブサーバーとしても利用できます。

java、nodejsなどにも言語の対応しており、dockerで別プロセスとして起動し、実行することもできます。

特徴

WireMockは他のAPIモックツールと比べて、以下のような特徴があります。

  • スタブファイルの分離
    JSONファイルとしてリクエストとそれに対するレスポンスのスタブを、ソースコードと分離できる。
      
  • リクエストのマッチング
    リクエスト情報を正規表現で記載できる。
      
  • レスポンスの定義
    レスポンスの内容を細かく設定できて、ステータスコード、ボディ、ヘッダーの設定できる。
      
  • リクエストの状態管理
    テスト時にそのリクエストが何回行われたのかを計測したり、リクエストの値に応じて、レスポンスの値を変えることができる。
      
  • 記録と再生
    実際のサービスのリクエスト、レスポンスの内容を記録できるので、
    仕様書がなくてよく分からなくても、実際の処理を流すことでスタブを作成することができる。

動かしてみる

このツール自体、Javaやnodejsのパッケージとしてインストールすることも可能なのですが、今回はdockerを利用したもので検証します。
実際の現場では、Windows(WSL)経由で導入したので、今回はMacで動かしてみます。

環境

Mac Ventura

サンプルファイルをGitHubリポジトリに挙げているので、良かったら動かしてみてください。
wiremock_sample

docker composeの実行が上手くいくと、Wiremockの画面が出てきます。
wiremock画面.png

ファイル構成

docker
└ wiremock     
   ├─__files
   └─mappings

WireMockを使用するにあたり、利用するフォルダーが2つあります。

  • mappings
    スタブのJSONを格納します。docker起動時にこのフォルダーを
    ファイル昇順で読み込み、同じリクエストのスタブファイルが読み込まれた場合は、上書きされます。

  • __files
    スタブでやり取りするファイル情報をここに格納できます。
    アンダーバーが2つあることに注意するしてください。
    application/zipヘッダーで、ダウンロードするようなファイルも置き換えることができます。

スタブファイル

mappingsファイルに入るスタブの構成は以下の通りになります。そのままになってしまいますがrequestキーに期待されるリクエストのメソッドやURL、responseに返却値を設定します。

{
  "request": {
    "method": "GET",
    "url": "/test/sample"
  },

  "response": {
    "status": 200,
    "body": "Hello, world!",
    "headers": {
        "Content-Type": "text/plain"
    }
  }
}

ファイルダウンロードAPIのスタブ

JSONに書いてあるファイルを外部ファイルとして指定することもできます。
JSONで指定されているsample.zip__fileフォルダーに格納しておきます。

{
    "request": {
      "method": "GET",
      "url": "/test/csv",
    },
    "response": {
      "status": 200,
      "bodyFileName": "sample.zip",
      "headers": {
          "Content-Type": "application/zip"
      }
    }
  }

docker composeの中身

mapping__filesをdockerへマウントします。

version: "3"
services:
  wiremock:
    image: "wiremock/wiremock:latest"
    container_name: my_wiremock
    volumes:
      - ./wiremock/_files:/home/wiremock/_files
      - ./wiremock/mappings:/home/wiremock/mappings
    ports:
      - 8443:8080

動作確認

別ターミナルを開いてcurlを実行すると、responseで指定したメッセージが返却されます。

$ curl http://localhost:8443/test/sample
Hello, world!

fileダウンロードもcurlオプションで出力することで、ファイルを取得できます。

$ curl http://localhost:8443/test/csv -o sample.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6916    0  6916    0     0   472k      0 --:--:-- --:--:-- --:--:--  750k

最後に

今回は事前準備を極力少なくできるように、curlコマンドで確認するサンプル紹介になってしまいましたが、
JavaやnodejsでのユニットテストやCIのシナリオテストにも使うことができるので、興味を持ってもらえたらぜひ使ってみてください。

参考にしたサイト

公式ドキュメント

66
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
66
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?