argius note

プログラミング関連

JMeterをソースから動かしてみた

今回はちょっと長いです。

概要

JMeterは、シナリオテストや負荷テストなどに使用できるツールです。Javaだけで作られています。
昔は、この手の製品は有償のものばかりでしたが、オープンソースになる日がこんなに早く来るとは....。通常は、それほど厳密なテストじゃなかったりするので、JMeterでは十分すぎるほどでしょう。

JMeterのセットアップ

http://jakarta.apache.org/site/downloads/downloads_jmeter.cgi からバイナリをダウンロードして、解凍します。適当なディレクトリに配置し、"bin"配下の"jmeterw.cmd"(Windows),"jmeter"(others)などで起動するだけです。Windowsの場合、カレントディレクトリを変更するには、jmeterw.cmdの"call jmeter"をフルパスに変更して保存し、ファイルのショートカットを作成して、作業フォルダを好きなところに変更すればOKです。

JMeterEclipseに設定

Eclipse上でコンパイルして実行できるように設定します。これが正解というわけではありませんが、比較的簡単にできるようにしています。Eclipseの基本的な説明は割愛します。Java1.4.2、Eclipse3.0.1を使用しています。
バイナリをダウンロードしたページと同じところから、ソースをダウンロードして、Eclipseワークスペースに解凍します。ディレクトリ名は"JMeter"に変えておくとちょっとだけ楽です。次に、Eclipseで"新規Javaプロジェクト"新規作成を実行し、プロジェクト名に"JMeter"と入力し、"次へ"ボタンを押します。
ビルドパスの設定で、まずソースフォルダの"htmlparser16","jorphan","protocol/jms","protocol/jndi"を除去します。それから、バイナリでインストールしたJMeterのlibディレクトリ直下にあるJarファイルを全て追加します。最後に、JavaMailAPIのライブラリ*1を追加します。これで、とりあえずコンパイルエラーは出なくなるはずです。
次に、実行の設定を行います。まず、プロジェクトルート以下に、"root","lib/ext","lib/junit"というディレクトリをそれぞれ作成します。"root"はソースフォルダにします。"root"には、バイナリの"bin"以下にあるプロパティファイルをコピーしておきます。"lib/ext"には、バイナリの"lib/ext"にあるJarファイルをコピーします。そして、実行ダイアログを開いて設定します。mainクラスは"org.apache.jmeter.NewDriver"、作業ディレクトリを"root"にして、実行します。
JMeterのサンプラーやリスナなどは、"lib/ext"から動的に読み込んで生成されますので、それらを含むJarだけは置いておかなければ設定ができませんが、それ以外はソースフォルダにあるものが有効となります。

バグ...じゃなかった

そもそも、ソースを見てみようと思ったのが、HTTPリクエストの送信値で.*を使う場合に上手くパラメータが取得できない現象が出ていたからで、マニュアルを見てもこんな詳細の情報は載ってないと判断し、思い切ってソースを見てしまおうと思った次第です。
もしかしたらレアケースのバグだったりするのかな、と思いつつデバッグしてみました。ちなみに、jmeter.logのログレベルを変更するには、jmeter.propertiesの"log_level.jmeter=INFO"を"DEBUG"に変更します。
で、結論としては至って正常な動作と判明しました。前処理のHTMLリンクパーサは、送信しようとしているHTTPリクエストの前回のHTTPリクエストで受信したHTMLのパラメータを取得しますが、今回送信するURLと同じかどうかを調べて、同じならパラメータに貼り付けるという処理になっていたのでした。それはそうですね。至極当然の処理でした。その処理をやっているのはorg.apache.jmeter.protocol.http.modifier.AnchorModifierクラス辺りです。

*1:無ければhttp://java.sun.com/products/javamail/downloads/index.htmlなどから入手してください。