JMeterでリクエスト自動化

やりたかったこと

クライアントのサーバーで0byteのキャッシュファイルが生成されたりするとのこと。キャッシュファイルの数が多くなることや、アクセスが集中することでおかしなことが起きているのかもしれない、とにかく本番サーバー並にいろんなページにアクセスしてキャッシュファイルを増やさないといけないと思ったわけです。

JMeterとは

ApacheSoftwareFoundationで進行しているパフォーマンス計測用のJavaアプリプロジェクト。デスクトップGUIで設定するので比較的操作は簡単だし、100%ピュアJavaなのでWindowsでもMacでも同じものが動く、イケているアプリです。
似たのでSeleniumがありますね。Seleniumの方はJavascriptのチェックができたりよりWEBアプリに特化していて、JMeterはWEBアプリ以外にもFTPとかMailとかテスト出来て敷居も低い感じがします。

アパッチのログから再現(リプレイ)する

まずはJMeterをダウンロードします。

JMeterの公式サイトの「Download Releases」と書かれたリンクから最新バイナリ(.zip)を落として解凍しました。解凍されたフォルダのbin/ApacheJMeter.jarを実行するとJMeterが開きました。

最初はログをCSVに変換して読み込ませたり試していたのですが、わたし、気づいてしまいました、「Access Log Sampler」が用意されていることに。

まず左のペインメニューのテスト計画を右クリックしてスレッドグループを追加します。

スレッドグループ

スレッド数というのは同時接続しているユーザー、RampUpというのは1ユーザーのアクセスする間隔秒数、てな理解でよろしいかと。正確にRampUpの秒数待つということではなくて、指定した秒数内にスレッドを散らしてくれるみたい。0にすると同時接続です。スレッドが10なら、ほぼ同時に10個リクエストするということ。
ループ数はログの記録数÷スレッド数を指定しておきました。

次にスレッドグループを同じように右クリックして「Access Log Sampler」を追加します。
続けて「結果をツリーで表示」「結果を表示表示」「グラフ表示」を追加しておきました。この結果は実行中、リアルタイムで見られるしかなり見やすいです。好きなものを使ってください。

追加したAccess Log Samplerを左ペインで選択すると右ペインで細かい設定ができます。
名前とコメントはそのまま、ServerにはIPまたはホスト名を入れます。
Portはデフォルトが80なのでそのまま。ParseImagesはTrueにするとHTMLを解析してページ内の画像を読み込むようなのですがFalseにしておきます。
PluginClassesのParserはTcLogParserだと10個の同時スレッドがアクセスログの同じ一行を読み込むためOrderPreservingLogParserかSharedTcLogParserにしておきました。
FilterはとりあえずLogFilterを選びましたがよく分かっていません。SessionFilterはCookieを使うみたいですが、今回はどっちでもいいですね。
LogFilesでアクセスログを指定してください。

後は実行して結果を眺めていると良いです。

 

不満点とか

アクセスする順番とか、時間を完全再現するのは出来ませんでした。いい方法があるのかもしれませんが…。sleniumだと出来たかなぁ?今回の計測だとログインしたユーザーの遷移を追いかけたりはしないので充分ではありました。

しかし操作がけっこう簡単。特にアクセス・ログが簡単に読み込めるとは驚きました。これならしばらく時間をおいて忘れてても使えるんじゃないでしょうか。

参考:

AccessLogSamplerのチュートリアル(pdf)

今から3分で jmeter の使い方を身に付ける  (負荷テスト入門)