HudsonでJMeterを使った負荷テストを定期的に行う

Performance Pluginを使えばant+jmeterで簡単に出来る。jmeter-maven-pluginなんてものもあるけれど負荷テストをプロジェクトのpomに書くのはやり過ぎ感にあふれるので今回は使わなかった。

まずはantを使って負荷テスト用プロジェクトを以下のようなディレクトリ構成で作成。ぶっちゃけPerformance Pluginのwikiのをコピーしてディレクトリをちょこっと弄るだけで済んだ。わーい。

load-test
├── build.xml
├── results:結果ファイル用ディレクトリ
│  ├── html
│  └── jtl
└── scenarios:jmxファイル置き場
    ├── some-dynamic-properties.csv
    └── some-stress.jmx

build.xml

<project default="all">
  <property name="jmeter-home" location="${jmeter.home}"/>
  <!-- ant-jmeter.jar comes with jmeter, be sure this is the release you have -->
  <path id="ant.jmeter.classpath">
    <pathelement
       location="${jmeter-home}/extras/ant-jmeter-1.0.9.jar" />
  </path>
  <taskdef
    name="jmeter"
    classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask"
    classpathref="ant.jmeter.classpath" />
  <target name="clean">
    <delete dir="results"/>
    <delete file="jmeter.log"/>
    <mkdir dir="results/jtl"/>
    <mkdir dir="results/html"/>
  </target>
  <target name="test" depends="clean">
    <jmeter
       jmeterhome="${jmeter-home}"
       resultlogdir="results/jtl">
      <testplans dir="scenarios" includes="*.jmx"/>
    </jmeter>
  </target>
  <!-- This is not needed for the plugin, but it produces a nice html report
       which can be saved usin hudson's archive artifact feature -->
  <target name="report" depends="test">
    <xslt
       basedir="results/jtl"
       destdir="results/html"
       includes="*.jtl"
       style="${jmeter-home}/extras/jmeter-results-detail-report_21.xsl"/>
  </target>
  <target name="all" depends="test, report"/>
</project>

で、これを以下のコマンドで実行。

ant all -Djmeter.home=<your-jmeter-home>

シナリオファイル(jmx)を作る際に動的なパラメータを使う場合の肝はCSV DataSet Configを使うこと。これを使うと対象のjmxファイルと同じディレクトリにあるファイルをロードしてくれるのでファイルのパスに気を使う必要がなくなる。

ここまでできたらあとはHudsonでフリースタイルプロジェクトを選択し、antでのビルドをよしなに設定。Publish Performance test result reportにチェックを入れて以下のような感じで設定すればOK。

f:id:cynipe:20110105193933p:image

Performance thresholdは全件失敗したらそもそも色々おかしいだろうということで100%の場合は失敗。今回はJMeterの結果よりもサーバ側の状況がみたいというのが目的。サーバ側にはmuninをしかけておいてそちらのグラフを参照する感じ。なのでUnstableは特に必要ではないので設定してない。これで定期的にかかる負荷を想定したようなシナリオを流してサーバ状況のシュミレートとかできるー。