// 下階層用テンプレート #topicpath ---- //ここにコンテンツを記述します。 [[JMeter - Apache JMeter>http://jakarta.apache.org/jmeter/]]はWEB向けのPure Javaなストレスツールです。WEBアプリケーションに対して負荷をかけるためのツールですね。このツールはレポーティング機能も充実しているので、性能テストや負荷テストなどに利用すれば作業を効率よく行うことができそうです。 #contents **ダウンロード [#yc0a4fcb] [[The Jakarta Site - JMeter Downloads>http://jakarta.apache.org/site/downloads/downloads_jmeter.cgi]]よりダウンロード可能です。インストールも解凍するだけですね。 **やってみる [#sab3fc53] 実際にやってみます。 シナリオとしては -http://localhost:8080/stressTest/index.do でログイン画面表示 -http://localhost:8080/stressTest/login.do でログインアクション->ログイン中画面 -http://localhost:8080/stressTest/logout.doでログアウトアクション->ログアウトしました画面->元のログイン画面 -ログアウトアクションでは、トークンチェックしている なんてモノをやってみようと思います。ログインアクションはパラメタとしてuserid,password を取ります。んで、それぞれ userid=hoge password=fuga だったらOKとロジックがくんであります。またトークンチェックとはいわゆる[[Strutsの同期トークンの機能>Struts/同期トークンで二度押しなどをチェックする]]で、ログアウトのリンクの後ろに /stressTest/logout.do?org.apache.struts.taglib.html.TOKEN =166176d36f24bb9a0c77df7f368d2fd4 というリクエストごとに異なる値が載っているというモノです。このパラメタは毎回異なるので、JMeterの設定は注意が必要です。 &color(red){絶対に他者のサイトにストレスをかけないでください。他者のサイトにストレスをかけた場合、最悪の場合損害賠償を請求されるかもしれないので、十分ご注意ください。}; では実際にストレステストのシナリオを作っていこうと思います。 ***全体の設定 [#g43446a6] テスト計画で右クリックして 追加 > スレッドグループ で追加します。 #ref(01.png) 下記のスレッドグループ設定では、 -スレッド数 -何秒かけて起動するか((10秒と設定したら、上のスレッドを10秒かけて起動する)) -ループ回数(上の設定を何回ループするか) などを設定します。たとえば -スレッド数 5 -Ramp-Up期間 10秒 -ループ回数 1 とした場合、10秒で5スレッドを起動するので、2秒に1回(初回の)クエリが発行されることになります。 #ref(02threadGroup.png) ***接続先の指定 [#n9577943] 次に接続先のサーバを指定します。テスト計画で右クリックして 追加 > 設定エレメント > HTTPリクエスト初期値設定 で追加します。 #ref(03Init.png) ここでは接続先のサーバ名やプロトコルなどを一括で指定することができます。すべてのクエリに載せたいパラメタなんかもかけそうです。 #ref(04Init.png) ***各クエリの追加 [#h0b5d90d] 次に各画面ごとのクエリを追加していきます。クエリは スレッドグループを右クリックして 追加 > サンプラー > HTTPリクエスト で追加します。 #ref(05sampler.png) サンプラーの画面では -パス(URLのコンテキスト以下) -GETかPOSTか -クエリのパラメタ などを指定します。たとえば下の例だとリクエストパスを /stressTest/index.do と指定しています。メソッドはGetです。 #ref(06sampler.png) 別のサンプラも作ってみます。ログイン画面表示後の次のアクションであるログイン処理のサンプラを作成します。下記のようにスレッドグループの下に[[ログインアクション>http://www.masatom.in/cgi-bin/viewvc.cgi/trunk/stressTest/source/nu/mine/kino/stresstest/LoginAction.java?root=Others&view=co]]を追加しました。このログインアクションはクエリとして userid,password を取るので「リクエストで送るパラメータ」の欄にパラメタとして追加してあります。パラメタの値は可変である場合が多いですが、サンプルは固定で問題ないのでと、りあえず固定で値hoge,fugaを設定しています。 #ref(07parameter.png) ここまでで一度実行してみます。JMeterのメニューから 実行 > 開始 でストレステストが開始されます。サーバのログなどを見ると負荷がかけられているのが分かると思います。 ***計測結果をみてみる [#v36eef60] 先ほどサーバに負荷をかけしましたが、レスポンスタイムやスループットがどれくらいでているかはリスナーという機能で見ることができます。スレッドグループを右クリックし 追加 > リスナー > 結果を表で表示 or 統計レポート でリスナーを追加します。 #ref(08rep.png) これらのリスナーはいわゆるレポート機能で「結果を表で表示」はリクエストごとのレスポンスタイムを見ることができます。「統計レポート」はサンプラーごと(=画面ごと)の平均((平均や最小、最大ほか))レスポンスタイム、スループットなどを見ることができます。 -結果を表で表示 #ref(09table.png) -統計レポート #ref(10stat.png) ***戻り電文をアサーションする [#e429ae02] 次は戻り電文のアサーションをしてみたいと思います。アサーションは、想定しているhtmlが返ってきているかどうかを確認するために用います((ホントにログインできてんのかな??とかをチェックできますね))。 使い方ですが、アサーションしたいアクション(サンプラ)で右クリックし、 追加 > アサーション > アサーション で追加します。 #ref(11assertion.png) アサーションの画面ではどのようなアサーションを行うかを指定します。下の例では、ログイン後に返ってくるhtml内に「ログインできました!」という文字列が含まれているかどうかをチェックしています。 #ref(12assertion.png) これでテスト実行しましょう。アサーションの結果は先のリスナ「結果を表で表示」で確認することができます。パスワードなどが間違ってて、戻りhtmlに「ログインできました!」という文字列が含まれていなかった場合は、ステータスが「!」などになるわけですね。 #ref(13ok.png) アサーションOK。の場合。 #ref(14ng.png) アサーションNG。の場合。 ***トークンなど、前画面の値をリクエストにセットする [#gc45366b] 続いてログアウトのサンプラを追加したいと思いますが、先の通りログアウトアクションはトークンチェックをしています。具体的にはパラメタとして org.apache.struts.taglib.html.TOKEN=hogehoge を取り、ここに前画面つまりログインアクションの戻りhtml内の <a href="/stressTest/logout.do?org.apache.struts.taglib.html.TOKEN =7704e3e689f49ec91f539f083da60de2">ログアウト</a> の値を設定する必要があります。ようするに「直前のサンプラの戻り電文内のリンクタグから値を取り出す」必要があるわけですね。 ログアウトアクションのサンプラを作成したあと、正しくログアウトができてることを確認するためアサーションも追加します。正しくログアウトできたら「ログイン画面へ」という文字が含まれたhtmlが返却されるので、それをアサーションすることにします。 #ref(15assertion.png) もちろんこのままだとトークンがパラメタに載らないため、[[ログアウトアクション>http://www.masatom.in/cgi-bin/viewvc.cgi/trunk/stressTest/source/nu/mine/kino/stresstest/LogoutAction.java?root=Others&view=co]]ではエラーとなります。 さて前画面の値をリクエストにセットするには「HTMLリンクパーサ」という機能を使用します。ログアウトアクションで右クリックし、 追加 > 前処理 > HTMLリンクパーサ とします。 #ref(16htmlLinkParser.png) ログアウトアクションにHTMLリンクパーサが追加されました。次にこのログアウトアクションはパラメタにトークンを取るので org.apache.struts.taglib.html.TOKEN=.* をパラメタに追加します。 #ref(17parserParam.png) また、トークンはJ2EEセッションがつながっている必要があるため、Cookieを送出するよう設定を追加します((まあURLRewritingの場合もあり得るわけですが、、。))。追加方法はテスト計画を右クリックし 追加 > 設定エレメント > HTTP クッキーマネージャ でOKです。 #ref(18Cookie.png) これでリクエストすると、、、、確かに前画面のhtmlリンクから値を取り出し、パラメタにトークンが載るようになりました! **ユーザ定義の変数をつかう [#e4f59b7b] **戻り電文の任意の値を次のリクエストにセットする [#lf5719c5] 先ほどは、前画面の戻りhtmlのなかの特定のリンクタグからパラメタを取得するというやり方を説明しましたが、次はもっと汎用的に(以下書き途中、、、、)。 **ID/PASSなど、可変な値をリストファイルからセットする [#q3b56c65] **オペレーションを自動記録する [#xb011c59] 今まで手動でサンプラー(リクエスト)を作ってきましたが、実はJMeterをプロキシサーバにして、リクエスト・レスポンスを自動的にキャプチャすることができます。これをすれば上り電文のパラメタとかいちいち設定する必要がなくて、とても便利そうです。 ***プロキシサーバの追加 [#i1cd78f4] ワークベンチで右クリックして、 追加 > Non Test エレメント > HTTP プロキシサーバ でプロキシサーバを追加します。 **XML-RPCのようなkey=value形式でないクエリを送信する [#lbb9d23b] **関連リンク [#u0c0b76c] -[[JMeter - Apache JMeter>http://jakarta.apache.org/jmeter/]] -[[JMeter(高機能/フリーなテストツール)第1回:JMeterの基本>http://www.stackasterisk.jp/tech/engineer/jmeter01_01.jsp]] -[[JMeter(高機能/フリーなテストツール)第01回:JMeterの基本>http://www.stackasterisk.jp/tech/engineer/jmeter01_03.jsp]] -[[JMeter-TECHSCORE->http://www.techscore.com/tech/ApacheJakarta/JMeter/index.html]] -[[[jmeter] - marsのメモ>http://d.hatena.ne.jp/masanobuimai/searchdiary?word=*%5Bjmeter%5D]] -[[テスト・スクリプト改善のヒント - ITアーキテクト [IT Architect]>http://www.itarchitect.jp/methodology_and_design/-/39302-1.html]] -[[Apache-JMeter.pdf (application/pdf オブジェクト)>http://www.jp.compaq.com/products/software/oe/linux/summary/reference/pdfs/Apache-JMeter.pdf]] ---- この記事は #vote(おもしろかった[25],そうでもない[4]) - はじめまして。JMETERのXML-RPCのようなkey=Value形式でないクエリを送信する に記述がないのは、できないということですか -- [[船木]] &new{2009-04-18 (土) 18:21:12}; - コメントありがとうございます。書かなきゃと思って、追いついてない状況です(´д`;)。ものすごく前に書いた記事なので、やり方自体忘れてます。あまりお役に立てなくてすいません。 -- [[きの]] &new{2009-04-20 (月) 17:50:12}; #comment #topicpath SIZE(10){現在のアクセス:&counter;}