【負荷試験】WireMockとPHPでミリ秒の遅延設定をする
負荷試験を行う際に、外部のサイトへ接続する部分をモック化することが一般的ですよね。
モックといっても、オリジナルの簡易モックサイトを構築したり、モックライブラリなど様々。
今回は負荷試験の対象に Wiremock に接続するケースがありました。
純粋に Wiremock のエンドポイントを叩くだけでは瞬時にレスポンスが返ってしまうので、外部サイトに接続する際に想定されるレイテンシを仕込んでおきたいものです。
そこで、Wiremock のレスポンスを遅延させる方法を調べてみたので共有します。
WireMockの遅延設定
WireMock で遅延を設定するには、各 URL パスのマッピングファイルに「fixedDelayMilliseconds」を定義するだけ。
以下のように、「mappings/test.json」という WireMock の設定ファイルに「/wiremock/test」のパスが設定されているとします。
ここに 1 秒の遅延レスポンスを追加するには、response の中に fixedDelayMilliseconds の項目を追加すれば OK。
簡単ですよね。
// mappings/test.json
{
"request": {
"urlPath": "/wiremock/test",
"method": "POST",
"bodyPatterns" : [
{
"matches" : "(.*)"
}
]
},
"response": {
"body": "OK",
"status": 200,
"headers": {
"Content-Type": "text/plain"
},
"fixedDelayMilliseconds": 1000
}
}
ミリ秒での指定が可能なので、より現実に近い数字が設定できますね。
PHPの遅延設定
PHP の関数では sleep が有名ですが、残念ながら秒単位のスリープしか仕込めません。
ミリ秒の遅延を実現するには usleep 関数を使います。
引数にマイクロ秒をとるので若干の注意が必要です。
・1 秒
・1000 ミリ秒
・1000000 マイクロ秒
例えば 200ms の遅延を入れたいなら、以下のように定義します。
usleep(200 * 1000);
まとめ
モックツールの遅延設定について紹介してきました。
以前 Locust についても書きましたが、どのツールも細かい設定が可能となっています。
WireMock は単純なエンドポイントの提供には導入が簡単ですが、自由度を高めようとするとエクステンションなどの実装が別途必要。
遅延設定は標準で用意されていて助かりました。
簡易的なモックは、個人的には PHP で作ることが多かったのですが、usleep の関数は今まで知りませんでした。
Apache や Nginx など PHP とセットになった Docker イメージもありますし、AWS で言う EKS や ECS などコンテナ上にモックサーバをサクっと置けるのは便利ですね。