Jmeter のインストールから負荷テストまで

# <i class="fa fa-download"></i> JMeter をダウンロード

① Apache JMeter 本体をオフィシャルサイトの `Download` ページからダウンロードしてきます。
<i class="fa fa-external-link"></i> http://jmeter.apache.org/

![Apache JMeter をダウンロード](https://qiita-image-store.s3.amazonaws.com/0/9064/92590fa0-8ba6-ee3b-652b-dfa03fa58658.png)

② ダウンロードして解凍したら、普段アプリケーションをまとめている任意のフォルダに移動させます。javaが入っていればインストールは不要で、本体クリックで起動できます。

③ `bin` フォルダ内の `jmeter.bat` や `jmeterw.cmd` をダブルクリックするか、`ApacheJMeter.jar` をプログラムを指定して開きます。指定するプログラムは java です。


## <i class="fa fa-clone"></i> ショートカットを準備

JMeter の `bin` フォルダ内にはいくつか便利なスクリプトが用意されています。
自分がよく使うスクリプトのショートカットを作成して、使いやすい場所に置いておくと作業効率が上がります。

|ファイル|スクリプトの内容|
|:--|:--|
|jmeter.bat|JMeterをGUIモードで起動する。|
|jmeterw.cmd|WindowsシェルコンソールなしでJMeterを起動する。|
|jmeter-n.cmd|これにJMXファイルをドロップして非GUIテストを実行する。|
|jmeter-n-r.cmd|これにJMXファイルをドロップして、非GUIテストをリモートで実行する。|
|jmeter-t.cmd|これにJMXファイルをドロップしてGUIモードでロードする。|
|jmeter-server.bat|サーバーモードでJMeterを起動する。|
|mirror-server.cmd|JMeterミラーサーバーを非GUIモードで実行する。|
|shutdown.cmd|GUI以外のインスタンスを正常に停止する。|
|stoptest.cmd|非GUIインスタンスを突然停止させます。|

JMeter は GUI モードのままテストすると正確な結果が得られなくなるので、`jmeter-n.cmd` は特に必要です。

参考：<i class="fa fa-external-link"></i> [【JMeter】負荷テスト実行はGUIから行ってはならない](http://qiita.com/tatesuke/items/827e6190753964e46814)

① ここでは、`jmeter-t.cmd` と `jmeter-n.cmd`、`jmeterw.cmd` の３つのショートカットを作成します。JMeter の `bin` フォルダにアクセスして `jmeter-t.cmd` と `jmeter-n.cmd`、`jmeterw.cmd` を選択し、`Alt` キーを押しながら配置したいフォルダにドラッグします。

② そのままでは何のショートカットか分かりにくいので「非GUI」など分かりやすい任意の名前にしておきます。

`jmeter-t.cmd` に `jmx` ファイルをドロップしてテストの設定を編集しては、`jmeter-n.cmd` でテストを実行する、というのが簡単で効率的です。Windowsのタスクスケジューラを使えば寝ている間もテストできます。

<i class="fa fa-sticky-note-o"></i> `.cmd` をテキストエディタ等で開くとスクリプトが書かれています。<i class="fa fa-external-link"></i> [コマンドについてはオフィシャルを参照。](http://jmeter.apache.org/usermanual/get-started.html#non_gui)


## <i class="fa fa-puzzle-piece"></i> プラグインをインストール

① jmeter-plugins.org の `install` ページから `Plugins Manager` をダウンロードします。
<i class="fa fa-external-link"></i> https://jmeter-plugins.org/

![JMeter Plugins Manager をダウンロード](https://qiita-image-store.s3.amazonaws.com/0/9064/c4865d19-28f7-c526-1650-9bdcf19c4168.png)

② ダウンロードしたファイルをそのまま JMeter の `lib/ext` フォルダに入れます。

③ 作成しておいた `jmeterw.cmd` のショートカットで JMeter を起動します。

④ 起動したら、オプションの Plugins Manager メニューからプラグインマネージャーを起動します。`Installed Pulgins` がインストール済み、`Available Pulgins` が追加できるプラグインです。

⑤ `Available Pulgins` から `jpgc - Standard Set` にチェックを入れ、`Apply Changes and Restart JMeter` をクリックしてインストールします。

![Plugins Manager で jpgc - Standard Set をインストール](https://qiita-image-store.s3.amazonaws.com/0/9064/0b2623d1-a529-6dec-e2b2-10eb06e7b455.jpeg)


# <i class="fa fa-cog"></i> 負荷テストの準備

JMeter を起動すると空のテスト計画が表示されます。それをそのまま使ってもいいし、ファイルの新規から新しくテスト計画を作ってもいいです。

テストに最低限必要な構成は以下になります。

<i class="fa fa-flask"></i> テスト計画
└ <i class="fa fa-cog"></i> スレッドグループ（ひと固まりのテスト）
&nbsp;&nbsp;&nbsp;&nbsp;└ <i class="fa fa-eyedropper"></i> サンプラー（HTTPリクエスト等）

リスナーを設定する説明をしているサイトもありますが、試験をする段階ではまだ必要ありません。

## <i class="fa fa-flask"></i> テスト計画の設定

テスト計画に分かりやすい名前を付けます。名前は日本語OKです。
ここではそれだけで十分です。

## <i class="fa fa-cog"></i> スレッドグループの設定

① テスト計画を右クリックし、追加 > Threads (users) > スレッドグループ を選択します。

![スレッドグループを選択](https://qiita-image-store.s3.amazonaws.com/0/9064/9174cef3-c860-0e36-a011-278758d65cec.jpeg)

② スレッドグループの画面が表示されるので、名前とコメントを入力します。日本語OK。

③ スレッドプロパティにスレッド数、Ramp-Up期間、ループ回数を設定し、`Delay Thread creation until needed` にチェック <i class="fa fa-check-square-o"></i> を入れます。

|プロパティ名|内容|
|:--|:--|
|スレッド数|起動するスレッド数 ≒ セッション数|
|Ramp-up期間|アクセス実行期間の指定（秒で指定）|
|ループ回数|1つのシナリオ（スレッド）を何回繰り返すか ≒ 同時アクセス数|

JMeter は `スレッド数` に入力された数を `Ramp-up期間` に入力された秒数で均等に割り付けます。`ループ回数` が 1 以上の場合はスレッドが処理されるタイミングで同じスレッドの処理を繰り返すので、`ループ回数` はほぼ同時アクセスのようになります。

しかし、それだと負荷テストとしては不自然です。同時アクセスが発生することはあっても何度も同じタイミングで発生することはありません。ループ回数を 1 にしてスレッド数で想定されるアクセス回数を入力し、まばらにアクセスさせた方が自然です。

ただ、スレッド数を多くすると JMeter が必要なスレッドを一気に立ち上げてしまうので負荷をかける側のメモリの消費が激しくなり、場合によってはテストが正常に進まなくなります。

これを解消するのが `Delay Thread creation until needed` のオプションです。これにチェックを入れておくとスレッドが必要になったときにスレッドを立ち上げるので負荷をかける側のメモリの消費が抑えられます。

参考：
<i class="fa fa-external-link"></i> [負荷テストあれこれ-JMeter 負荷のかけ方、レポートの見方-](http://ameblo.jp/itboy/entry-10041857522.html)
<i class="fa fa-external-link"></i> [JMeter の利用方法(1) – Ramp－up、スレッド数、ループ回数の誤用](http://keis-software.com/2013/09/02/jmeter-%E3%81%AE%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%951-ramp%EF%BC%8Dup%E3%80%81%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E6%95%B0%E3%80%81%E3%83%AB%E3%83%BC%E3%83%97%E5%9B%9E%E6%95%B0%E3%81%AE%E8%AA%A4/)

設定例：
![スレッドグループ設定](https://qiita-image-store.s3.amazonaws.com/0/9064/28fc7429-2201-7f9b-275b-b36ada899071.jpeg)


## <i class="fa fa-eyedropper"></i> HTTPリクエスト（サンプラー）の設定

① 作ったスレッドグループ名を右クリックし、追加 > サンプラー > HTTP リクエスト を選択します。

![HTTPリクエスト追加](https://qiita-image-store.s3.amazonaws.com/0/9064/e64662e3-ac15-3418-294b-1a0017f1dd3d.jpeg)

② アクセスさせたいページを設定します。

|プロパティ名|内容|
|:--|:--|
|名前|ページの名前|
|サーバ名またはIP|テストするサーバーのホスト名またはIPアドレス|
|ポート|http なら 80、https なら 443|
|プロトコル|http or https|
|メソッド|通常は GET。フォーム送信後の画面等は POST。|
|パス|/ から始まるroot相対パス|

設定例：
![HTTPリクエスト入力](https://qiita-image-store.s3.amazonaws.com/0/9064/fc5c807c-ed4e-cf5f-bce6-7d37b68cbfc5.jpeg)

<i class="fa fa-sticky-note-o"></i> 固定のページの負荷ではなく一人が複数のページをアクセスした場合の負荷をテストする場合は、スレッドグループに複数のHTTPリクエスト（サンプラー）を作ります。

## <i class="fa fa-wrench"></i> ベーシック認証がかかっている場合の設定

ベーシック認証がかかっている場合は認証マネージャを作成します。

① スレッドグループ名を右クリックし、追加 > 設定エレメント > 認証マネージャー を選択します。

![HTTP認証マネージャ追加](https://qiita-image-store.s3.amazonaws.com/0/9064/f7ea563c-14f9-e62d-0120-71a6572416b4.jpeg)

② 認証情報を入力します。

名前は分かるように「ベーシック認証」としておきます。
下端にある「追加」ボタンをクリックすると「認証マネージャに保存されている認証」の欄に空の１行が追加されるので、基底URL、ユーザー名、パスワードをそれぞれ入力します。

設定例：
![ベーシック認証入力](https://qiita-image-store.s3.amazonaws.com/0/9064/b1a20427-a840-0a3c-ff9d-40c106cac99c.jpeg)


## <i class="fa fa-floppy-o"></i> 保存して閉じる

テストは非GUIで行うので、設定が終わったら一旦保存して閉じます。
拡張子が `.jmx` というファイルができているので、設定の変更やテストの実行はこれをショートカットにドロップして行います。

<i class="fa fa-sticky-note-o"></i> `.jmx` ファイルはXMLになっており、テキストエディタ等で直に設定変更も可能です。


# <i class="fa fa-play"></i> テストの実施

① `jmeter-n.cmd` のショートカットにテスト計画ファイル（.jmx）をドロップします。

コマンドプロンプトが開かれ、サマリーが出力されます。

![コマンドプロンプト](https://qiita-image-store.s3.amazonaws.com/0/9064/1413cd24-d823-1a35-b5be-58553ee12458.jpeg)

② コマンドプロンプトが閉じられればテスト終了です。


## <i class="fa fa-copy"></i> 複数パターンのテスト実施

複数のパターンをテストする場合はテスト計画ファイル（.jmx）を複製し、'jmeter-t.cmd` のショートカットにドロップして編集します。パラメーターやアクセスさせるページを変更すれば複数パターンのテストができるようになります。


## <i class="fa fa-clock-o"></i> 自動でテストさせる

Windowsのタスクスケジューラを使えば寝ている間もテストできます。

JMeter でスレッドを復数作ってスケジューラーの起動遅延等をしてみたのですが、使っているPCが貧弱なのか非GUIでも途中で止まってしまいました。スケジューラーならPCに余計な負荷をかけずに自動起動できます。

① Windowsメニューのすべてのプログラム > Windows管理ツール > タスクスケジューラ を選択して起動します。

![Winメニュー](https://qiita-image-store.s3.amazonaws.com/0/9064/4eea81ab-12b0-eb43-2fd4-bc28f7493d0c.jpeg)

② 「タスクの作成」で新規タスクを作成します。

復数のタスクを登録するつもりなら、先にフォルダを作ってその中に作ると管理しやすくなります。

「タスクの作成」をクリックするとタスク設定画面が開かれます。各項目を以下のように設定していきます。

|タブ|項目|設定内容|
|:--|:--|:--|
|全般|名前|管理しやすい任意の名前|
|トリガー|開始|実行させたい日時を設定します。|
|操作|プログラム/スクリプト|jmeter-n.cmd までのファイルパスを入力します。|
|操作|引数の追加|テスト計画ファイル（.jmx）までのファイルパスを入力します。|

設定例：
![タスクのスクリプトの設定](https://qiita-image-store.s3.amazonaws.com/0/9064/4daeac70-e09a-7065-7172-bf01d2ee8dac.jpeg)


# テスト結果の確認

テストを実行するとテスト計画ファイル（.jmx）と同じフォルダ内にレポートファイル（.jtl）とログファイル（.log）ができています。JMeter のリスナーにこのレポートファイル（.jtl）を読み込ませるとグラフを描画したり集計したりしてくれます。

## <i class="fa fa-area-chart"></i> 結果を表で表示

テストの結果はカンマ区切りのCSVで保存されています。これを分かりやすく表で表示します。

![結果を表で表示](https://qiita-image-store.s3.amazonaws.com/0/9064/12d264a5-e292-99d0-6a70-15df44b9ce17.jpeg)

各項目についてはこちらが参考になります。
<i class="fa fa-external-link"></i> [JMeter簡易リファレンス 結果を表で表示]
(http://sy5.sakura.ne.jp/jmeter/ref/listener/viewresultsintable.html)


## <i class="fa fa-area-chart"></i> 統計レポート

テストの結果を集計して表示します。「Save Table Data」をクリックすれば集計したものをCSVで保存できます。

![統計レポート](https://qiita-image-store.s3.amazonaws.com/0/9064/c739d221-6b2c-314d-9002-1c0214048a83.jpeg)

各項目についてはこちらが参考になります。
<i class="fa fa-external-link"></i> [JMeter簡易リファレンス 統計レポート]
(http://sy5.sakura.ne.jp/jmeter/ref/listener/aggregatereport.html)


## <i class="fa fa-area-chart"></i> グラフ表示

応答結果をグラフ表示します。データは実際の応答時間でバラツキがあるため、ゴミのように黒い点で表示されます。

![グラフ表示](https://qiita-image-store.s3.amazonaws.com/0/9064/d242c697-592b-365e-91be-9446b1135206.jpeg)

各項目についてはこちらが参考になります。
<i class="fa fa-external-link"></i> [JMeter簡易リファレンス グラフ表示]
(http://sy5.sakura.ne.jp/jmeter/ref/listener/graphresults.html)


## <i class="fa fa-area-chart"></i> jp@gc - Response Times Distribution（プラグイン）

テストの応答時間の分布をグラフ化してくれるリスナーです。
X軸は応答時間を間隔でグループ化し、Y軸は各間隔に含まれるサンプル数を示します。

![jp@gc - Response Times Distribution](https://qiita-image-store.s3.amazonaws.com/0/9064/18de4695-bb6a-6db9-22fa-96b028cbc849.jpeg)

## <i class="fa fa-area-chart"></i> jp@gc - Response Times Over Time（プラグイン）

時間の経過による応答時間の変化をグラフ化してくれるリスナーです。

![jp@gc - Response Times Over Time](https://qiita-image-store.s3.amazonaws.com/0/9064/8c9938d5-2b8d-a07d-d880-5bdd2a0a48ab.jpeg)


# 参考サイト

<i class="fa fa-external-link"></i> [簡易リファレンス](http://sy5.sakura.ne.jp/jmeter/ref/)
<i class="fa fa-external-link"></i> [JMeterの簡単な使い方まとめ](http://qiita.com/digdagdag/items/8a4023ddc7d549fa8de8)
<i class="fa fa-external-link"></i> [【JMeter】負荷テスト実行はGUIから行ってはならない](http://qiita.com/tatesuke/items/827e6190753964e46814)
<i class="fa fa-external-link"></i> [今さら聞けない Apache JMeter の基本](http://qiita.com/aidy91614/items/d96ca0261665abc54f7d)
<i class="fa fa-external-link"></i> [負荷テストあれこれ-JMeter 負荷のかけ方、レポートの見方-](http://ameblo.jp/itboy/entry-10041857522.html)
<i class="fa fa-external-link"></i> [JMeter の利用方法(1) – Ramp－up、スレッド数、ループ回数の誤用](http://keis-software.com/2013/09/02/jmeter-%E3%81%AE%E5%88%A9%E7%94%A8%E6%96%B9%E6%B3%951-ramp%EF%BC%8Dup%E3%80%81%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E6%95%B0%E3%80%81%E3%83%AB%E3%83%BC%E3%83%97%E5%9B%9E%E6%95%B0%E3%81%AE%E8%AA%A4/)