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-TOKEN
をX-XSRF-TOKEN
としてリクエストヘッダに含めるのですがその場合nameにX-XSRF-TOKEN
、valueに${COOKIE_XSRF-TOKEN}
を指定します。
リクエストを追加する
スレッドグループのところで右クリックし、Add -> Sampler -> HTTP Request
を選択することでリクエストを追加できます。リクエストパラメータの内容はSend Parametersで指定し、JSONを送信する場合Content-Typeにapplication/json
を指定しvalueにjsonの内容を指定します。jsonのリクエストでない場合、Content-Typeにtext/plainを指定しname,valueを指定します。
リクエスト毎にリクエストヘッダで指定するContent-Type
を変える必要が出てくるので、その場合リクエストの下にリクエストヘッダを追加しそのリクエストにのみ有効になるようにします。JSONのレスポンスを返す場合はContent-Type
にapplication/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で追加したユーザよりもスレッドの方が多い場合その分ユーザが重複して使用されます。