初心者でもできる、JMeterでの負荷テスト

javaさえあればOSに依らず動かせる負荷テストツールjMeterについて紹介します。
全く経験ゼロの僕が2日半で自社製品の負荷テストコードを書けるようになるくらい取っつきやすいです。


## 事前準備
1. [JMeterを用意](https://jmeter.apache.org/download_jmeter.cgi)する。
2. javaを用意してPATHを通す。(Java 8 or 9)

※一部機能を使うためには、更に必要なものが出てくるかもしれません。
・HTTPSの記録をするにはJREでなくJDKを使う。(公式曰くJDKのkeytoolを使うとのこと)
・詳細は[Get Started](https://jmeter.apache.org/usermanual/get-started.html)をご参照ください。

## 起動用のファイル説明
(windows用起動ファイル)
・jmeter-n.cmd -> JMXファイルを用いてCUI起動
・jmeter-t.cmd -> JMXファイルを用いてGUI起動
・jmeterw.cmd -> JMXファイルなしでGUI起動(プロンプトなし)

テスト編集する場合はGUI起動、テスト実行する場合はCUI起動しろと公式が(以下略)
※ちなみにコマンド詳細は下記コマンドで出てきます。
```$ jmeter.bat -? ``` (windows)
```$ jmeter.sh -? ``` (linux)

【プロジェクト名】.jmxファイル、JMeterテスト実行ファイル
【プロジェクト名】.logファイル、JMeter実行ログ
【プロジェクト名】.jtlファイル、テスト実行レポートファイル

## 基本的な操作
Test Plan作って、Thread Group内でテストシナリオ作成。
HTTPプロキシサーバーを使ってから微調整するのが楽ではあるが、
Thread Groupを右クリック＞Add＞Sampler＞HTTP Requestで
GETやPOSTをオラオラ書いて作ることもできる。

### 言語の変更
日本語に変えたければ、
左上メニュータブ＞Options＞Choose Language
で設定できます。

### パラメータ説明
[Test Plan]
・Run Thread Groups consecutively (one at time): 複数スレッドグループを連続実行するかどうか。オンにすると順番に実行、オフにすると並列で同時実行する。
・Run tearDown Thread Groups after shutdown of main threads: 
・Functional Test Mode: 

[Thread Group]
・Number of Threads (users): 生成するスレッド数
・Ramp-Up Period (in seconds): 何秒でMaxのスレッド数に到達させるか。
逆数とって1/(Ramp-Up Period)で、
1秒あたりの何個のスレッドを生成するかの速度と思えば、
多少理解しやすくなる気がする。
・Loop: 設定したテストを何回試行するか。
・Delay Thread creation until needed: スレッドを同時で生成するか、タイミングをずらしながら生成するか。
このオプションがオフだと、テスト時のスレッドごとに行うHTTPメソッドがある時刻に一点集中する。

## HTTPプロキシサーバーでブラウジングを記録する

[FireFox](https://www.mozilla.org/ja/firefox/new/)での例を載せておきます。
https://www.mozilla.org/ja/firefox/new/

### 1. JMeter側の設定
Add＞Logic Controller＞Recording Controller
Add＞Non-test Elements＞HTTP(s) Script Recorder
HTTP(s) Script Recorderで、空いてるポート番号と作ったRecording Controllerを指定してスタートしておく。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/171582/1a30ca52-f7aa-28d3-b5f3-a149ab135175.png)

### 2. Web Browser側の設定 (今回はFireFox)
FireFoxを起動して、
オプション(もしくは歯車マーク)＞一般＞ネットワーク設定＞接続設定
下記のように設定する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/171582/3c6b3cd0-5862-19a0-7c9f-d8b477c0d2cb.png)

localhost内でブラウジングする場合は、プロキシなしで接続にあるlocalhostを外す。
OK押して、適当にブラウジングしたらJMeter側でのHTTPリクエストが記録されているはず。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/171582/dbb02133-fca5-24f3-a252-d9382d8a9c7d.png)


## 外部ファイルからの読み込み
テキスト等で文字列の読み込み、CSV読み込みができます。（他にもあるかも）
.jmxファイルからの相対パス指定もできます。

今回はJMeter内で使用する変数を、User Parametersで定義して使用します。
Add＞Pre Processors＞User Parameters

![image.png](https://qiita-image-store.s3.amazonaws.com/0/171582/2470c835-5d8d-d9a0-6e99-14994e6a7d48.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/171582/6df783d6-674c-db9e-3f35-5234ca918945.png)

下記のように、${hostname}などで使用することができる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/171582/03351791-f7a7-7ae3-10da-7c712af88896.png)


## responseのHTMLから文字列を抽出する
Add＞Post Processors＞XXXX Extractorで、
responseのHTMLから正規表現で文字列抽出できる。(下記はXPathを使って抽出する例)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/171582/2995e200-76eb-8fcc-592e-f43f1ec6df4f.png)


## selenium driverを使用する
Options＞Plugin Managerをクリックして、
Available Pluginのタブで、
jpgc、Selenium/WebDriver Support をインストールする。
Add＞Config Element＞jp@gc - XXXX Driver Configを追加しておく。

## jsを組み込む
そのうち。

## JMeter上で出力されるレポートについて
※[ 注意事項 ]※
.jtlファイルを読み込んでJMeter上の各種レポートに出力するのですが、
読み込みごとに追記形式で追加されていくので、
不要であればほうきマークのClearで削除してください。
ここの仕様を理解していないと、統計レポートで不要な情報混じったりしてハマります。（ハマりました）

## まとめ
使い方によっては、相手側のサーバーを落としてしまい
相手側から攻撃と捉えられてしまうかもしれません。
使い方には気を付けましょう。