目次


万人のためのオートメーション

人手を介さない自動負荷テスト

Apache JMeter を Apache Ant と組み合わせて負荷テストを頻繁に実行する

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: 万人のためのオートメーション

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:万人のためのオートメーション

このシリーズの続きに乞うご期待。

あなたのソフトウェア・システムに同時にアクセスするユーザーは何人いますか?パフォーマンスを劣化させずに、どれほどのデータ量をロードできますか?システムのスループットに関する要件には何があり、その要件をどれくらいの頻度でテストしていますか?例えば負荷とパフォーマンスに関する要件を指定して、それらの要件を満たしているかどうかを 1 日に 1 回以上検証できれば理想的だと思いませんか?定期的な自動ビルドの一環として負荷テストを実行すれば、特定の負荷条件の下でのシステムのパフォーマンスをより迅速に判断して変化に素早く適応することが可能になります。

以前取り組んだプロジェクトでは、アプリケーションが複数のトランザクションを実行している間にアプリケーションの負荷テストを実行できる、かなりの数の自動テストを確立しました。しかし、これらのテストには手動による調整が必要だったため、開発チームは人手がないとテストを実行できないという問題がありました。そのため、テストの実行はテスターが対応できるときだけに限られていました (通常は、日中のみ)。実際にテストが実行されたのは 2、3 日おきで、タイムリーに問題を検出するには、この頻度では足りません。

そこでこの記事では、JMeter を使って自動テストを作成して自動ビルドの一環として実行し、テストが毎日 (通常はマシンの使用率が低い時間に) 自動的に実行されるようにスケジューリングするための手法を探ります。テストを定期ビルドの一環として実行すると、以下の利点があります。

  • 負荷テストをいつでも実行できること
  • 開発プロセスの早期に負荷およびパフォーマンスの問題を検出して解決できること
  • ビルド・サーバーからの負荷テストおよびパフォーマンス・テストの最新レポートをモニターできること
  • テストの構成と実行を 1 人の人間に頼る場合に起こりがちなボトルネックとエラーを軽減できること

JMeter に力仕事を任せる方法

Apache JMeter は、サーバーでの重い負荷をシミュレートするために使用できるオープンソースのプロジェクトです (JMeter についての詳細は、「参考文献」を参照)。読み応えたっぷりの JMeter マニュアル・セットでは、JMeter に備わった多くの機能の使用方法を説明しているだけでなく、豊富な例も記載しています。

JMeter を実行する

JMeter ZIP ファイルをダウンロードして解凍したら (JMeter のダウンロード・リンクは「参考文献」を参照)、JMeter を解凍した場所でコマンド・プロンプトを開き、cd bin と入力して bin ディレクトリーに移動してください。bin ディレクトリーで jmeter と入力すると、JMeter Swing アプリケーションが開きます (図 1 を参照)。

図 1. JMeter の GUI
JMeter の GUI
JMeter の GUI

テスト・プランを作成する

テスト・プランを作成するには、上記の JMeter GUI を使用してください。JMeter のテスト・プランには以下に示すさまざまなタイプがあります。

  • Web テスト・プラン
  • データベース・テスト・プラン
  • FTP テスト・プラン
  • LDAP テスト・プラン
  • 拡張 LDAP テスト・プラン
  • Web サービス・テスト・プラン
  • JMS ポイントツーポイント・テスト・プラン
  • JMS トピック・テスト・プラン
  • モニター・テスト・プラン
  • リスナー

各テスト・プランは、.jmx というサフィックスが付いたファイルに XML フォーマットで保存されます。このバイナリーではないフォーマットが、後でプランを編集する際の作業を簡単にします。テスト・プランは JMeter の XML スキーマに従って作成することもできますが、GUI を使用したほうが遥かに簡単です。後で、JMeter 構成値をパラメーター化してテストの実行方法をカスタマイズする例を紹介します。

人手を省いた負荷テスト

GUI を使ってテストを実行するには、テストを行う人間がその場にいなければなりません。この場合、プロセスのボトルネックが発生したり、独りよがりの知識によってテストが実行されたりする可能性が高くなります。一方、テストを Ant ビルドのような自動ビルドによって実行すれば、JMeter アプリケーションを起動しなくても実行されるように JMeter テストを構成することができます。その上、テストは毎回同じように実行され、残業代が必要になることもありません。

Ant で JMeter テストを操作する

GUI ソフトウェア・ツールの使い方がわかったところで、このツールがコマンドラインから特定のユーティリティーを実行できるかどうかを確かめてみたいと思います。そうであれば、私が同じ操作を何度も繰り返さなくても済むからです。例えば、毎回 JMeter アプリケーションを起動し、File > Open の順に選択してファイルを開いて、1 つ以上のテストを実行するとします。この一連のアクションを実行するスクリプトを作成すれば、これらのアクションを毎回同じように実行することができます。幸い、まさにこのことを JMeter で行うために作成された既存の Ant タスクがあります。このタスクは負荷テストを実行すると同時に、オプションのパラメーターとプロパティーを渡すための手段にもなります。

リスト 1 で、Ant の taskdef タスクを使って JMeter タスクを定義します。このタスクには、Ant スクリプトの他のどの場所でも使えるように jmeter という名前を付けます。このスクリプトを使用するには、Ant クラスパスに ant-jmeter.jar ファイル (ダウンロード・リンクについては「参考文献」を参照) を含める必要があります。

リスト 1. Ant での JMeter タスクの定義
<taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask"/>

リスト 2 のサンプル・コードで実行する JMeter の負荷テストは BreweryTestPlan.jmx だけですが、特定のファイル名の代わりに *.jmx と入力して、あるディレクトリーに含まれるすべてのテストを実行することもできます。jmeter タスクに必要な属性は、jmeterhometestplan(s)、さらに resultlog またはresultlogdir のいずれかです (リスト 2 では resultlog を使用しているため、resultlogdir は示されていません)。

リスト 2. Ant からの JMeter の実行
<jmeter
  jmeterhome="${jmeter.home}"
  resultlog="${basedir}/target/JMeterResults.xml">
  <testplans dir="${basedir}/tests/load" includes="BreweryTestPlan.jmx"/>
</jmeter>

リスト 2 の Ant コードは、JMeterResults.xml という名前の出力ファイルを作成します。HTML レポートは、このファイルを使って作成されます。

XSLT を使ってレポートをレンダリングする

リスト 2 で実行したすべての JMeter テストの HTML レポートを生成するには、JMeterResults.xml ファイルをリスト 3 の xslt Ant タスクの入力として指定します。JMeterResults ファイルを HTML に変換する際には、JMeter の extras ディレクトリーにある XSL スタイルシート (jmeter-results-detail-report_21.xsl) が使用されます。

リスト 3. XSLT を使用した JMeter HTML レポートの作成
<xslt in="${basedir}/target/JMeterResults.xml"
  out="${basedir}/target/JMeterResults.html"
  style="${jmeter.home}/extras/jmeter-results-detail-report_21.xsl"/>

JMeter には、簡易版の XSL スタイルシート・ファイルもあります。このファイルを使用すると、負荷テストの結果は要約されます。

HTML でレポートを公開する

図 2 は、リスト 3 の xslt タスクによって生成される HTML レポートの一例です。このレポートには、実行された負荷テストとそれぞれのテスト結果および時間、そしてすべてのテストを集約した上での結果と時間が表示されます。

図 2. JMeter HTML レポートの生成
JMeter HTML レポートの生成
JMeter HTML レポートの生成

これらのレポートは継続的インテグレーション (CI) サーバーである、CruiseControl (「参考文献」を参照) から表示することができます。その方法については、後で説明します。

JMeter にパラメーターを渡す

実行するテストのタイプによっては、パラメーターとプロパティーを渡すことによって単一のテストや一連のテストの実行方法を変えたい場合があります。一例として、リスト 4 に JVM メモリーを増やしてスレッドとループの数を指定する方法を示します。

リスト 4. JMeter に渡すオプションのパラメーターとプロパティー
<jmeter
  jmeterhome="${jmeter.home}"
  resultlog="${basedir}/target/JMeterResults.xml">
  <jvmarg value="-Xincgc"/>
  <jvmarg value="-Xmx128m"/>
  <jvmarg value="-Dproperty=value"/>
  <property name="request.threads" value="5"/>
  <property name="request.loop" value="50"/>
  <property name="jmeter.save.saveservice.assertion_results" value="all"/>
  <property name="jmeter.save.saveservice.output_format" value="xml"/>
  <testplans dir="${basedir}/tests/load" includes="BreweryTestPlan.jmx"/>
</jmeter>

この他にも、JMeter テストの実行方法を変更するための組み込みのパラメーターとプロパティーが多数用意されています (詳細は「参考文献」を参照)。

パラメーターとプロパティーを使用することで、負荷テストをある程度柔軟に行えるようになりますが、異なるターゲット環境に応じた負荷テストの実行方法 (テストとステージングなど) には対応できません。環境固有の情報をテスト・プランに追加するには、自動ビルド・スクリプトでの負荷テストの実行時にフィルタリングして変更することが可能なトークンを .jmx ファイルに組み込んでください。

ジャスト・イン・タイムの負荷テスト

自動ビルドで負荷テストが実行されるようになったら、例えば夜間に実行するなど、定期的にテストが実行されるようにスケジューリングしてください。スケジューリングを行うには、CI またはビルド管理サーバーを使用することができます。

負荷テストを毎日実行するように CruiseControl をスケジューリングする

CI サーバーを使う目的は、プロジェクトのバージョン管理リポジトリーに変更が適用された場合は常に自動ビルドが実行されるようにするためです。また、ビルドを特定の時間に実行するように CI サーバーを構成することもできます。通常、負荷テストには多くの計算リソースが必要になるため、テストの実行には計算リソースがフル稼働していないとき (夜間や早朝など) が適しています。

リスト 5 では、CruiseControl によって自動ビルドが午後11時 (2300) に実行されるようにスケジューリングしています。CruiseControl 構成ファイルを変更して、run-load-tests などの名前を付けた特定の Ant ターゲットで代行ビルドを実行することも可能です。

リスト 5. CruiseControl による定期負荷テストの実行
  ...
  <modificationset>
    <svn RepositoryLocation="${svnrepo.location}"/>
    <timebuild username="admin" time="2300"/>
  </modificationset>
  ...

リスト 5 のように負荷テストを毎日夜間に実行するようにスケジューリングすれば、仕事の負担や休暇の予定についての言い訳を聞かされることがなくなります。テストは定期的に実行されるため、もちろんテストを実行し忘れたという言い訳も聞かずに済みます。

CruiseControl にレポートを表示する

Ant を使って JMeter テスト・レポートを表示する方法についてはすでに説明しました。けれどもそれだけでは、JMeter レポートを表示できるのは 1 台のマシンの 1 人の開発者だけに限られてしまいます。負荷テストはアプリケーション全体に影響するため、チームの全員が結果を表示できるようにしなければなりません。この CI サーバーのいいところは、これらのレポートを表示するように簡単に構成できることです。レポートは Ant で生成済みなので、後は CruiseControl プロジェクト・ダッシュボードから JMeter HTML レポートにアクセスできるようにすればよいだけの話です。その方法は簡単で、リスト 6 に示すように CruiseControl の config.xml ファイルに数行を追加するだけです。

リスト 6. JMeter レポートを表示するように CruiseControl を構成する方法
<project name="brewery">
...
<log>
  <merge dir="merge dir="projects/${project.name}/reports/jmeter" />
</log>
...
</project>

これで、チームの全員が文字通り同一のページにアクセスできるようになります。他の CI およびビルド管理サーバーの多くも、同じようなレポート統合機能を備えています。

まとめ

今回の記事では、自動負荷テストを開発ツールボックスに加える方法を紹介しました。負荷テストを自動ビルドで実行し、それから定期的にテストが実行されるようにスケジューリングすることで、システム容量が問題になる遥か以前にその問題を突き止めることができます。アーキテクチャーおよびデータの変更による影響を評価しやすくするこの手法を、連載で今までに説明した他の手法と組み合わせれば、開発チームはさらに高品質のソフトウェアを頻繁に提供することが可能になります。


ダウンロード可能なリソース


関連トピック

  • JMeter: JMeter プロジェクトのサイトにアクセスして、マニュアル、チュートリアル、そしてコミュニティーのリソースを調べてください。
  • Test WebSphere performance with Apache JMeter」(Greg Herringer 著、developerWorks、2004年5月): IFX (Interactive Financial eXchange) メッセージング・ミドルウェアをテストするには JMeter が最適です。
  • Using JMeter」(Budi Kurniawan 著、onjava.com、2003年1月): 基本的な JMeter の使用方法を説明しているハウツー記事です。
  • Load Testing with Apache JMeter」(Kulvir Singh Bhogal、Javid Jamae 共著、devx.com、2003年12月): もう 1 つの JMeter 入門書です。
  • JMeter tips」(Chi-chang Kung 著、javaworld.com、2005年7月): JMeter スクリプトの品質を向上させてください。
  • Load Testing your Applications with Apache JMeter」(Keld H. Hansen 著、Java Boutique): JMete の使い方に関するチュートリアルです。
  • 万人のためのオートメーション」(Paul Duvall、developerWorks): この連載のすべての記事を読んでください。
    • Continuous testing」(2007年3月): コード・ベースを変更するときには、その都度、自動テストを実行してください。
  • developerWorks Java technology ゾーン: Java プログラミングのあらゆる側面を網羅した記事が、豊富に用意されています。
  • Ant: Ant をダウンロードして、分かりやすく繰り返し可能な形でソフトウェアのビルドを開始してください。
  • JMeter: JMeter をダウンロードしてください。
  • JMeter Ant task: テスト・プランを実行するために使用する Ant タスクです。
  • CruiseControl: 継続的インテグレーション・サーバー、CruiseControl をダウンロードしてください。
  • IBM 製品の評価版をダウンロードして、DB2®、Lotus®、Rational®、Tivoli®、および WebSphere® のアプリケーション開発ツールとミドルウェア製品を使ってみてください。

コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Java technology
ArticleID=307888
ArticleTitle=万人のためのオートメーション: 人手を介さない自動負荷テスト
publish-date=04082008