はじめまして。sasaki-kです。 わたしは業務で継続ビルド環境として hudson + maven2を気に入って使っています。携帯サイトは実機チェックが大変なため、継続ビルド環境上で結合テスト(Tomcat起動してHttpUnitで内容応答確認、DBの値チェック)ができたらなと思っていました。 一方、こういった用途には Cargo Maven2 plugin が有名です。良く紹介される事例としては Tomcatがリモート環境で起動していて、maven2でビルドしたwarをdeployなのですが・・・テスト用のTomcatを継続ビルドマシンにインストールしたり、tomcatのmanager appを有効にしたり、異なるTomcatのバージョンでのテストも面倒だなあと思っていました。 ところが調べてみたところ、maven cargo pluginには ApacheからTomcatを自動ダウンロードしてきて専用にしてくれる方法がありました。さっそく試してみましたのでご紹介します。pom.xmlの中でcargo-maven2-pluginの<configuration>タグの記述がポイントです。

<!-- pom.xmlから抜粋 -->
 <build>
   <plugins>
     <plugin>
       <groupId>org.codehaus.cargo</groupId>
       <artifactId>cargo-maven2-plugin</artifactId>
       <executions>
         <execution>
         <id>start-container</id>
         <phase>pre-integration-test</phase>
         <goals>
           <goal>start</goal>
           <goal>deploy</goal> <!-- startだけではだめだった -->
         </goals>
        </execution>
       <execution>
         <id>stop-container</id>
         <phase>post-integration-test</phase>
         <goals>
           <goal>stop</goal>
         </goals>
       </execution>
       </executions>
       <configuration>
         <configuration>
           <type>standalone</type> <!-- ここがポイント -->
           <properties>
             <cargo.logging>high</cargo.logging> <!-- あまり気にしてない -->
           </properties>
         </configuration>
         <container>
           <containerId>tomcat5x</containerId>
           <zipUrlInstaller>
             <url>http://archive.apache.org/dist/tomcat/tomcat-5/archive/v5.5.15/bin/jakarta-tomcat-5.5.15.zip</url> <!-- テストで使うTomcat -->
             <installDir>${java.io.tmpdir}/cargoinstalls</installDir>
           </zipUrlInstaller>
           <dependencies>
             <dependency>
               <groupId>mysql</groupId>
               <artifactId>mysql-connector-java</artifactId> <!-- MySQL使っているので -->
             </dependency>
           </dependencies>
         </container>
         <deployer>
           <deployables>
             <deployable>
               <artifactId>your-artifactId</artifactId>
               <groupId>your-groupId</groupId>
               <pingURL><![CDATA[http://localhost:8080/s/index.jsp]]></pingURL> <!--テスト対象が起動したとみなせるURL-->
               <pingTimeout>360000</pingTimeout> <!--起動に時間がかかるので長めに設定-->
               <type>war</type>
               <properties>
                 <context>/s</context>
               </properties>
             </deployable>
           </deployables>
         </deployer>
         <wait>false</wait>
       </configuration>
     </plugin>

     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <excludes>
           <exclude>**/integration/**/*Test.java</exclude> <!-- 単体テストでは呼ばない -->
         </excludes>
       </configuration>
       <executions>
         <execution>
           <id>surefire-it</id>
           <phase>integration-test</phase>
           <goals>
             <goal>test</goal>
           </goals>
           <configuration>
             <skip>false</skip>
             <excludes>
               <exclude>none</exclude>
             </excludes>
             <includes>
               <include>**/integration/**/*Test.java</include> <!-- HttpUnitを使ったテストを書く -->
             </includes>
           </configuration>
         </execution>
       </executions>
     </plugin>
   </plugins>
 </build>
また、webアプリから JNDIなデータソースへアクセスしているので webapp/META-INF/context.xmlの中に以下を記述しています。
<?xml version="1.0" encoding="UTF-8"?>
<Context reloadable="true" path="/s">
  <Resource auth="Container" type="javax.sql.DataSource"
      maxActive="20" maxIdle="10" maxWait="-1"
      name="jdbc/db"
      driverClassName="com.mysql.jdbc.Driver"
      url="jdbc:mysql://localhost:3306/dbname"
      username="your-user-name" password="your-password" />
</Context>
ここまでやっとくと後は、コマンドラインからの実行は以下ですみます。
$ mvn integration-test
こうすると内部では以下のような処理が行われるようです。
  • http://archive.apache.org/dist/からTomcatを取得し、${java.io.tmpdir}/cargoinstalls以下にinstall
  • テスト対象warをdeploy
  • <pingURL>で指定したURLを200になるまで叩きまくり(<pingTimeout>を上限として)
  • mavenが**/integration/**/*Test.java 以下の結合テスト実行
これを使えばmavenのProfileで${java.io.tmpdir}/cargoinstalls あたりを変更すれば異なるTomcatのバージョンでテストできるし、実行する環境に左右されないので継続ビルド環境のお引越しとか障害あったときの代替環境の準備とか楽になりそうだなーと思いました。 参考にしたサイト
  • Cargo - Maven2 Plugin Reference Guide
    • http://cargo.codehaus.org/Maven2+Plugin+Reference+Guide