2009年3月18日水曜日

mavenで複数のWebコンテナを使ってintegration-testする

profile機能をうまく使う。project/profiles配下の要素で、必要なだけprofileを用意するカンジ。mvn clean installするとintegration-testが実行される。

projects直下のbuild/pluginsで定義しているsurefire-test
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <includes>
      <include>**/server/**/*Test.java</include>
    </includes>
  </configuration>
  <executions>
    <execution>
      <id>surefire-integration-test</id>
      <phase>integration-test</phase>
      <goals>
        <goal>test</goal>
      </goals>
      <configuration>
        <skip>false</skip>
        <includes>
          <include>**/client/**/*Test.java</include>
        </includes>
      </configuration>
    </execution>
  </executions>
</plugin>
testフェーズでは**/server/**をtest対象とし、integration-testフェーズでは**/client/**をtest対象としている。
開発時用のprofile
<profile>
  <id>development</id>
  <activation>
    <activeByDefault>true</activeByDefault>
  </activation>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <includes>
            <include>**/server/**/*Test.java</include>
          </includes>
        </configuration>
        <executions>
          <execution>
            <id>surefire-integration-test</id>
            <phase>integration-test</phase>
            <configuration>
              <skip>true</skip>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</profile>
  • integration-testフェーズでは何もしない。
  • リソースファイルはデフォルトのsrc/main/resources,src/test/resourcesが適用される。
jetty上でintegration-testをするprofile
<profile>
  <id>it-on-jetty</id>
  <build>
    <resources>
      <resource>
        <directory>src/it/resources</directory>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>maven-jetty-plugin</artifactId>
        <version>6.1.10</version>
        <configuration>
          <contextPath>webappSample</contextPath>
          <scanIntervalSeconds>10</scanIntervalSeconds>
          <stopKey>foo</stopKey>
          <stopPort>9999</stopPort>
          <connectors>
            <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
              <port>8080</port>
              <maxIdleTime>60000</maxIdleTime>
            </connector>
          </connectors>
        </configuration>
        <executions>
          <execution>
            <id>start-container</id>
            <phase>pre-integration-test</phase>
            <goals>
              <goal>run</goal>
            </goals>
            <configuration>
              <scanIntervalSeconds>0</scanIntervalSeconds>
              <daemon>true</daemon>
            </configuration>
          </execution>
          <execution>
            <id>stop-container</id>
            <phase>post-integration-test</phase>
            <goals>
              <goal>stop</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <skip>true</skip>
        </configuration>
      </plugin>
    </plugins>
  </build>
</profile>
  • integeration-test前後でjettyの起動と終了を行う
  • 通常のtestフェーズではsurefire-testは実行しない。
  • リソースファイルはsrc/it/resource配下が適用される
tomvat上でintegration-testをするprofile
<profile>
  <id>it-on-tomcat</id>
  <build>
    <resources>
      <resource>
        <directory>src/it/resources</directory>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <groupId>org.codehaus.cargo</groupId>
        <artifactId>cargo-maven2-plugin</artifactId>
        <version>1.0-SNAPSHOT</version>
        <configuration>
          <container>
            <containerId>tomcat5x</containerId>
            <zipUrlInstaller>
              <url>http://archive.apache.org/dist/tomcat/tomcat-5/v5.5.27/bin/apache-tomcat-5.5.27.zip</url>
            </zipUrlInstaller>
            <output>${project.build.directory}/tomcat5x.log</output>
            <log>${project.build.directory}/cargo.log</log>
            <timeout>60000</timeout>
          </container>
          <configuration>
            <home>${project.build.directory}/tomcat55</home>
            <properties>
              <cargo.servlet.port>8080</cargo.servlet.port>
              <cargo.logging>high</cargo.logging>
            </properties>
          </configuration>
          <deployer>
            <deployables>
              <deployable>
                <groupId>com.shin1ogawa</groupId>
                <artifactId>webappSample</artifactId>
                <type>war</type>
                <properties>
                  <context>webappSample</context>
                </properties>
                <pingURL>http://localhost:8080/webappSample/</pingURL>
              </deployable>
            </deployables>
          </deployer>
        </configuration>
        <executions>
          <execution>
            <id>start-container</id>
            <phase>pre-integration-test</phase>
            <goals>
              <goal>start</goal>
              <goal>deployer-deploy</goal>
            </goals>
            <configuration>
              <wait>false</wait>
            </configuration>
          </execution>
          <execution>
            <id>stop-container</id>
            <phase>post-integrastion-test</phase>
            <goals>
              <goal>stop</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <skip>true</skip>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <pluginRepositories>
    <pluginRepository>
      <id>cargo m2 release repository</id>
      <url>http://cargo.codehaus.org/dist2</url>
      <releases>
        <enabled>true</enabled>
      </releases>
    </pluginRepository>
  </pluginRepositories>
</profile>
  • integeration-test前後で、tomcatのダウンロード&インストール&起動&デプロイと、終了を行う
  • testフェーズではsurefire-testは実行しない。
  • リソースファイルはsrc/it/resource配下が適用される
製品用のパッケージングをするためのprofile
<profile>
  <id>production</id>
  <properties>
    <maven.test.skip>true</maven.test.skip>
  </properties>
  <build>
    <resources>
      <resource>
        <directory>src/production/resources</directory>
      </resource>
    </resources>
  </build>
</profile>
  • testもintegration-testも行わない。
  • リソースファイルはsrc/production/resources配下が適用される。

実はprofile機能は、プロパティの設定等を切り替える程度にしか使えていなかったんだけど、pluginの設定とかも書けるって最近知ったw profile機能のおかげでかなーーり幅が広がった。Hudson等のCIツールとの相性も非常に良いと思う。

で、ここまでは定義方法のテンプレートなんだけど、integration-testでの問題点として、自分は以下のような問題に直面している。例えばクライアント側Seleniumとかならいいんだけど、そうじゃなくてSwingなどのリッチクライアントだった時。当然、クライアント側のモジュールのカバレッジを取りたいワケだ。だがしかし、coberturaプラグインはtestフェーズで実行する時にしかカバレッジ計測が働かないようなのだ。testフェーズよりも前のフェーズで無理矢理Webサーバを起動するようにすればできない事はないのだけれど、キレイじゃないんだよなぁ。それとも、自前のlifecycleを定義してしまぅか…。

コメントを投稿