JMeterを使用して負荷テストを効率よく行う

# はじめに
システムの負荷テストを行う際、要件として使用人数を想定し、
『○○○人が使用すること想定した負荷をかける』というシチュエーションは、割とあるかと思います。

そんな時、すぐ何百人も用意できるかというと、ほとんどの場合ムリですよね。
そこで役に立つのが、”JMeter”です。

今回は、初歩的な設定から、実際に躓いたポイント（ググッてもすぐには分からなかった点）を
未来の自分の為に残しておきたいと思います。（忘れっぽいので。。。）

# 環境
以下の環境・バージョンを使用しています。
・ Apache Jmeter 5.0 r1840935
・ Windows7（32bit）
・ Java8

# 準備
### 1. Apache JMeterをダウンロードする

https://jmeter.apache.org/download_jmeter.cgi

今回は、zipファイルをダウンロードしました。
その後、任意のフォルダに解凍します。

### 2. GUI画面を立ち上げる
解凍したフォルダの中にbinフォルダがありますので、
その中にある jmeter.bat をダブルクリックして起動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315409/002b9693-0d55-f955-0cc6-f6e363b6fd7d.png)



起動する際、コマンドプロンプトが最初に立ち上がり、その後GUI画面が起動します。
（GUI画面起動までは数秒かかることがありますので、気長に待ちましょう）

### 3. 日本語表記にする
画面が起動した後、英語表記になっていますので、日本語表記にしましょう。
※画面の[Option]→[Language]→[Japanese]を選択して日本語表記にすることも可能ですが、
　閉じると英語に戻ってしまいますので、別の方法にしています。

参考：https://qiita.com/segur/items/66257aad638806b2f27a

① binフォルダ内に、新たにjmeter_ja.batを作成します。
② その中に、以下のように記述し、保存します。

>REM 言語・国を設定する
>SET JVM_ARGS="-Duser.language=ja"

>REM JMeterを起動する
>jmeter.bat

③ 保存したjmeter_ja.batをダブルクリックして実行し、画面が日本語になっていることを確認します。


以上で、JMeterを使用できる準備が整いました。
次からは、負荷をかける為のシナリオ設定作業に入ります。

# 設定作業（基本）
基本的な設定作業としては、以下の３ＳＴＥＰです。

　１．スレッドグループの作成
　２．パラメータの設定
　３．リスナーの作成

順番に見ていきたいと思います。

### 1．スレッドグループの作成
まず、スレッドグループを作成します。
[テスト計画]を右クリックし、[追加]→[Threads（Users）]→[スレッドグループ]をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315409/f0808d9d-7ccd-dd8a-5cec-0f79d9e0a451.png)

### 2．パラメータの設定
追加したスレッドグループの『スレッドプロパティ』に、どのようにテストを行うのかを記載します。
こちらの設定で負荷が変わってきますので、重要な設定です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315409/5fa2fc3b-bb30-24ed-673d-e5b4b15ee4fb.png)

- スレッド数
　　どれくらいのセッションを起動するかを指定します。
　　（人のイメージです）

- Ramp-Up期間（秒）
　　こちらで指定した期間に、スレッドを”スレッド数”で設定した数の分だけ生成します。
　　（Ramp-Up期間 ÷ スレッド数 で、何秒毎に起動するかが分かります。）
　　　※生成なので、Ramp-Up期間で設定した秒数内で処理の全てが完了するわけではありません。

- ループ回数
　　処理を繰り返します。

例として・・・
　スレッド数：10
　Ramp-Up期間（秒）：60
　ループ回数：2
とした場合。
60秒間に、10人がログインする処理を、計2回行うイメージになります。

具体的なイメージは以下の通りです。
60÷10＝6秒毎に、スレッドが起動します。
　①---6秒待機-->②---6秒待機-->③---6秒待機-->・・・・⑥

ループ回数＝２なので、再度実行します。
　①'---6秒待機-->②'---6秒待機-->③'---6秒待機-->・・・・⑥'

※JMeterのバージョンによって、ループ回数の動作に違いがあるようです。
　私が実際に検証したバージョンでは、上記のような動作をしていました。


### 3．リスナーの作成
最後に、リスナーを作成します。
リスナーとは、負荷をかけた結果をまとめて表示してくれる機能です。
ここでは、『統計レポート』を例にしています。
[スレッドグループ]を右クリックし、[追加]→[リスナー]→[統計レポート]をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315409/ba206c03-e6a3-3eda-5ace-cccf3de2a7db.png)


負荷をかけた後の統計レポートは、こんな感じです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315409/0a0858f8-6ca3-9fdf-d1d5-76c654681d69.png)
※上記の例では、Error % が 100% になっていますが、要は失敗しているということです。
　0%であれば、成功しているということになります。


# 設定作業（実践）
単純に、「とあるシステムにログインのみ延々としたい」だけであれば、
HTTPリクエストを追加すればよいのですが、通常はもっと複雑な負荷をかけるものだと思います。

例えば、以下のような処理を想定した場合・・・

　ログイン→会員登録→受注登録→受注検索→ログアウト

JMeterの画面から、ひとつひとつHTTPリクエストを登録していくのは現実的ではありません。
そんな時は、処理をレコーディングさせてJMeterに登録しましょう。

プロキシサーバをJMeterに設定し、Google Chromeからプロキシサーバ経由でシステムにアクセスし、
記録を取っていくイメージです。

### １．記録コントローラを追加
[スレッドグループ]を右クリックし、[追加]→[ロジックコントローラ]→[記録コントローラ]を追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315409/071a3116-c715-bbea-d559-27a970745f37.png)





### ２．HTTPプロキシサーバを追加
一番上の[テスト計画]を右クリックし、[追加]→[Non-Testエレメント]→[HTTPプロキシサーバ]を追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315409/dcf1b643-e4ca-cf21-3e2b-85b8aeca1427.png)

追加したHTTPプロキシサーバ画面にて、ポートを設定します。今回は、”8888”にしてみました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315409/712af18b-e51a-ad5a-bef9-7976cdbb25f0.png)

### ３．Google Chromeの設定(※以下、ChromeとはGoogle Chrome)
Chromeの設定画面を開き、一番下の[詳細設定]をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315409/76275093-6085-5fa0-6a3f-d50ddd0711bf.png)

下の方にある、[プロキシ設定を開く]をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315409/33812f83-49dc-fd64-ef57-d21457286c6f.png)

[LANの設定]をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315409/7f33cb4e-1b1a-6c9c-b9dc-49bd5604a5c0.png)

プロキシサーバの設定をします。
チェックボックスにチェックを入れ、アドレスは127.0.0.1を設定します。
ここで重要なのは、ポートに
「JMeterのHTTPプロキシサーバ画面で設定したポート番号と同じものを設定する」
というところです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315409/9df8369f-352a-2be3-a683-2a3ba3746679.png)
設定したら、OKボタンで閉じましょう。

### ４．HTTPプロキシサーバ画面より、記録を開始
JMeterのHTTPプロキシサーバ画面に戻り、[開始]ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315409/72d84935-4824-4c44-c5e0-c63a7db2875b.png)

メッセージが出ますが、OKボタンを押しておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315409/0cd16ee3-1c08-b315-7b82-07244b8046a2.png)

以下のような画面が表示されたら、記録が開始されていますので、
Chrome画面より、対象システムにアクセスして、記録させたい処理を手動で実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315409/b3cf769f-32b1-d4f3-8419-898483838688.png)

完了したら、[停止]ボタンを押し記録を停止するのと、プロキシ設定を元に戻します。
記録に成功すると、JMeterの記録コントローラに処理が記録されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315409/a4bb33f2-df8f-42fd-fa9e-2c735d61f9e0.png)



### その他のポイント
詳細な設定はここでは説明しませんが、以下も追加しました。
・CSV Data Set Config の追加
　　→ ログインID・パスワード等、ログインする度に情報を変更したい場合、
　　　CSVを用意して順次読みこませることができます。

・HTTPクッキーマネージャ の追加
　　→ 超重要。基本はcompatibilityを選択します。
　　　これを作っておかないと、各画面に情報を持って遷移しません。

それぞれの登録位置も重要です。
以下のような配置で登録しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315409/573d0ada-9b50-3a17-b50a-7e558e2a9257.png)



# いざ、実行
記録した後、そちらで動作できるかのテストをしてみましょう。
そもそも動くかどうかの動作テストの時は、GUIモードで実行して構いません。
※実行する前には、必ず箒２つのボタン![image.png](https://qiita-image-store.s3.amazonaws.com/0/315409/f3a504eb-ea82-adee-53fa-5251b8471d66.png)を押して、今までの実行結果をクリアしておきます。
　（そうしないと、ログが合算されてしまいます）
以下のボタンをポチッと押して、記録した処理を動かしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315409/57f8c38d-e2b4-3f0e-d40c-bc1e5aef9090.png)

動作テストがうまくいったのであれば、いよいよ本番として負荷をガンガンにかけてみましょう。
その時は、**CUIモード**で実行することが推奨されています。
コマンドプロンプトを開き、以下のコマンドを実行してください。

（jmeterのモジュールがあるディレクトリまで遷移してから・・・）
　`jmeter -n -t [jmxファイル] -l [結果ファイル] -e -o [Webレポートフォルダのパス]`

【実行例】
　`jmeter -n -t D:\apache-jmeter-5.0\bin\負荷テスト.jmx -l D:\apache-jmeter-5.0\log\report_test.jtl -e -o D:\apache-jmeter-5.0\log\web_report`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315409/a14f62cc-c56d-119a-63d8-59ed41dd6316.png)
※あれ？Err率高い・・・そこは無視してください。


# やっぱり、やめたい。
意気揚々と負荷をかけ始めたのはいいものの、サーバやアプリのチューニングができていなくて、
サーバが落ちてしまった・応答がなくなってしまった・・・
そんな時は、CUIモードでの実行を一旦キャンセルしたいですよね。

しかし・・・
**コマンドプロンプトからCtrl＋Cを実行しても、JMeterは止められません。**

正しい手順が別にあります。
binフォルダにある、"shutdown.cmd"をダブルクリックすることで停止できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315409/0a077080-0a64-7fa8-c039-37e223be05ab.png)
途中でやめても、jtlファイルは出力されますので、統計レポート画面でjtlファイルを呼びだすことで
結果を確認することができます。

# まとめ
いかがでしたか？
今回は代表的な機能をまとめましたが、他にもたくさんの機能があります。
興味のある方は、色々と試してみるといいかもしれません。