明日から仕事ということで、鈍った頭脳を多少は復活させるために、JMeterの勉強をしてみました。宿題でもあったので。
まずは、ここから、JMeter2.0.2.zipをダウンロード。
解凍して、binディレクトリにあるApacheJMeter.jarをダブルクリックすれば起動できます。簡単・・・。
パフォーマンス測定の対象とするため、Linux Zaurus上のApache+PHP+MySQL用の簡単なアプリケーションを作成しました。
- index.html(ログインページ。)
- login.php(MySQLのjmuserテーブルを参照し、ログイン成功なら、ユーザ名をSessionに格納してinput.phpにリダイレクト。)
- input.php(1項目だけの入力画面。Sessionからユーザ名を取得して表示。logout.phpへのリンクもある。)
- confirm.php(input.phpで入力された値を表示する確認画面。この画面を表示する前に乱数でKEYを作成し、Sessionと画面のhidden値として格納しておく。)
- regist.php(confirm.phpで格納されたSessionのKEYと、画面から送られたhidden値が同じなら、input.phpで入力した値をMySQLのforjmテーブルに格納。input.phpにリダイレクト。)
- logout.php(Sessionに格納された値を破棄して、index.htmlにリダイレクト。)
極々、簡単なものですが、confirm.phpが乱数でKEYを発行するあたりがポイント。Strutsでいうところの、Tokenっぽいものを意識しています。
さて、これをテストするために、テスト計画を作成します。
テスト計画の作成は、スレッドグループを作って手動で作っていくのも良いですが、もっと簡単に作るために、JMeterのプロキシ機能を使用した自動録画を行います。JMeterのワークベンチから「追加→Non-Testエレメント→HTTPプロキシサーバ」を選び、ポート番号を指定して「開始」ボタンを押すだけ。
あとは、ブラウザのプロキシを指定してから、テストケースどおりに操作を行います。
操作したとおりにHTTPリクエストサンプラーが追加されますので、それを下図のように構成します。
これは、いろいろ工夫した後なので、説明していきます。
HTTPリクエストの設定
自動で録画されるので、これといった設定はしていませんが、今回のアプリケーションはリダイレクトを多用しているので、リダイレクトされる可能性のあるHTTPリクエストは、「リダイレクトに対応」をONにしています。
ループコントローラとインタリーブコントローラ
今回のテストケースでは、7つのHTTPリクエストを使用しています。これは上から順に実行していくものなので、インタリーブコントローラを使用して1つずつ、上から下に順に実行させます。
インタリーブコントローラはプログラム言語でのforeachのようなもので、1回のループで1つの要素を処理します。そこで、上位にループコントローラを置き、そのループ回数として要素数である7を指定します。
今回は、ログインからログアウトまでを1つの単位としているので、「一度だけ実行されるコントローラ」は使用していません。
HTTPクッキーマネージャ
Sessionを使用しているので、追加しました。特にSession値の差し替えは必要ないので、追加しただけです。
HTMLリンクパーサ
最も苦労したのが、これです。confirm.phpで乱数でKEYを発生させているため、confirm.phpがhidden値として画面に送り込んだKEYを、regist.phpのPOSTパラメータにセットしなければなりません。
HTMLリンクパーサを使用すると、URLのパラメータや、FORMにセットされている値を取得することが出来ます。
今回は、HTMLリンクパーサを追加して(本当に追加するだけ)、regist.phpの「リクエストで送るパラメータ」に、値として「.*」を記述しました。(名前は送りたいパラメータ名です。)
あとは、結果を見るためにリスナーをいくつか追加してあります。
テストの実行は、メニューの「実行→開始」でOKですが、その前にテストする負荷を設定します。
スレッドグループのスレッドプロパティがそれで、スレッド数に想定ユーザ数をセットします。
Ramp-Up期間は、スレッド数に設定したスレッドが立ち上がるまでの時間(例えばスレッド数:10、Ramp-Up期間:10秒ならば、1秒毎に1スレッド立ち上がり、10秒で10スレッドになります)、ループ回数は1スレッド毎のループ回数です。
これで、JMeterの基本的なところは押さえてあると思いますが、他に、アサーションも使ってみました。
JMeterでは、リクエストが成功したかどうかが分かります。しかし、アサーションなしでは、単にHTTPリクエストが成功したかだけであり、アプリケーションがちゃんと動いているかは分かりません。アサーションを追加すると、HTTPレスポンスの中身を検証して、成否の判定をすることが出来ます。
今回は、regist.phpにアサーションを追加し、regist.phpが成功するとinput.phpにリダイレクトされるため、リダイレクト後のinput.phpに必ず表示される値を抜き出して、それを成否判定のテストパターンとしました。
最後に、参考にしたサイトを紹介します。
STACK*(JMeterの連載あり)