0
0

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 5 years have passed since last update.

応答遅延をシミュレートする簡易モックサーバをNode.JSでWindowsローカルに立てる

Last updated at Posted at 2018-11-28

動機

JMeterやLocust、Gatlingなどの負荷試験ツールで負荷試験を行う際、「このツールのこういう挙動ってどうなってるんだっけ?」というのをちょちょいと検証したいと思う瞬間がよくあります。

そういうときにお誂え向きのサーバなどがあればよいのですが、あれこれ準備せずサクっと容易したいときにはNodeJSでローカルにサーバを立てるのが一番お手軽だと思いやってみました。車輪の再発明上等。

やりたいこと

  • getパラメータに応じた遅延時間をシミュレートするWebサーバ
  • 任意のURLを拾って最低限のJSONレスポンスを返す
  • 処理時間と受けたタイムスタンプぐらいはコンソールで確認できる

環境

  • Windows 7
  • curlインストール済(動作確認に使用)

やりかた

NodeJSをインストールする

公式サイトからインストーラを落としてただインストールするのが一番シンプルです。将来に渡って使いそうでNodeJSのバージョン管理を気にする場合はNodist等を経由してインストールする方が吉。自分は↓の記事に従って導入しました。

HTTPサーバを書く

モック用のお手軽サーバなので、最低限。
JS初心者なので色々コードが醜いかもしれません。勉強します。

app.js
let http = require('http');
let url = require('url');
let querystring = require('querystring');

let myApp = function(request,response){
    let timestamp = new Date();
    let parsedUrl = url.parse(request.url);
    let parsedQuery = querystring.parse(parsedUrl.query);
    let res_body={
        method : request.method,
        path : parsedUrl.pathname,
        query : parsedQuery
    };
    // getパラメータに"delay=xxx"があれば、そのミリ秒だけ遅延させる
    let delay = (parsedQuery.delay ) ? parsedQuery.delay : 0;
    setTimeout((path,res,ts)=>{
        let elapsed = Date.now()- ts.getTime();
        res.writeHead(200,{'Content-Type':'text/json'});
        res.end(JSON.stringify(res_body)+"\n");
        let logStr = `[${ts.toLocaleString()}] "${path}" ${elapsed}`;
        console.log(logStr);
    },delay,parsedUrl.path,response,timestamp);
};

// ローカルの8081番ポートで起動。環境に応じて変更
http.createServer(myApp).listen(8081,'127.0.0.1');

HTTPサーバを起動

上記app.jsのあるフォルダで以下コマンドを叩きます。

$ node app.js

これだけで準備完了です。http://localhost:8081/以下の任意のアクセスに応答し、HTTPメソッドとアクセスしたパス、getパラメータのクエリの中身だけJSONで返してくれるシンプルなサーバが出来上がりました。

getパラメータでdelay=xxxとしてミリ秒数を指定することで、その時間だけレスポンスを遅らせることができます。

実行例 : 1多重

とりあえずcurlで叩いてみる。

クライアントサイド
$ date +%s;curl "http://localhost:8081/hogehoge?fugafuga=pi
yopiyo&delay=3000";date +%s
1543430095
{"method":"GET","path":"/hogehoge","query":{"fugafuga":"piyopiyo","delay":"3000"}}
1543430099
サーバサイド
$ node app.js
[2018-11-29 03:34:55] "/hogehoge?fugafuga=piyopiyo&delay=3000" 3000

だいたい3秒遅れのレスポンスを返してくれます。

実行例 : 高多重

curlで雑に10多重。

クライアントサイド
$ for i in `seq 1 10`; do curl http://localhost:8081/hoge?delay=`expr $RANDOM % 3000` >/dev/null 2>&1 & done
サーバサイド
[2018-11-29 03:38:05] "/hoge?delay=179" 179
[2018-11-29 03:38:05] "/hoge?delay=277" 283
[2018-11-29 03:38:05] "/hoge?delay=797" 798
[2018-11-29 03:38:05] "/hoge?delay=1896" 1898
[2018-11-29 03:38:05] "/hoge?delay=1484" 1490
[2018-11-29 03:38:05] "/hoge?delay=1311" 1313
[2018-11-29 03:38:05] "/hoge?delay=1253" 1254
[2018-11-29 03:38:05] "/hoge?delay=1251" 1255
[2018-11-29 03:38:05] "/hoge?delay=2597" 2598
[2018-11-29 03:38:05] "/hoge?delay=2710" 2714

多重でもちゃんと叩けますね。

おわりに

以上、簡単にですがローカルで負荷試験ツールを試す用のモックサーバを構築できました。
でも普通にWireMockの遅延シミュレート機能つかったほうが早い気がしてきました。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?