Apache Jmeter入門


Apache Jmeter は 100% pure Java で作られたデスクトップ・アプリケーションで、 Webアプリに代表されるようなクライアント/サーバ側ソフトウェアの 負荷テストを行うためのツールです。 静的ファイル、Java サーブレット、CGI スクリプト、Java オブジェクト、 データベース、FTP サーバといった、静的および動的なリソースに関する パフォーマンスを測定するのに利用できます。さらに、 高負荷状態のサーバ/ネットワーク/オブジェクトをシミュレートしながら それらの性能を測定したり、 システム全体のパフォーマンスを分析するのにも使えます。

また Jmeter では、 あなたの作ったアプリケーションが期待する結果を返しているかを検証するための アサーション(成立条件チェック)やテストスクリプトを組み込むことで、 アプリケーションのリグレッション(回帰)テストを行うことができます。 柔軟性を十分に発揮できるように、Jmeter では正規表現を使ってこれらの アサーションを作成できます。

ただし、あくまでも Jmeter はブラウザではなく、 (HTTP 等の)プロトコルレベルで動作するツールです。

Go previousホームに戻る

目次

Jmeterのインストール

Apache Jmeterのダウンロードページ からApache Jmeter 2.11(zip)をダウンロードし、 Windows ならデスクトップ、Linux ならホームディレクトリ直下に展開します。 Windows で普段使っていたLhaplus 1.59では解凍時に警告が出たので (解凍後のパスが長すぎるから?) ALZip(アルジップ)無料バージョン 8.61.1.0 というのを入れて無事に解凍OK。これでインストールは完了です。

なお Jmeter は Java アプリなので、 事前にJRE/JDKあたりを入れておく必要があります。

アーカイブの内容(bin)

使っていくにつれて bin 配下が汚れがちになるので、 解凍直後の状態を参考までに記載しておきます。 bin には以下のファイルが入っています。

ファイル名用途
ApacheJMeter.jarJar ファイル(本体)
BeanShellAssertion.bshrcSample BeanShell Assertion initialisation file
BeanShellFunction.bshrcSample BeanShell Function initialisation file
BeanShellListeners.bshrcExample BeanShell Listener definitions
BeanShellSampler.bshrcSample BeanShell Sampler initialisation file
examples/設定例
hc.parametersApache HttpClient の通常パラメータを上書きするファイル。jmeter.propertiesからインクルードされる。
heapdump.cmdヒープダンプ取得コマンド(Windows)
heapdump.shヒープダンプ取得コマンド(Unix/Linux)
httpclient.parametersCommons HttpClient の通常パラメータを上書きするファイル。jmeter.propertiesからインクルードされる。
jaas.conf認証モジュール設定ファイル
jmeterGUI 起動用コマンド詳細版(Unix/Linux)
jmeter-n-r.cmd非GUI 起動用コマンド(Windows NT/2000)
jmeter-n.cmd非GUI 起動用コマンド(Windows NT/2000)
jmeter-reportレポート出力用コマンド(Unix/Linux)
jmeter-report.batレポート出力用コマンド(Windows)
jmeter-serverリモート起動用コマンド(Unix/Linux)
jmeter-server.batリモート起動用コマンド(Windows)
jmeter-t.cmdGUI 起動用コマンド(Windows NT/2000/XP)
jmeter.batGUI 起動用コマンド(Windows)
jmeter.propertiesGUI 用システムプロパティ
jmeter.shGUI 起動用コマンド簡易版(Unix/Linux)
jmeterw.cmdJavaw 経由の起動用コマンド(Windows NT/2000)
krb5.confケルベロス設定ファイル
log4j.confLog4J用の設定ファイル
logkit.xmllogkit 用の設定ファイル
mirror-server.cmdJmeter のミラーサーバを非GUIモードで起動(Windows)
mirror-server.shJmeter のミラーサーバを非GUIモードで起動(Unix/Linux)
saveservice.propertiesシンボルテーブル(変更しないこと)
shutdown.cmd非GUIクライアントのシャットダウン(Windows)
shutdown.sh非GUIクライアントのシャットダウン(Unix/Linux)
stoptest.cmd非GUIクライアント用テスト中止コマンド(Windows)
stoptest.sh非GUIクライアント用テスト中止コマンド(Unix/Linux)
system.propertiesJava 環境設定ファイル
templates/テンプレートディレクトリ
upgrade.propertiesアップグレード用プロパティ
user.propertiesユーザープロパティ

以下は今後作成するテスト計画の内容を保存するファイルです。

ファイル名用途
*.jmxテスト計画本体

以下は実行時に生成されるファイルです。トラブル時に役立ちます。 不要なら消しても構いません。

ファイル名用途
hs_err_pid*.logJava実行時エラーログ
java_pid*.hprof実行時ヒープダンプファイル(バイナリ)
jmeter.log実行時ログ

Jmeterの起動

Jmeter起動直後

initial-screen

apache-jmeter-2.11/bin 配下の jmeter.bat(Windows) または jmeter(Linux)を起動。 起動直後は左のような画面になります。

画像はほぼ1/2の大きさで表示しています。 「新しいタブで画像を開く」と本来の大きさで表示されます(以下同様)。

テスト計画とワークベンチ

左側のツリーの中に「テスト計画」と「ワークベンチ」 という2つのツリーがあります。
「テスト計画」は現在アクティブになっている計画 (テスト実行指示パラメータ)です。
start-button (開始)をクリックすると、 現在のテスト計画に従って即座にテストが行われます。

テスト計画をカスタマイズする際に、 ある条件を一時的に無効にしたい場合は、 その条件を「ワークベンチ(作業台)」にドラッグして移動します。

テンプレートの内容(bin/templates)

ここでは標準で用意されているテンプレートシナリオを元に、 Jmeter の機能を概観しています。 「ファイル」>「開く」で bin/templates を開いてみてください。 以下のファイルが入っています。

ファイル名 用途
BeanShellSampler.jmx BeanShellサンプラー。 BeanShell(Java用の軽量スクリプト言語らしい)でスクリプトを書いて直接実行できます。
build-adv-web-test-plan.jmx ログイン処理等を含む、やや複雑な Web アクセステスト
build-ftp-test-plan.jmx FTP サーバへの比較的単純なアクセステスト
build-ldap-ext-test-plan.jmx LDAP サーバに対するアクセステスト
build-ldap-test-plan.jmx LDAP サーバに対するアクセステスト用テンプレート (ループコントローラ利用)
build-web-test-plan.jmx Web サーバに対する比較的単純なアクセステスト
build-webservice-test-plan.jmx SOAP を使った Web サーバに対するアクセステスト
jdbc.jmx PostgreSQL に対する JDBC 経由のアクセステスト
mongodb.jmx JSR233(Scripting for the Java Platformらしい) を使った mongodb に対するアクセステスト
recording.jmx 記録コントローラ(ユーザの操作を記録してテスト計画を自動作成する) 利用時テンプレート

テンプレート1(build-web-test-plan)の実行

build-web-test-plan.jmx を開いた状態

build-web-test-plan

Web サーバに対する比較的単純なアクセステストを サンプルとして開いてみましょう。 「ファイル」>「開く」で bin/templates/build-web-test-plan.jmx を開き、 "JMeter Users"の左の○をクリックするとツリーが開きます。

このテンプレートは実在のホスト jmeter.apache.org をアクセスする ように設定されており、そのまま実行できます。

start-button (開始)をクリックすると実行が始まります。実行中の状態で "Graph Results" をクリックすると、 実行状態のグラフがリアルタイムで表示されます。

グラフ表示(Graph Results)

build-web-test-plan-graph-results

数秒で実行が完了するので、再度テスト開始ボタンを押すと、 グラフはその続きから描画されます。同じテストを繰り返すたびに、 赤で表示される「偏差」(測定のばらつき)が徐々に小さくなっていきます。

それでは、build-web-test-plan で定義されているテスト計画について 見ていきましょう。

グローバル定義画面(build-web-test-plan)

テスト計画の全体定義画面

build-web-test-plan-top

ツリーのトップにある build-web-test-plan をポイントした時の画面。 ここはテスト計画のグローバル定義画面です。 最初のうちは触らなくても大丈夫でしょう。

なお日本語環境において、 新規作成の際のこの画面のデフォルトの名前は「テスト計画」です。

メニューからヘルプを選ぶと、 別ウィンドウでその画面の詳細なヘルプ(Webページ)が表示されますが、 残念ながらすべて英語です。 なお、表示されているヘルプ画面の内容は Apache Jmeter - Documentation - Component Reference と同じです。以下、ヘルプから抜粋して必要最小限の説明を行います。

スレッドグループ定義画面(JMeter Users)

スレッドグループ定義画面

build-web-test-plan-thread-group

JMeter Users をポイントした時の画面。 スレッドグループを定義する画面です。

なお日本語環境において、 新規作成の際のデフォルトの名前は「スレッドグループ」です。

スレッドグループは、 ある一連のテストを一斉に実行するユーザー(クライアント)のグループです。 1つのテスト計画の中で複数のスレッドグループを作れます。
 新しいスレッドグループを追加するには、 ツリーのトップ(テスト計画名)をポイントして右クリックし、 >追加>Threads(Users)>スレッドグループをクリックします。

スレッドグループにおける主な設定項目は以下の通りです。 * が付いているのは必須項目、 (*) は他の条件次第で必須です。

名前
スレッドグループの名前。内部的には連番で管理されているようです。
コメント
詳細な説明を入れておきましょう。
サンプラーエラー後のアクション

サンプラーはクライアントからの何らかのアクションです。 たとえばWebサーバのテストであれば、 あるURLをリクエストするためのサンプラーとして 「HTTPリクエスト」を選択します。 サンプラー追加の際は、スレッドグループで右クリックして>追加>サンプラー> HTTPリクエストの順に選択します。他にも様々なサンプラーがあるので 覗いてみてください。
 この例では "Jmeter Users" というスレッドグループにぶら下がっている "Home Page" と "Changes"がサンプラーです。 それぞれ、ホームページと Changes ページへのリクエスト(表示要求)です。

ここでは、たとえばサーバがエラーを返してきた場合など、 リクエストが何らかの原因でエラーになった際どうするかを選択できます。

続行
エラーを無視してテストを続行
Start Next Loop
エラーを無視して次のループの最初から続行
スレッド停止
現在のスレッドを終了
テスト停止
いずれかのサンプルの終了をもってテスト全体が停止
Stop Test Now
即座にテスト全体を停止。 可能であれば現在実行中のサンプルが割り込まれる。
スレッド数 *
同時に何スレッド動かすか(≒最大同時セッション数)
あるユーザの、あるブラウザの1つのタブが1スレッドに相当します。
Ramp-Up期間(秒) *
このスレッドグループについて、1回のテストを回すのに何秒かけるか (スレッドの起動間隔を決定するための係数)。
スレッド数30、Ramp-up期間が120であれば、 各スレッドはおおむね4秒おきに起動されます。
Ramp-up期間が短すぎると、テストの開始時にサーバに高負荷がかかります。
ループ回数 (*)
テストの実行回数。[無限ループ]にチェックを入れると無限にテストします。
スケジューラ (*)
有効にすると、Jmeter が終了する契機が、指定のループ回数終了時、 終了時刻に達した時、持続時間に達した時のうちいずれか早いものになります。 条件チェックは各サンプル間でのみ行われます。 終了条件に達したらスレッドは停止します。 Jmeter は応答を待っているサンプラーには割り込まないので、 実際の終了は状況次第で遅れる場合があります。
開始時刻
スケジューラが有効の場合、この時刻が来るまでテストの実施を待つ。
ただし後述の起動遅延の指定があれば、そちらが優先される。
終了時刻
スケジューラが有効の場合、この時刻までテストが行われる。
ただし後述の持続時間の指定があれば、そちらが優先される。
持続時間
テストをこの時間だけ実行する
起動遅延
この秒数だけテストの実行を遅延する

HTTPリクエスト初期値設定(HTTP Request Defaults)

HTTPリクエスト初期値設定

build-web-test-plan-http-request-defaults

一連のテストでHTTPリクエストを複数発行するなど、 HTTPリクエストを複数回使用する場合は、 この画面で共通パラメータを設定できます。選択は任意です。 選択する場合はスレッドグループで右クリックして、 >追加>設定エレメント>HTTPリクエスト初期値設定を選びます。

今回の例では、共通パラメータとしてリクエスト先のサーバ名 jmeter.apache.org が設定してあります。

設定できる項目はHTTPリクエストと同じなので、 詳細はHTTPリクエストで解説します。

HTTPリクエスト(Home Page)

HTTPリクエスト

build-web-test-plan-http-request

WebサーバーへのHTTP/HTTPSリクエストを定義するサンプラー画面です。 ツリーでこの次にある "Changes" についても、 名前とパスの指定が異なるだけで、後はこの画面と全く同じです。

HTTPリクエストを追加する場合はスレッドグループで右クリックして、 >追加>設定エレメント>HTTPリクエストを選びます。

本画面で未入力の項目については、 前述の「HTTPリクエスト初期値設定」があればその値が使われます。

今回の例では、共通パラメータとしてリクエスト先のサーバ名 jmeter.apache.org が設定してあります。

設定できる項目は以下の通りです:

名前
HTTPリクエスト識別子。
コメント
詳細な説明を入れておきましょう。
Webサーバ
サーバ名またはIP (*)
リクエスト先のサーバの指定。 http:// は不要(書くとエラーになるので注意)。
ポート番号
リクエスト先のポート番号。デフォルトは80。
Timeouts(millisecond)
Connect
接続タイマー
Response
応答タイマー。応答が分割して送られてくる場合は総応答時間が このタイマー値を越える場合があります。"Duration Assertion" (追加>アサーション>アサーションの持続)設定により、 応答時間がかかり過ぎるのを監視できます。
HTTPリクエスト
Implementation
Java, HttpClient3.1, HttpClient4.
(ここでもHTTPリクエスト初期値設定でも)指定がない場合は、 デフォルト値は Jmeter の jmeter.httpsampler プロパティの値に依存する。 これも取得できない場合は HttpClient4 実装が使われる。
プロトコル
HTTP/HTTPS/FILEのいずれか。デフォルトはHTTP
メソッド *
GET, POST, HEAD, TRACE, OPTIONS, PUT, DELETE, PATCH
JAVA 実装ではサポートされない。
Content encoding
(POST, PUT, PATCH, FILE に対して)使われるContent encoding。
文字のエンコーディングとして使われ、HTTP の Content-Encoding ヘッダには影響しない
パス *
リソースへのパス(例:/servlets/myServlet)。
リソースにクエリー文字列パラメータを付加したい場合は 後述の「リクエストで送るパラメータ」に記載すること。 特別なケースとして、パスが "http://" または "https://" で始まっている場合、完全な URL として使われる。 この場合、サーバ/ポート番号/プロトコルの各項目は無視される。 GET および DELETE の場合もパラメータは無視される。
パスはエンコードされないので注意。空白は %20 で記載すること。 また危険な文字はエンコードしておかないと URISyntaxException といったエラーになる場合がある。
自動リダイレクト
利用中の http プロトコルハンドラがリダイレクトに自動追従するようにする。 このためこれらは Jmeter からは見えず、またサンプルとして現れなくなる。 GET と HEAD リクエストの場合にのみ指定すること。 HttpClient サンプラーは POST および PUT についてはこの利用を拒否する。 警告:クッキーとヘッダーの扱いについては後述している。
リダイレクトに対応
これは「自動リダイレクト」が無効の場合にのみ意味を持つ。 セットされた場合、Jmeter のサンプラーは応答がリダイレクトかどうかを チェックし、そうであればそれに従う。 最初のリダイレクトとその後の応答は追加サンプルとして現れる。 親サンプルの URL と データフィールドは最後の(リダイレクトでない) サンプルから取られるが、親のバイトカウントと実行時間は全サンプルの 分を含んでいる。バージョン 2.3.4 以降、初回応答に対しては遅延が 行われるようになった(それ以前はゼロ)。
HttpClient サンプラーが "Redirect requested but followRedirects is disabled" というログメッセージを出すことがあるが、これは無視して良い。
バージョン 2.3.4 以降、Jmeter は '/../segment' 形式のパスについて 絶対および相対リダイレクト URL のいずれにおいても縮める。 たとえば http://host/one/../two は http://host/two にする。 もし必要であれば、Jmeter のプロパティで httpsampler.redirect.removeslashdotdot=false とすることによりこの動作を抑制できる。
KeepAliveを有効にする
Jmeter に Connection: keep-alive ヘッダをセットさせる。 これはデフォルトの HTTP 実装では正しく動作しない。 これは、接続の再利用がユーザ制御配下にないためである。 Apache HttpComponents の HttpClient 実装であれば正しく動作する。
Use multipart/form-data for POST
multipart/form-data もしくは application/x-www-form-urlencoded を使った POST リクエストを使用する。
Browser-compatible headers
multipart/form-data を使う際、Content-Type および Content-Transfer-Encoding ヘッダを使わず、Content-Disposition ヘッダだけを送る。
リクエストで送るパラメータ
パラメータを指定する。
リクエストと一緒に送信されるファイル
アップロードするファイルを指定する。
Proxy Server
サーバ名またはIP
リクエスト先のプロキシサーバの指定。 http:// は不要(書くとエラーになるので注意)。
ポート番号 (*)
リクエスト先のポート番号。デフォルトは80。
ユーザー名
プロキシサーバのユーザー名(オプション)
パスワード
プロキシサーバのパスワード(オプション)
Embedded Resources from HTML Files
全てのイメージとアプレットを繰り返しダウンロードする(HTMLファイルのみ)
Jmeter に HTML ファイルをパースさせ、そのファイルが参照している すべての画像, Javaアプレット, JavaScript, CSS 等についての HTTP/HTTPS リクエストを送る。詳細は後述。
Use concurrent pool.
同時並行コネクションプールを使って埋め込みリソースを取得する。
Size:
埋め込みリソースを取得するための同時並行コネクションプールのサイズ
URLs must match
埋め込み URL としてマッチさせたいものを正規表現で指定する。 たとえば http://example.com/ にある埋め込みリソースのみを ダウンロードした場合は http://example\.com/.* のように指定する。
Source address
(ソースアドレスの型)
[ HTTPClient 実装における HTTP リクエストのみ ] ソースアドレスの値を区別するために型を選択する。
(ソースアドレスの値)
[ HTTPClient 実装における HTTP リクエストのみ ] このサンプルにおける デフォルトのローカル IP アドレスをオーバーライドする。 この場合、Jmeter ホストは( IP エイリアス、 ネットワークインターフェイスデバイス等により IP を複数 持っている必要がある。 この値はホスト名、IPアドレス、もしくは "eth0", "lo", "wlan0" といったネットワークインターフェイスデバイスを指定可能。 httpclient.localaddress プロパティが設定されている場合は、 すべての HttpClient リクエストについてこの値が使われる。
オプションタスク
モニタとして使用
モニタ結果リスナー(右クリック>追加>リスナー>モニタ結果) で使用する。
Save response as MD5 Hash?
これにチェックを入れると、応答はサンプル結果には格納されない。 その代わり、そのデータの 32 文字の MD5 ハッシュが計算されて格納される。 これは大量データのテストをする場合を意図したものである。

自動リダイレクトにおける注意事項

「自動リダイレクト」を有効にしている場合、クッキーは最初の URL に対してのみ送られる。このため、ローカルサーバへのリダイレクトをする Web サイトが予期しない動作を起こすことがある。

たとえば、www.example.com が www.example.co.uk にリダイレクトするケースを考えてみる。この場合、サーバはおそらく両方の URL に対するクッキーを返す。しかし JMeter には最後のホストの分、すなわち www.example.co.uk のクッキーしか見えない。もしテスト計画にある次のリクエストが www.example.co.uk ではなく www.example.com を使っている場合、 正しいクッキーを受け取れなくなる。同様に、 ヘッダは最初のリクエストに対して送られ、リダイレクトに対しては送られない。

マニュアルでテスト計画を作成する場合、この動作は一般的に問題となる。 一方レコーダーを使って作成されたテスト計画であれば、 リダイレクトされた URL からテストが続けられる。

テスト計画に追加できるコンポーネント

ここまでで、ある程度どんなことができそうかが見えてきたと思います。 これまでは HTTP リクエストにに関することがほとんどでしたが、 Jmeter は汎用的に作られており、HTTP 以外にもいろいろな設定が可能です。

ここからは、テスト計画に対して 右クリック>追加 から追加できる様々な コンポーネントについて見ていくことにします。 設定項目名のリンク先は本家の(英語)ドキュメントを向けています。

Threads(Users)

名前 概要
setUp Thread Group テスト前のアクションを実行するスレッドグループ。
通常のスレッドグループとほぼ同じですが、 通常のスレッドグループの実行に先立って実行されます。
tearDown Thread Group テスト後のアクションを実行するスレッドグループ。
通常のスレッドグループとほぼ同じですが、 通常のスレッドグループの実行が終わってから実行されます。
スレッドグループ 通常のグループ(前述)

Test Fragment

名前 概要
Test Fragment Include Controllerモジュールコントローラ と組合せて使います。

設定エレメント

名前 概要
CSV Data Set Config 変数の中に読み込んでおくべき値を CSV ファイルで与える
FTP リクエスト初期値設定 FTP 接続テスト時のデフォルト値を設定する
HTTP Cache Manager HTTP リクエストのスコープに対してキャッシュ機能を追加する
HTTP クッキーマネージャ HTTP リクエストにおいてクッキーを扱う機能を追加する
HTTP ヘッダマネージャ HTTP リクエストのヘッダを追加または上書きする
HTTP リクエスト初期値設定 HTTP 接続テスト時のデフォルト値を設定する
HTTP 認証マネージャ 制限されたページヘのログインなどの認証機能を追加する
Java リクエスト初期値設定 Java テスト時のデフォルト値を設定する
JDBC Connection Configuration JDBC の接続設定を行う
Keystore Configuration キーストアの設定を行う
LDAP Extended Request Defaults LDAP拡張リクエスト のための設定を行う
LDAP リクエスト初期値設定 LDAPリクエスト のための設定を行う
MongoDB Source Config MongoDB Script サンプラーのための接続設定を行う
Random Variable ランダム文字列を生成する
TCP サンプラー設定 TCP サンプラーのデフォルト設定を行う(任意の文字列を送る、など)
カウンタ スレッドグループの中から参照可能なカウンタを生成する
シンプル設定エレメント サンプラー中に任意の値を追加したり上書きしたりする
ユーザ定義変数 スレッドグループの中から参照可能な任意の変数を定義する
ログイン設定エレメント ユーザ名とパスワードの設定を行う

タイマ

名前 概要
BeanShellタイマ BeanShell を使ったタイマー
BSFタイマ BSF スクリプトを使ったタイマー
JSR223タイマ JSR223 スクリプトを使ったタイマー
Poisson Random Timer 各スレッドリクエストのたびにランダム時間停止する。 停止時間能総計はポアソン分布の値になる。
Synchronizing Timer X個のスレッドがブロックするまでスレッドをブロックし、それら同時に開放する。 テスト計画の様々な場所で瞬間的な高負荷を与えることが可能。
ガウス乱数タイマ 各スレッドリクエストのたびにランダム時間停止するが、 インターバル時間のほとんどは特定の値の近辺になる。 遅延時間の総計はガウス分布に従う(中央値 0、標準偏差 1.0)。
一様乱数タイマ 各スレッドリクエストのたびにランダム時間停止するが、 停止間隔は一様乱数に従う。 遅延時間の総計は乱数値+オフセット値の合計。
定数スループットタイマ トータルのスループットが一定値に近づくように停止時間を調整する。
定数タイマ 各スレッドリクエストのたびに指定した秒数分遅延する。

前処理

名前 概要
BeanShell PreProcessor サンプルを実行する前に任意のコードを適用する
BSF PreProcessor サンプルを実行する前に BSF スクリプトを適用する
HTML リンクパーサ HTML 応答を解析してリンクとフォームを抽出する
HTTP URL-Rewriting 修飾子 URL 書き換えを行うタイプの Web サービスでセッションの引き回しを行う
JDBC PreProcessor テストに先立って SQL ステートメントを実行する。 テスト用に任意のデータを予め入れておきたい場合等に使う。
JSR223 PreProcessor サンプルを実行する前に JSR223 スクリプトを適用する
RegEx User Parameters HTTP リクエストから正規表現を使ってパラメータを抽出する。 これで取得した値を別の HTTP パラメータに対して設定可能。
ユーザーパラメータ 個別のスレッドに対してユーザ変数を設定する

後処理

名前 概要
BeanShell PostProcessor サンプルを実行した後に任意のコードを適用する
BSF PostProcessor サンプルを実行した後に BSF スクリプトを適用する
CSS/JQuery Extractor CSS/JQuery ライクなセレクタの文法を使ってサーバの応答から値を抽出する。
Debug PostProcessor 直前のサンプラーのプロパティ、Jmeter の変数やプロパティ、 システムのプロパティ等からサブサンプルを生成する。 これらの値はリスナー応答データペインの「結果をツリーで表示」で参照可能。
JDBC PostProcessor サンプルを実行した直後に SQL ステートメントを実行する。 テスト後に状態を元に戻したい場合等に使う。
JSR223 PostProcessor サンプルを実行した後に JSR223 スクリプトを適用する
XPath Extractor 構造化応答(XML/(X)HTML)から XPath クエリー言語を使って値を抽出する
アクションハンドラの終了状態 関係するサンプラーが失敗したら、レッドまたはテスト全体を終了する
正規表現抽出 Perl 互換正規表現を使ってサーバ応答から値を抽出する。 後処理用ハンドラとしては、 このエレメントはそのスコープにおいて各サンプルの後で実行され、 正規表現を適用し、リクエストされた値を抽出し、 テンプレート文字列を生成して結果を与えられた変数名に格納する。

アサーション(成立条件チェック)

名前 概要
BeanShell アサーション BeanShell スクリプトを使ってアサーションチェックを実行する
BSF Assertion BSF スクリプトを使って直前のサンプルの状態をチェックする
Compare Assertion スコープの範囲内でサンプルの結果の比較を行う。 大量のリソースを消費するので負荷テスト時は使用しないこと。
HTML Assertion JTidy を使って応答データの HTML 文法をチェックする
JSR223 Assertion JSR223F スクリプトを使って直前のサンプルの状態をチェックする
HTML Assertion JTidy を使って応答データの HTML 文法をチェックする
MD5Hex アサーション 応答データの MD5 ハッシュをチェックする
SMIME Assertion Mail Reader サンプラーの結果を受け取り、 MIME メッセージのボディ部分が署名されているかどうかをチェックする
XML Schema Assertion XML スキーマに対する応答を検証する
XML Assertion 応答データの XML ドキュメントの書式が正しいかをテストする。 ただし DTD 等のバリデーションまでは行わない。
XPath Assertion ドキュメントが well-formed であるかや DTD に対するバリデーションのオプションを持つかをテストするか、 もしくは JTidy を通して XPath のテストを行う。
アサーション 応答の中の様々な項目と比較するためのパターン文字列を設定する。 パターン文字列には Perl 互換の正規表現かプレインテキストを指定可能。
アサーションの持続 それぞれの応答を与えられた時間内に受け取ったかどうかをテストする。 制限時間を越えて受信した応答は失敗としてマークされる。
サイズアサーション それぞれの応答のサイズ(バイト数)が正しいかをテストする。 等しい、より大きい、より小さい、等しくない、が指定可能。

リスナー(テスト結果の閲覧、レポート)

名前 概要
Aggregate Graph Aggregate Graph(集約グラフ)はAggregate Reportと似ている。 大きな違いとしては、集約グラフは簡単に棒グラフを作成でき、 またそのグラフを PNG ファイルとして保存できる。
BeanShell Listener BeanShell を使ってサンプルを保存したりするなどの処理を行う。
BSF Listener サンプルの結果に対して BSF スクリプトコードを適用する。
Comparison Assertion Visualizer Compare Assertionエレメントの結果を表示する。
Distribution Graph (alpha) 応答時間としてユニークな値が発生するたびにバーを表示する。 リソースを消費するので負荷テストの場合は使用しないこと。
JSR223 Listener サンプルの結果に対して JSR223 スクリプトコードを適用する。
Response Time Graph テストの進行に従って変化する応答時間の折れ線グラフを描画する。 同じタイムスタンプで複数のサンプルがある場合は中央値を表示する。
Summary Report それぞれの異なった名前のリクエストについて表形式のレポートを作成する。 Aggregate Report と似ているが、あれほどはメモリは喰わない。
Assertion Results アサーションのビジュアライザは試行された各サンプルのラベルを表示する。 テスト計画の一部の失敗したアサーションも報告する。 リソースを消費するので負荷テストの場合は使用しないこと。
Graph Results すべてのサンプル時間についてのシンプルなグラフを生成する。 グラフの下の方から、現在のサンプル(黒)、 現在の全サンプルの平均(青)、現在の標準偏差(赤)、 現在のスループットレート(緑)がミリ秒単位で表示される。 リソースを消費するので負荷テストの場合は使用しないこと。
Simple Data Writer このリスナは結果をファイルに記録するが UI には出さない。 これは GUI を使うことによる余計なオーバーヘッドを避けるため。 CLI で起動する場合は -l フラグでデータファイルを作成できる。 保存するフィールドは JMeter properties で定義可能。 詳細は jmeter.properties を参照のこと。
Spline Visualizer サンプルの選択数に関わらず、 テスト開始から終了までのすべてのサンプル時間のビューを提供する。 スプライン曲線には10個の点があり、 ぞれはサンプルの10%を表している。 ぞれはスプラインロジックで連結され、 一つの連続した線として表示される。 グラフはウィンドウの中で自動的にスケールされるため、 比較の際には注意が必要。 リソースを消費するので負荷テストの場合は使用しないこと。
メーラービジュアライザ テストがサーバから多数の失敗応答を受信するとメールを送ります。
モニタ結果 サーバのステータスを表示するモニタ。Tomcat 5 用に設計されているが、 どのサーバコンテナでもステータス・サーブレットを移植できるので、 このモニタを利用可能。 Tomcat 5 以上が必要。
応答をファイルへ保存 このテストエレメントはテスト計画のどこにでも設定可能。 各サンプルは自らのスコープにおいて、応答データのファイルを生成する。 基本的には機能テストにおいて使われるが、 「結果をツリーで表示」リスナーでサーバからの巨大な応答を表示する のにも利用可能。
結果の概要を作成 このテストエレメントはテスト計画のどこにでも設定可能。 その時点までの結果サマリーをログファイルまたは標準出力に生成する。 実行と差分合計が表示される。出力はn秒(デフォルトは3分)毎に 行われ、同時に行われる複数のテストは同期が取られる。 設定項目は jmeter.properties ファイルを参照のこと。
結果をツリーで表示 全サンプルに対する応答をツリー形式で表示する。 ドロップダウンリストにより表示する応答の種類を選択可能。 大量のメモリを消費する。
結果を表で表示 各サンプル毎の行を生成する。 デフォルトで表示するのはメイン(親)サンプルのみ。 "Child samples?" にチェックを入れればサブ(子)サンプルも表示する。 大量のメモリを消費する。
統計レポート テストにおける異なった名前のリクエスト毎に表の行を生成する。

スレッドグループに追加できるコンポーネント

これまでは、テスト計画全体に対して追加できるコンポーネントについて説明しました。 ここからは、スレッドグループに対して 右クリック>追加 から追加できる様々な コンポーネントについて見ていくことにします。

テスト計画全体と重複しているコンポーネントについては前述の説明を参照してください。 なお、設定項目名のリンク先は本家の(英語)ドキュメントを向けています。

ロジックコントローラ

ロジックコントローラはループや条件分岐など、 複雑な制御を行うためのコンポーネントです。

名前 概要
ForEach コントローラ 関連する変数の組合せの値を順に変えながらループします。 サンプラー(またはコントローラ)を ForEach コントローラに追加すると、 それぞれのサンプラー(またはコントローラ)が変数の値を変えながら 各サンプル毎に1回以上実行されます。
If コントローラ 条件分岐を行う。条件は JavaScript または変数表現で指定する。 後者の場合は "Interpret Condition as Variable Expression?" にチェックを入れる。
Include Controller 外部 jmx ファイルのインクルードを行う。 ファイル名指定では変数/関数は使えない。 includecontroller.prefix プロパティでパス名のプリフィックスを制御可能。
Runtime Controller 子供の実行時間の上限を設定する。
Switch Controller 繰り返しのたびに配下のエレメントのいずれかを実行するが、 それらを順に選ぶのではなく、スイッチの値に従って選ぶ。 スイッチには起動したいエレメントの名前または番号(0オリジン) をセットする。
While Controller 指定した条件が "false" になるまで子供を実行する。
インターリーブコントローラ インターリーブコントローラに対して生成的コントローラまたは ループコントローラを追加すると、 繰り返しループのたびに他のコントローラの間に挟まった形で実行する。
シンプルコントローラ 他のサンプラーやロジックコントローラをまとめるもの。 他のロジックコントローラと異なり、 ストレージデバイスに対する機能的な処理は特に何も行わない。
スループットコントローラ 名前が適切ではないのだが、 このコントローラはスループットを制御するものではない。 スループットを調整するには タイマ>定数スループットタイマ を参照して欲しい。 スループットコントローラは実行の頻度を制御するもので、 パーセント実行と全体実行という2つのモードがある。
トランザクションコントローラ ネストしたテスト要素の実行に要した時間を測定するための 追加サンプルを生成する。
モジュールコントローラ 現在のテスト計画に対して、 実行時に代替のテスト計画フラグメントのためのメカニズムを提供する。 テスト計画フラグメントはコントローラとすべてのテスト要素 (サンプラー等)から構成される。 フラグメントはどのスレッドグループやワークベンチ上にあってもよい。 フラグメントがスレッドグループにある場合、フラグメントが実行 されないように例外としてそのコントローラを無効にできる。 またはフラグメントをダミーのスレッドグループに入れて、 スレッドグループ全体を無効にすることもできる。
ランダム順序コントローラ シンプルコントローラと同様に各子要素を高々1回実行するが、 ノードの実行順序はランダムとなる。
ループコントローラ ループコントローラに対して生成的コントローラまたは ロジックコントローラを追加すると、それらを特定回数分実行する。
一度だけ実行されるコントローラ 当該コントローラ配下をスレッド毎に一度だけ実行する。
乱数コントローラ インターリーブコントローラと同様だが、 サブコントローラとサンプラーを順々に実行するのではなく、 それぞれのパスのたびに1つをランダムに実行する。
記録コントローラ プロキシサーバにサンプルの記録場所を指定するためのプレースホルダ。 シンプルコントローラと同様に、テストの実行中は何もしない。 ただし HTTP(s) Test Script Recorder を使っての記録中は、デフォルトでは記録コントローラに 記録されたすべてのサンプルが保存される。

サンプラー

サンプラーはサーバなどの試験対象に対して、 何らかの指示やリクエストを行うためのコンポーネント。 サンプラーによりサンプル結果が生成され、 それらの結果はリスナーにより参照できる。

名前 概要
Access Log Sampler (実験中機能)アクセスログを読んで HTTP リクエストを生成する
AJP/1.3 Sampler HTTP リクエストのひとつ
BeanShellサンプラー BeanShellスクリプト言語を使ってサンプラーを書く
BSF Sampler BSFスクリプト言語を使ってサンプラーを書く
Debug Sampler Jmeterの全変数/プロパティの値を書き出すサンプルを生成する
FTPリクエスト FTPサーバに対してファイルの取り出し/アップロードのリクエストを送る
HTTPリクエスト Webサーバに対してHTTP(s)リクエストを送る。 また取得したコンテンツをパースして、 リンク先の画像や埋め込みリソースを取り出すためのリクエストを送ることも可能。
Javaリクエスト org.apache.jmeter.protocol.java.sampler.JavaSamplerClient インターフェイスを実装する Java クラスを制御する。
JDBC Request データベースに対してJDBCリクエスト(SQLクエリー)を送る
JMS_Point-to-Point (ベータ機能)ポイントツーポイント(キュー)を通して JMSメッセージを受信する。
JMS Subscriber (ベータ機能)指定された宛先(トピック/キュー)に対する メッセージを購読する。
JSR223 Sampler JSR223スクリプト言語を使ってサンプラーを書く
JUnit Request 現在の実装では標準的な Junit の慣習と拡張機能をサポートしている
JUnit Request 現在の実装では標準的な Junit の慣習と拡張機能をサポートしている
LDAP Extended Request 8種類の異なったLDAPリクエストを送る。 より実際のLDAPセッションに近いシミュレーションが行える。

トラブル対応

Out of Memory

徐々に大きな負荷をかけていくと、最初に起こるのがこれです。 いきなり GUI ウィンドウが消える場合もあります。 起動時のコンソール( Windows なら cmd.exe )が残っていれば、
Uncaught Exception java.lang.OutOfMemoryError: OutOfMemoryError. See log file for details.
というエラーメッセージが残っているかもしれません。 また jmeter.log ファイルにも、たとえば以下のように原因が記載されます。
2014/09/08 10:17:04 ERROR - jmeter.JMeter: Uncaught exception:  java.lang.OutOfMemoryError: OutOfMemoryError
    at sun.awt.windows.WToolkit.eventLoop(Native Method)
    at sun.awt.windows.WToolkit.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

テストで使用中の端末にメモリの余裕があれば、jmeter{,.bat}ファイルの以下の行でヒープ領域が増やせます。

set HEAP=-Xms512m -Xmx512m

-Xms はメモリ割り当てプールの初期サイズ、-Xmx が最大サイズです。 デフォルトでは、いずれも 512m(512MB) になっています。

実践例

筆者が行った実践例を参考までにご紹介します。 この設定では、実行中に Jmeter がメモリ不足で異常終了したため、 ヒープを 1GB(1024MB) に増やして実行しました。

practical-example

コンポーネント 設定項目 設定値
スレッドグループ サンプラーエラー後のアクション テスト停止
スレッド数 400
Ramp-Up期間(秒) 20
ループ回数 1
ユーザー定義変数 vhost www.example.com
HTTPリクエスト初期値設定 サーバ名またはIP ${vhost}
Implementation HttpClient4
プロトコル http
トランザクションコントローラ (特になし)
トップページ(初回) パス /
全てのイメージとアプレットを繰り返しダウンロードする 有効
ループコントローラ ループ回数 10
トップページ(リトライ) パス /
全てのイメージとアプレットを繰り返しダウンロードする 無効
一様乱数タイマ 最大遅延時間(ミリ秒) 5000

想定するシナリオとしては以下のようになります。

Go Topページの先頭に戻る

ここもわかりやすそうです(英語): How to use Controllers in JMeter

Go backサイトトップに戻る