今さら聞けない Apache JMeter の基本

## <i class="fa fa-cube" style="font-size:1em;"></i> 一行で説明

Apache JMeter について基本をおさらいします。


## <i class="fa fa-check-square-o" style="font-size:1em;"></i> Apache JMeter とは

Apache JMeter はベンチマークツールではなく、ユーザのシナリオに沿ってリクエストを投げ、そのレスポンスを測定するツール。
ベンチマークを取るためにも使うことは可能。

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> スレッド

一つのスレッドは一人のユーザを表す。一つのテスト計画に複数のスレッドを登録することが可能。複数スレッドを登録して実行するとすべてのスレッドが実行される。特定のスレッドのみを実行したい場合は、他のスレッドを無効化する必要がある。

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> スレッド数

シナリオ上の想定ユーザ数。

### <i class="fa fa-thumb-tack" style="font-size:1em;"></i> Delay Thread creation until needed

このオプションを付けると、スレッドが必要になったときに立てられる。その為、負荷をかける側の負担を軽くすることが可能。

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> Ramp-Up期間

指定した数のスレッドをすべて立ち上げるのにかける時間。一般的に、すべてのユーザが同時にアクセスするという想定はあまりしない。
厳密には、

```
  スレッド間の時間 = Ramp-Up 期間 / スレッド数
```

となる。

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> ループ回数

一つのスレッドを何回ループさせるのかを指定。  
無限ループも可能。ただし、無限ループはスケジューラと組み合わせることがおおい。

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> スケジューラ

持続時間(秒)、起動遅延(秒)、開始時刻、終了時刻を指定してスケジュール。

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> ロジックコントローラー

if 文、for文のような処理を GUI 上で作成可能にする機能。
ロジックコントローラーは、サンプラーのまとまりに対して実行条件を作るグループを定義するオブジェクトである。

### <i class="fa fa-list" style="font-size:1em;"></i> ロジックコントローラーの主な種類

- 一度だけ実行されるコントローラ
  - 各スレッドの中で一度しか実行されないコントローラ
  - ログイン処理などに利用される
- ループコントローラ
  - 指定された回数、または無限ループさせるコントローラ
- ランダム順序コントローラ
  - 配下にあるオブジェクトをランダムな順序ですべて実行するコントローラ
- インタリーブコントローラ
  - 配下にあるオブジェクトを一つ実行するコントローラ
  - 複数回テストを実行すると順番がずれていく
  - ループの中で使い、一周目は A, 二週目は B 、などといったラウンドロビン的な使い方をする
- シンプルコントローラ
  - 機能はなく、サンプラーをまとめるだけの役割
- if コントローラ
  - 前に返されたレスポンスを元に分岐する場合に私用
  - 条件をみたす場合に、配下のサンプラーを失効
  - 「後処理」の「正規表現抽出」を使用して、レスポンスの一部を切り出して条件とする
- ForEachコントローラ
  - 前に返されたレスポンスを元にループするコントローラ

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> 設定エレメント

### <i class="fa fa-check-square-o" style="font-size:1em;"></i> 設定エレメントとは

テストで必要な様々な設定を行うオブジェクト

### <i class="fa fa-list" style="font-size:1em;"></i> 主な設定エレメント

- CSV data set config
  - CSV や TSV データを読み込んで、テスト内のサンプラーの変数として使用するための設定
  - ex) ユーザ 10000 件のログイン情報を CSV で用意し、それに従って実行
- HTTP クッキーマネージャ
  - セッションをまたいだ Cookie 管理を行ってくれる
  - テスト用のカスタムの Cookie の埋め込みも行える
- HTTP ヘッダマネージャ
  - HTTP ヘッダーに特別な値を設定したいときに使用する
  - ex) UserAgent の設定
- JDBC Connection Configuration
  - JDBC の DB 接続情報を設定

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> タイマ

### <i class="fa fa-check-square-o" style="font-size:1em;"></i> タイマとは

サンプラーリクエスト間にスリープを起きたい場合に使用する。人間で言うところの、ページの滞在時間をシミュレートするようなもの。実際のユーザの操作を再現するために、各操作の間にスリープを置く。

### <i class="fa fa-list" style="font-size:1em;"></i> 主なタイマ

- 定数タイマ
  - 指定された一定時間だけ待つ
- 一様乱数タイマ
  - 最大遅延時間で指定された時間までの一様な乱数時間だけ待つ
- ガウス乱数タイマ
  - 指定された遅延時間オフセット定数を、平均(μ)と偏差(δ)で指定し、ガウス分布に従うようにサンプリングした時間待つ
- 定数スループットタイマ
  - 指定したスループットとなるように自動で待ち時間が調整される

### <i class="fa fa-thumb-tack" style="font-size:1em;"></i> タイマは配置する場所によって動作が違う

サンプラが複数存在する階層にタイマを設置すると、それらの一つ一つのリクエストの間に待ち時間が発生する。タイマによる待ち時間はリクエスト実行前に入る。特定のサンプラのみタイマを適用したい場合は、サンプラの子要素としてタイマを追加する。

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> サンプラ

### <i class="fa fa-check-square-o" style="font-size:1em;"></i> サンプラとは

JMeter の肝となる機能。サーバにリクエストを投げてレスポンスを受け取るオブジェクト。

### <i class="fa fa-list" style="font-size:1em;"></i> 主なサンプラ

- HTTP リクエスト
- Soap/XML-RPC リクエスト
- JDBC リクエスト
- TCP サンプラ
- FTP リクエスト

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> リスナ

### <i class="fa fa-check-square-o" style="font-size:1em;"></i> リスナとは

サンプラが取得した結果やレスポンスに要した時間などをまとめてレポートにする機能。

### <i class="fa fa-list" style="font-size:1em;"></i> 主なリスナ

- 統計レポート
- 結果を表で表示
- 結果をツリーで表示
- グラフ表示

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> アサーション

応答を検査し、テストが成功したか失敗したかを判断する機能。パフォーマンスチューニングという観点だとあまり利用しない。

## <i class="fa fa-angle-double-right" style="font-size:1em;"></i> JMeter の負荷分散

### <i class="fa fa-thumb-tack" style="font-size:1em;"></i> 一台では十分なテストができない場合

jmeter-server というコマンドを使うと、GUI を実行しているクライアントからの要求でテスト計画をリモート実行する機能がある。
これをうまく使うと、複数台からのテストを実行でき、大規模な環境にも対応できるテストを実行可能。

### <i class="fa fa-thumb-tack" style="font-size:1em;"></i> JMeter を使う上での注意点

- 編集中の注意
  - GUI に Undo 機能がない
- Full GC
  - テスト中に Full GC が起きてしまうと、その間処理が止まってしまい、正確なテスト結果にならない。 Full GC が発生しないように、一回分のテストが収まるようなメモリ量を確保する
- セッション数(同時実行スレッド数)
  - 一台のマシンでだいたい 200 ~ 400 くらいが限界と言われている。限界を見極めて、実施したいテストを単体で行えない場合は jmeter-server を利用する