読者です 読者をやめる 読者になる 読者になる

Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

JMeterでJSFの負荷試験にチャレンジ

JMeter JSF NetBeans GlassFish Java EE 6

少し前に「JenkinsとJava EE6で取り組んだ初めてのCI」というエントリを書きましたが、図の負荷試験の所は「これから」となってます(^^;

本来は画面開発中でも負荷試験を交えながら作るべきなのだと思うのですが、自分自身、開発にかなり時間を割く必要もあって、そういう状況にできませんでした(-_-;言い訳に過ぎないのですが、CIの仕組み入れるのもやっとだった環境なんで…。

が、まだ時間はある!ということでGWを使ってJMeterを触ってみます。

ちなみに自分の負荷試験の記憶は

「みんなー集まってー。いくよー、いっせーのー、せっ」

だったり…(^^;マジです。

数年前で、WebじゃなくWindows Formでしたが…。
今のVisualStudioだとフォームの自動テストもずいぶん簡単にできるようなので、もうそんなことはしないはず。。そしてWeb開発ならばなおさら。。

JMeter関連の参考情報

JMeterに関しては詳しい情報が日本語でも揃ってますので、ここでの説明はJMeter+JSFに絞りたいと思います。
ちなみに参考にさせて頂いたサイトをまとめておきます。

本家のサイトです。User Manualなど、情報は豊富ですね。もちろん英語ですが(^^;

Web系の負荷試験=JMeter、というイメージしかなかったのですが、コマンドラインツール含めて色々あるんですね。
今回はJMeterを選びましたが、色々トライしてみたい!
なお、上記サイトはJMeterのインストール手順と設定手順も詳しいので参考になりました(^^)

先のサイトにもリンクがありますが、JMeterの詳しい使い方はこの資料を読むのが良さそうです。自分もこれから読んでいきます!※PDF直リンです。すいません。

最初のサイトにも紹介がありますが、JMeterって画面の操作記録を取って使うことができるんですね…(^^;実は知らなかったのです。このサイトを立ち上げた直後ぐらいに初めてJMeterを少し触ったのですが、それを知らなかったのでえらく苦戦しました。この機能を知ってる、知らない、で負荷テスト工数に大きく差がでそうです。

JSFJMeterで参考にさせて頂いたサイト。
JSFを使ったページの場合、ViewStateの関係で少し工夫がいるんですね。それを知らなかったので最初苦戦しました(^^;

最後に、上記サイト内からもリンクがありますが、JMeterJSFのviewStateを設定する方法に関してはApacheのMyFacesのこのページが参考になりました。

えーっと、もう自分の記述は不要な気も(^^;
するけど、ここからは自分が実際に設定した内容を備忘メモしておきます。
興味がある方は以下「続きを読む」でどうぞ~。

トライした環境

通常は試験環境などで行ったりするものかと思いますが、まずはお試し、ということで
IDE実行でトライしました。あとNetBeansのプロファイラを一緒に使ってみたかったので。

OS:Windows 7 Professional
実行環境:NetBeans 7.3 & GlassFish 3.1.2.2
負荷ツール:JMeter 2.9

で、まずは簡単なログイン画面的なものをサンプルレベルで設けて、単にログインするだけ。というのをJMeterで行います。
f:id:kikutaro777:20130504143154j:plain
サンプルですが一応JSF+EJBでDBから値も取得してます。

JMeterで操作記録取るための設定

参考サイトにあるようにプロキシを使うことでブラウザの画面操作から記録が取れるとのことで、「コントロールパネル」->「インターネットオプション」から「接続」タブを選択

f:id:kikutaro777:20130504143224j:plain

「LANの設定」を選んで

f:id:kikutaro777:20130504143240j:plain

プロキシサーバーのチェックいれます

あれ…昨日はこのままテキストが入力になったんだけど…なぜかならない(-_-;
仕方ないので詳細設定でHTTPに以下のようにいれました。

f:id:kikutaro777:20130504143255j:plain

8080はGlassFishが使うので、8090とか。

これで準備完了です。

JMeterで操作記録を取る

jmeter.batを叩いて起動します。
初期だと「テスト計画」「ワークベンチ」というノードが見えている状態です。

f:id:kikutaro777:20130504143348j:plain

「テスト計画」を右クリックしたメニューから「スレッドグループ」を追加します。

f:id:kikutaro777:20130504143528j:plain

スレッドプロパティでスレッド数などの設定ができますが、いったんここでは初期のままにしました。

続けて「ワークベンチ」を右クリックしたメニューから「HTTPプロキシサーバ」を追加します。

f:id:kikutaro777:20130504143707j:plain

先にプロキシのポートを8090にしたので、8080となっているのを書き換えました。

f:id:kikutaro777:20130504143729j:plain

この状態でNetBeansからWebアプリケーションを起動してみます。
ここではとりあえずデバッグモードで起動しています。

f:id:kikutaro777:20130504143812j:plain

f:id:kikutaro777:20130504143852j:plain

で、当たり前ですがエラー。JMeterでプロキシサーバの設定しただけで起動してないからです。

というわけで、JMeterのHTTPプロキシで「開始」ボタンを押します。

f:id:kikutaro777:20130504144019j:plain

再度Webアプリケーションにアクセスすると、無事表示されます。
キャプチャするの忘れちゃった…(^^;

で、このまま操作記録したい操作を行います。

ここでのサンプルはログインページでユーザ名とパスワードを入れてログインボタン押してログインするだけ。です。

JMeterのツリーをみると

操作前に
f:id:kikutaro777:20130504144304j:plain
となっているのが、操作後
f:id:kikutaro777:20130504144319j:plain
となってスレッドグループに操作が記録されていけばOKです。展開すると以下のような感じ。
f:id:kikutaro777:20130504144410j:plain

ログインしたので、プロキシサーバを「停止」して、最初に設定したインターネットオプションのプロキシ設定も元に戻します。忘れがちなので注意です!

記録した操作を実行してみる

記録は無事できたので、実行してみます。
負荷をかけるのではなく、ちゃんとHTTPの会話ができるかどうかの確認です(^^;

リクエストを確認するため、スレッドグループにリスナーの「結果をツリーで表示」を入れました。
f:id:kikutaro777:20130504144856j:plain

で緑の開始ボタン(またはメニューから開始)を押します。すると以下の警告が出ます。
f:id:kikutaro777:20130504144957j:plain
ここまで設定したものを保存しておいてちょ、ってことで、保存しときます。
f:id:kikutaro777:20130504145025j:plain

で、実行されると…
f:id:kikutaro777:20130504145053j:plain

オールグリーンだから成功!?とか思っちゃいますが、私のJSFサンプルの場合はResponse Code 302となってました。
ちなみにGlassFishをみると
f:id:kikutaro777:20130504145157j:plain
なんかエラーなってますね。ビューの復元ができない、と。

JSFで生成されたxhtmlをみると末端にviewStateというタグがあって、乱数みたいな値が入ってます。
こいつが復元データとして利用されるので、上手く設定しないと駄目ということのようです。

記録した操作をJSFとして正しく実行できるようにする

最初に書いたApache MyFacesのサイトを参考に以下追加します。

「スレッドグループ」の右クリックメニュー「追加」「後処理」から「正規表現抽出」を選びます。

f:id:kikutaro777:20130504145734j:plain

参照名、正規表現、テンプレート、一致番号をTesting a JSF Application with JMeterにあるように入れてみます。

f:id:kikutaro777:20130504150001j:plain

さらに、これを利用して、実際のPOST情報を書き換える必要があります。
スレッドグループの中の操作情報でログイン情報をPOSTするものを選びます。
で、Parameters、というタブにポスト情報が並んでいるのですが、ここにjavax.faces.ViewStateというのがあって、乱数みたいな値が入ってます。
f:id:kikutaro777:20130504150419j:plain

この値を、先ほど正規表現で抽出された値の変数に変えます。
f:id:kikutaro777:20130504150506j:plain

それからもう1つ、セッションID情報がcookieにあるので、HTTPクッキーマネージャを追加しました。
f:id:kikutaro777:20130504150612j:plain
こいつは単に追加するだけで大丈夫でした。

で、再度実行!!!

f:id:kikutaro777:20130504150640j:plain

レスポンスが変わり、成功したっぽい!
で、GlassFishの自前のログをみると、ちゃんとログイン成功になっていました(>_<)

あとは統計とかグラフとか

ここまでの設定、実行で、うまくログインすることができるようになったので、あとはスレッド数や期間、ループ回数などを設定して、本格的に負荷をかけることができます。

またリスナーの統計レポートやグラフ表示を追加することで
f:id:kikutaro777:20130504151022j:plain
f:id:kikutaro777:20130504151029j:plain
分析もできる!

NetBeansのプロファイラ起動に負荷かけてモニタリングなんかも。
f:id:kikutaro777:20130504151112j:plain

今回は簡単なログインサンプルでやりましたが、実アプリだとまだ色々壁があるんだろうなぁ(^^;頑張らねば。

にほんブログ村 IT技術ブログへ
にほんブログ村
にほんブログ村 IT技術ブログ Javaへ
にほんブログ村