JMeterで最低限の負荷試験

JMeterを用いた最低限の負荷試験のやり方。
Jmeterはかなり高機能ぽく極めるのはかなりの学習コストが掛かりそうなので本当に最低限の設定を紹介。
※5000人のユーザーがTokenを用いた認証がかかってるAPIに対して個別の値をPostする場合

# JMeterインストール
Macを使用してる場合Brewを用いてインスールするのが簡単。

```shell
$ brew install jmeter
```

でインストールして

```shell
$ jmeter
```

で起動

# JMeter設定
## Thread Group追加
Jmeterを起動すると、デフォルトでTest Planが一個存在する。
そこを右クリックして、Thread Groupを追加する。

![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200860/fafb261b-a16d-6c96-737d-c6a5e0c944da.png)

Thread Groupでテストを実行するときにスレッド数(ユーザー数)や実行時間等を指定する。
今回は1000個のスレッドを起動して300秒掛けて5回ループする。
※5分間で5000アクセス。
※本当は5000個のスレッドを起動して300秒掛けて1回ループが自然な設定だと思うのだが、PCの性能問題で5000スレッドも起動できないのでこれ。

![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200860/faf83ea9-f442-13d6-2f15-f713e144529c.png)

適時CTRL+Sで保存することをおすすめ。

## POSTパラメータを追加
POSTする際にユーザー毎の設定を実現する方法を示す。
簡単に言うとCSVに5000人分のToken等を用意しておきPOSTする際に読み込めるようにしておく。

### CSVファイルを用意
このような感じのCSVファイルを用意する。
1行が１ユーザーの設定である。

```
user_token_001,user_post_data001
user_token_002,user_post_data002
user_token_003,user_post_data003
…
```

### CSVファイル読み込み設定追加
Thread Groupを右クリックして、CSV Data Set Configを追加。

![0003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200860/f4378061-3feb-40e9-7608-2ad23682ea2b.png)

ファイルへのパスや、それぞれのカラムがどのパラメータ(変数名)かを設定。
変数名を後の設定で読み込むことが可能になる。

![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200860/91ef995b-5831-48a6-52b9-f37472623cb6.png)

## POST先を設定
APIへPOSTする設定をする。

### HTTP Header Manager追加
JSONをPOSTする旨のヘッダを設定。
Thread Groupを右クリックして、HTTP Header Managerを追加。

![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200860/6927b9a4-5b86-8eb2-910d-d49a2afead8b.png)

Content-Type: application/jsonの設定を追加。

![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200860/817d0892-a825-ab6f-7787-f55c3c002c9f.png)

### HTTP Request追加
HTTPRequestの内容を設定。
Thread Groupを右クリックして、HTTP Requestを追加。

![007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200860/8c39a3c6-f51a-48f1-8774-426dc6dc9d10.png)

コールするAPIの内容を設定する。

![008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200860/0550e69e-598c-5c46-3996-c59c3093c321.png)

POSTする内容をBodyDataタブから設定。
CSVから読み込んだ変数名を指定可能。

![009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200860/20eab44d-d738-01e5-5b23-17366bdf68c8.png)

## 試験結果リスナーを追加
試験結果をリッスンする設定を追加。
個人的には「View Results Tree」と「View Results in Table」で十分かと思った。
それぞれThread Groupを右クリックして追加。

![010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200860/b755dc2a-8500-41d1-0f7a-b1245b8e33aa.png)

# 試験実行
JMeterでの試験実行はCUIモードでの動作が推奨されてるので、テスト計画を保存してGUIは閉じる。
コマンド例：post_test.jmxで保存したテスト計画を実行して、ログをlog.jtl、レポートをreportフォルダに保存
※reportフォルダは作っておかないと出力されない。

```shell
$ jmeter -n -t post_test.jmx -l log.jtl -e -o report
```

# 実行結果
reportフォルダのindex.htmlに試験結果が入っている。
「View Results Tree」と「View Results in Table」からlog.jtlを読み込むことでもログが確認可能である。

![011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200860/973e407a-a1ba-97f7-a986-89ce03b3053c.png)

# 参考
https://qiita.com/gonshi_com/items/29310a419cde8d19768e
https://blackbird-blog.com/jmeter-01
https://tech-blog.rakus.co.jp/entry/2017/08/24/111332
https://tomokazu-kozuma.com/send-get-and-post-requests-with-jmeter/
https://teratail.com/questions/5175