ひでメモ

プログラムについて勉強したことを書きます。たぶん。

【JMeter】負荷テストで JMeter を使ってみた

がっつりではないですが負荷テストというか並列で複数アクセスがあったときも大丈夫かを確かめるために JMeter を使うことになったので覚書です。
具体的な使用方法はもっと詳しい解説をしてくれている方がたくさんいるので説明しませんが、初期設定(案の定詰まったので)とテスト作成時に知りたかったけど特に書いてくれている方がいなかった点を記載します。

インストール

こちらからダウンロードしてきて展開するだけです。通常は Binary で大丈夫です。

Apache JMeter - Download Apache JMeter

起動前準備

Java のインストール

事前に Java 8 以降をインストールしておく必要があります。
Mac 版最新バージョンの Java のダウンロード方法は以下を参照してください。

Mac 用 Java の最新版ダウンロード方法 - ひでメモ

環境変数 JAVA_HOME の設定

Java がすでに入っている方は設定済みだと思いますが、私は今回で初めて導入したので設定しました。

export JAVA_HOME=`/usr/libexec/java_home`

公式ドキュメントにも設定するように書いてますね。
Apache JMeter - User's Manual: Getting Started

起動

展開した JMeterディレクトリに移動して、ターミナル上で以下のファイルを実行すると GUI が立ち上がります。

$ ./bin/jmeter

テーマを変更する

バグがあってデフォルトのテーマだとファイルの保存ができず、レポートの出力やテストの設定などが保存できず実質何もできません。なんだこれは
Option > Look & Feelからテーマを変更してから作業を始めましょう。

やったこと

複数端末からリクエストが1秒間隔で飛んでくるような状態を想定してテストを作成しました。
10台の端末から1秒間隔で10リクエスト、合計100リクエストです。めちゃくちゃ軽いですね。
おそらく通常のWebサービスであればもっと多いかと思いますが、今回私がテストしたサービスは端末の台数が限られているなどの条件があってこの程度で十分と判断しました。

設定時の小技

用語

設定時に便利だった機能を解説する前に簡単に用語を書いておきます。

  • Thread Group
    スレッド数(同時接続する端末数)や設定したリクエストを何回送信するかなどの設定を行います。

  • HTTP Request
    どのURLにどんなパラメータでリクエストを送信するか設定します。
    作成した Thread Group を右クリックしAdd > Sampler > HTTP Requestで追加します。
    Thread Group の子の要素になります。

乱数をリクエストのパラメータで使用する

パラメータの値で乱数を使いたい場合以下のように変数を追加して、パラメータとして使用できます。

  1. Thread Group を右クリックしAdd > Config Element > Random Variableで追加します。
  2. Variable Name を指定します。これが HTTP Request のパラメータの設定画面で指定する変数名になります。
  3. Minimum/Maximum Value で乱数の範囲を決めます。
  4. HTTP Request のパラメータの設定画面で ${hoge}のようにして変数を埋め込む。

ちなみにですが、この変数は数値を指定しても単純にそのまま展開されます。
例えば以下のように書くと変数 hoge が 1~9 の乱数だった場合 10001~10009 の値を取ります。

f:id:natsuhide9221:20220103130018p:plain
変数の指定

スレッド番号をパラメータで使用する

複数スレッド = 端末 からのリクエストを投げる場合、スレッドごとにユーザIDを変えるといったことをやりたいことがあると思います。
そういう定数は定義されていて、${__threadNum}(アンダースコアは2つです!)と書けば 1 から始まるスレッド番号を使用してくれます。
例えば、10スレッドで設定していた場合 1~10 になります。

このような jMeter の内部で持っている値や現在日時などはすでに変数が定義されており以下にその一覧があります。(ちょっとした式も埋め込めるみたいです)
jmeter.apache.org

感想

Java でできているのでUI的にちょっと使いづらいこともありますが、基本的な機能としては揃っておりかゆいところにも手が届くようになっているのではないかと思いました。
今回はログインが必要なシステムではなかったので試しませんでしたが、ログインしてから設定したリクエストを送信するといったようなこともできるようです。