JMeterを試してみた

簡単に使える負荷テスト用のツールを探してたところJMeterが手軽で十分な機能が使えそうだったので試してみました。 JMeterこちらからダウンロードできます。macの場合はダウンロード後解凍しsh bin/jmeterを実行することでJMeterが起動します。

スレッドグループの作成

スレッドグループはテストを実行するシナリオの単位のようなのもで、スレッドグループ内で指定したリクエストを順番に飛ばしたりできます。右側に表示されているテスト計画名のところを右クリックしAdd -> Threads(Users) -> Thread Groupでスレッドグループを追加できます。スレッドグループではスレッド数(同時実行ユーザ数)、ループ回数または実行時間などの設定ができます。

リクエストの結果を確認できるようにする

ちゃんとリクエストが飛んでいるのか確認するためにはview results treeを追加します。テスト計画名を右クリックしAdd -> Listener -> view results treeと選択することで追加できます。

Summary Reportを確認できるようにする

Summary Reportでは飛ばしたリクエスト数や平均どれくらい時間がかかったか、もっとも時間がかかったものを確認することができます。テスト計画名を右クリックしAdd -> Listener -> Summary Reportsと選択することで追加できます。

cookieを扱えるようにする

テスト計画名を右クリックしAdd -> Config Element -> HTTP Cookie Managerと選択することでcookieをリクエストに含めるようになります。リクエストに含めるcookieの内容を固定で決める場合はUser Defined Cookiesで指定します。

リクエストヘッダにcookieの内容を含める

csrfとかでcookieの内容をリクエストヘッダに含ませたい場合、JMeterの設定ファイルを修正しcookieを変数に保存して利用できるようにします。対象の設定ファイルはjmeter.propertiesで以下の設定を追加します。

CookieManager.save.cookies=true

この設定を入れた場合、JMeter内で${COOKIE_クッキー名}のようにしてcookieの値を参照できるようになります。

リクエストヘッダを設定する場合Add -> Config Element -> HTTP Header Managerを選択します。例えばspring bootでcsrf対策を有効にしている場合、cookieで受け取ったXSRF-TOKENX-XSRF-TOKENとしてリクエストヘッダに含めるのですがその場合nameにX-XSRF-TOKENvalue${COOKIE_XSRF-TOKEN}を指定します。

リクエストを追加する

スレッドグループのところで右クリックし、Add -> Sampler -> HTTP Requestを選択することでリクエストを追加できます。リクエストパラメータの内容はSend Parametersで指定し、JSONを送信する場合Content-Typeにapplication/jsonを指定しvaluejsonの内容を指定します。jsonのリクエストでない場合、Content-Typeにtext/plainを指定しname,valueを指定します。

リクエスト毎にリクエストヘッダで指定するContent-Typeを変える必要が出てくるので、その場合リクエストの下にリクエストヘッダを追加しそのリクエストにのみ有効になるようにします。JSONのレスポンスを返す場合はContent-Typeapplication/jsonを指定します。確認したところJMeterではデフォルトでContentType: text/plain;charset=UTF-8となっているのでjsonのレスポンスを返すときにデフォルトではエラーになります。

レスポンス後にすぐにリクエストを飛ばすのではなく待たせる場合は、Add -> Timer -> Constant Timerを追加します。

特定のリクエストのみ繰り返す場合Add -> Logic Controller -> Loop ControllerでLoop Controllerを追加します。

シナリオテストでログインするユーザを分けたい場合はユーザパラメータを追加する。スレッドグループ名を右クリックしAdd -> Pre Processors -> User Parametersで追加できる。あとはAdd Userを実行して変数を設定するとリクエストで利用できる、例えばlogin_idというユーザパラメータを追加したら${login_id}で参照できるようになる。User Parametersで追加したユーザよりもスレッドの方が多い場合その分ユーザが重複して使用されます。