Arquillianを使った本物のJava EEテスト
JBoss Advent Calendar 2011の17日目のエントリです。
JBoss AS 7でJavaMailを利用してメールを送るでCDIのBeanを作りましたが、それをテストするためにわざわざJSF2の画面を作りました。今回は画面を作るのではなく、Arquillianを使って自動テスト化します。Arquillianはおおざっぱに言うと自動テストでJava EEコンテナを利用可能にするソフトウェアです。
- ソース: https://github.com/nekop/as7-mailsessiondemo
- JBoss AS 7.1.0.Beta1b
- Arquillian 1.0.0.CR7
まずpom.xmlにテストのための依存を追加します。JUnitとArquillianのJUnit用モジュール、そして最後のXalan Serializerは本来はユーザが指定する必要のないものなのですが、現在はArquillianと関連するモジュールのバージョンアップのはざまですぽっと抜け落ちてしまっている状態なので今のところ手動で指定が必要です。
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <dependency> <groupId>org.jboss.arquillian.junit</groupId> <artifactId>arquillian-junit-container</artifactId> <version>1.0.0.CR7</version> <scope>test</scope> </dependency> <!-- This is an integration problem between jboss-javaee-web-6.0:2.0.0.Final and Arquillian, see: http://community.jboss.org/thread/165840 http://community.jboss.org/thread/173846 --> <dependency> <groupId>org.apache.xalan</groupId> <artifactId>serializer</artifactId> <version>2.7.1-1.jbossorg</version> <scope>test</scope> </dependency>
引き続きArquillianを利用するテストのプロファイルを定義します。これでmvn -P arq-jbossas-remoteのようにプロファイル指定オプションを渡すことでArquillianを用いたテストが起動されます。remoteとかmanagedは後ほど実行するときに説明します。
<profile> <id>arq-jbossas-managed</id> <dependencies> <dependency> <groupId>org.jboss.as</groupId> <artifactId>jboss-as-arquillian-container-managed</artifactId> <version>7.1.0.Beta1b</version> <scope>test</scope> </dependency> </dependencies> </profile> <profile> <id>arq-jbossas-remote</id> <dependencies> <dependency> <groupId>org.jboss.as</groupId> <artifactId>jboss-as-arquillian-container-remote</artifactId> <version>7.1.0.Beta1b</version> <scope>test</scope> </dependency> </dependencies> </profile>
さて、MailBean#sendTestMessage()をコールするテストケースを書きましょう。成功条件はメールの送信を実際に確認するようなものではなく、例外が起きなければ成功というユルいもので。
package jp.programmers.as7.mailsessiondemo; import javax.inject.Inject; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.EmptyAsset; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.Test; import org.junit.runner.RunWith; import static org.junit.Assert.*; @RunWith(Arquillian.class) public class MailBeanTest { @Inject MailBean mailBean; @Deployment public static Archive<?> createTestArchive() { return ShrinkWrap.create(JavaArchive.class, "test.jar") .addClasses(MailBean.class) .addAsResource(EmptyAsset.INSTANCE, "META-INF/beans.xml"); } @Test public void callSendTestMessage() throws Exception { mailBean.sendTestMessage(); assertTrue(true); // ok, no exception } }
arq-jbossas-remoteプロファイルを利用して実行してみます。remoteプロファイルでは既に起動されているJBoss AS 7インスタンスに対してテストを行うモードです。事前にJBoss ASを起動しておいてください。
$ mvn -P arq-jbossas-remote test (省略) ------------------------------------------------------- T E S T S ------------------------------------------------------- Running jp.programmers.as7.mailsessiondemo.MailBeanTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.561 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 4.771s [INFO] Finished at: Mon Dec 19 12:15:58 JST 2011 [INFO] Final Memory: 14M/209M [INFO] ------------------------------------------------------------------------ You have new mail in /var/spool/mail/nekop
最後の行に出力されていますが、きちんとメールが送信されたようです。
次にarq-jbossas-managedでテストしてみましょう。managedではインストールされているJBoss AS 7をArquillianが起動してテストするという形になるので、JBoss AS 7のインストールパスを環境変数JBOSS_HOMEに設定して渡す必要があります。
$ JBOSS_HOME=/home/nekop/jboss710b1b mvn -Parq-jbossas-managed test (省略) ------------------------------------------------------- T E S T S ------------------------------------------------------- Running jp.programmers.as7.mailsessiondemo.MailBeanTest Dec 19, 2011 2:25:30 PM org.jboss.as.arquillian.container.managed.ManagedDeployableContainer startInternal INFO: Starting container with: [java, -Xmx512m, -XX:MaxPermSize=128m, -Djboss.home.dir=/home/nekop/jboss710b1b, -Dorg.jboss.boot.log.file=/home/nekop/jboss710b1b/standalone/log/boot.log, -Dlogging.configuration=file:/home/nekop/jboss710b1b/standalone/configuration/logging.properties, -Djboss.modules.dir=/home/nekop/jboss710b1b/modules, -jar, /home/nekop/jboss710b1b/jboss-modules.jar, -mp, /home/nekop/jboss710b1b/modules, -logmodule, org.jboss.logmanager, -jaxpmodule, javax.xml.jaxp-provider, org.jboss.as.standalone, -server-config, standalone.xml] (省略) Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.583 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 7.568s [INFO] Finished at: Mon Dec 19 14:25:35 JST 2011 [INFO] Final Memory: 13M/213M [INFO] ------------------------------------------------------------------------ You have new mail in /var/spool/mail/nekop
Arquillianについては長くなりそうなので一旦日を分けます。また次回!