JMeterで負荷テスト

ハマったところの忘備録と、意外と上から下まで説明した記事がなかったのでまとめ。

# 目的
JMeterで、負荷テストを行う。
1秒10アクセス。
https://hogehoge.jp/abc を対象とする
ベーシック認証付き
nuxt.js、API通信でバックエンドはLaravel
JMeterはMacで実施。

# JMeterインストール
何はともあれJMeterをインストール。
brewで行います。brewがない場合はbrewをインストールしてね。

JMeterを使うには、本体とJavaが必要です。

```sh
brew install jmeter
brew tap homebrew/cask-versions
brew cask install java
```
javaはこれ書いている時点でバージョン14がインストールされましたが普通に使えました。


# JMeterの実行
コンソールから実行します。

```
jmeter
```

するとGUIツールが開きます。この画面を使ってテスト計画（テストの内容）を作ります。

<img width="1345" alt="スクリーンショット 2020-06-10 17.49.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42110/45c01bbb-70fa-ad6e-4cc4-13c01e8e8d76.png">

## 日本語化
日本語にするにはメニューから以下を選択します。
Options > ChooseLanguage > Japanese


# テスト計画の作成
## 左カラム設定
左カラムの「TestPlan」を右クリックで
追加 > Threads(Users) > スレッドグループ
を選択し、スレッドグループを作ります。


次に上記で出来た「スレッドグループ」を右クリックで
追加 > サンプラー > HTTPリクエスト
追加 > リスナー > 統計レポート
追加 > リスナー > 結果を表で表示
追加 > リスナー > 応答をファイルへ保存
追加 > リスナー > グラフ表示
を選択し、それぞれを作成します。
※結果を表で表示 より下３つは無くてもいいですが、結果が見やすいのであったほうが良いです。

するとこんな感じになります。

<img width="1336" alt="スクリーンショット 2020-06-10 17.57.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42110/f00fec48-6872-639a-5546-86e008da4755.png">

## スレッドグループの設定
テストを何秒おきに何回実行するかを決めます。
スレッド数：10
Ramp-UP期間（秒）：1
ループ数：1

を設定します。
上記は10リクエストを１秒の間に実行するという意味になります。

## HTTPリクエストの設定
左カラムのHTTPリクエストを選択し、情報を入力します。

| 設定項目 | 設定値 |
| --- | --- |
| プロトコル | https |
| サーバ名またはIP | hogehoge.jp |
| HTTP リクエスト | GET |
| パス | /abc |

## ベーシック認証がある場合
HTTPリクエストで右クリックし
追加 > 設定エレメント > HTTP認証マネージャ
を選択し、作成します。

| 設定項目 | 設定値 |
| --- | --- |
| 基底URL | https://hogehoge.jp/ |
| ユーザ名 | ベーシック認証のユーザ名 |
| パスワード | ベーシック認証のパスワード |
| Mechanism | BASIC |

<img width="1344" alt="スクリーンショット 2020-06-10 18.01.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42110/4036d311-7861-929a-4263-dda01f4660d6.png">

## 保存
**TestPlanを選択して**Ctrl+sで保存します。
この後このファイルは使うのでわかりやすいところに保存します。

## テスト
とりあえず動くかをテストします。
GUI上部の緑の△を押して実行します。
実行後、「結果を表で表示」を選択し、Statusが緑だったら成功です。

<img width="1341" alt="スクリーンショット 2020-06-10 18.17.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42110/a37d7c97-c49a-c653-f757-030ad1513bf1.png">


# JMeter実施
実施は、GUIではなくCUIで行います。
以下コマンドで実施。

```sh
jmeter -n -t ~/src/jmeter/test_plan.jmx -l ~/src/jmeter/log.jtl
# パスは保存したファイルの場所を設定して下さい。ログも適当な場所を指定して下さい。
```

# ログの確認
ログの中身はこの様になっています。

```
cat ~/src/jmeter/log.jtl
timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,URL,Latency,IdleTime,Connect
1591777603078,21372,HTTP リクエスト,429,Too Many Requests,スレッドグループ 1-9,text,false,,347449,208,10,10,https://hogehoge.jp/abc,16242,0,238
1591777603178,21915,HTTP リクエスト,429,Too Many Requests,スレッドグループ 1-10,text,false,,353217,208,9,9,https://hogehoge.jp/abc,16151,0,220
1591777602975,24513,HTTP リクエスト,429,Too Many Requests,スレッドグループ 1-8,text,false,,358302,208,8,8,https://hogehoge.jp/abc,16689,0,211
1591777602877,25325,HTTP リクエスト,429,Too Many Requests,スレッドグループ 1-7,text,false,,346781,208,7,7,https://hogehoge.jp/abc,16539,0,175
1591777602578,29420,HTTP リクエスト,429,Too Many Requests,スレッドグループ 1-4,text,false,,623792,208,6,6,https://hogehoge.jp/abc,18709,0,308
1591777602353,30684,HTTP リクエスト,429,Too Many Requests,スレッドグループ 1-1,text,false,,623792,208,5,5,https://hogehoge.jp/abc,18968,0,533
1591777602676,30529,HTTP リクエスト,429,Too Many Requests,スレッドグループ 1-5,text,false,,623792,208,4,4,https://hogehoge.jp/abc,18419,0,210
1591777602378,30834,HTTP リクエスト,429,Too Many Requests,スレッドグループ 1-2,text,false,,623792,208,3,3,https://hogehoge.jp/abc,19032,0,508
1591777602776,30459,HTTP リクエスト,429,Too Many Requests,スレッドグループ 1-6,text,false,,623792,208,2,2,https://hogehoge.jp/abc,18681,0,168
1591777602477,30900,HTTP リクエスト,429,Too Many Requests,スレッドグループ 1-3,text,false,,623792,208,1,1,https://hogehoge.jp/abc,18591,0,409
```

ぐぬぬ・・これはlaravelのリクエスト数制限のせいですね。
この辺りの記事を参考に同時アクセス数を調整しましょう。
https://qiita.com/HorikawaTokiya/items/c04e410e4ed76d3dddc2

おしまい。ちゃんちゃん。