Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

動機

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の遅延シミュレート機能つかったほうが早い気がしてきました。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away