連載
» 2012年12月13日 18時00分 公開

小山博史のJavaを楽しむ(17):JBoss Forgeでアジャイルな対話式開発をやってみた (4/4)

[小山博史,SSS(G)/ガリレオ]
前のページへ 1|2|3|4       

ForgeならArquillianのテストも簡単

 最後にテストについても見てみましょう。Forgeでは、「Arquillian」というJavaのテストツールを簡単に利用できるようになっています。これまでArquillianに興味があっても設定が面倒そうだということで試してみていなかった人も、これを機会に試してみたらどうでしょう。

図8 Arquillian

Forgeの「arquillian」プラグインをインストール

 まずは、「arquillian」プラグインをインストールします。

[no project] forge $ forge install-plugin arquillian

 インストールができたら、arquillianプラグインの設定を行います。「jboss-as-7」プラグインのときと同じようにプロジェクトに対して設定します。デフォルトでは「org.jboss.as:jboss-as-arquillian-container-managed:::7.1.2.Final」となってしまうので、使っているバージョンに合わせるため、「15」を指定します。コンテナの指定については、JBoss AS 7をすでにインストール済みなのでデフォルトの「N」とします。

[no project] forge $ cd simpleapp
[simpleapp] simpleapp $ arquillian setup --container JBOSS_AS_MANAGED_7.X
What version of jboss-as-arquillian-container-managed do you want to use?
【略】
  15 - [org.jboss.as:jboss-as-arquillian-container-managed:::7.1.1.Final]
  16 - [org.jboss.as:jboss-as-arquillian-container-managed:::7.1.2.Final]*
 ? Choose an option by typing the number of the selection [*-default]  [0] 15
 ? Do you want Arquillian to install the container? [y/N] 
Wrote /home/user001/workspace/forge/simpleapp/pom.xml

 「arquillian」プラグインを設定すると、「simpleapp/src/test/resources/arquillian.xml」が追加されます。ここの「jbossHome」プロパティにJBoss AS 7へのPATHを指定する必要があります。次のように修正しましょう。<arquillian>要素について、「/>」となっているのを「>」と修正する必要がある点に気を付けましょう。また、最後の行に「</arquillian>」の追加が必要です。ボディ部には、下記のように<container>要素を指定します。

$ cat ~/workspace/forge/simpleapp/src/test/resources/arquillian.xml 
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<arquillian xmlns="http://jboss.org/schema/arquillian"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsd">
    <container qualifier="jbossas-managed" default="true">
        <configuration>
            <property name="jbossHome">/home/user001/applications/jboss-as</property>
        </configuration>
    </container>
</arquillian>

テスト対象となるプログラムを用意

 次に、テスト用のプログラムを用意しましょう。まずテスト対象となるプログラムを置くためのディレクトリを用意します。

$ mkdir ~/workspace/forge/simpleapp/src/main/java/jp/example/simpleapp/model/dao

 作成したディレクトリへサンプルとして、次のようなプログラムを作成しました。このクラスはシングルトンとして(@Singletonアノテーション)、アプリケーション起動時に初期化されます(@Startupアノテーション)。

 また、このクラスの初期化後に、UserInfo型のデータを3件登録するために、@PostConstructアノテーションが付いた「insertTestData()」メソッドを持っています。さらに、このクラスは「listUerInfo()」という「永続化されているデータのリスト」を返すメソッドも持っています。

package jp.example.simpleapp.model.dao;
import jp.example.simpleapp.model.UserInfo;
import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.List;
@Singleton
@Startup
public class UserInfoDao {
    @PersistenceContext
    EntityManager em;
    public List<UserInfo> listUserInfo() {
        return em.createQuery("select ui from UserInfo ui").getResultList();
    }
    @PostConstruct
    public void insertTestData() {
        UserInfo ui0 = new UserInfo();
        ui0.setName("Endo");
        em.persist(ui0);
        UserInfo ui1 = new UserInfo();
        ui1.setName("Goenji");
        em.persist(ui1);
        UserInfo ui2 = new UserInfo();
        ui2.setName("Kidou");
        em.persist(ui2);
    }
}

テスト実行プログラムを生成

 このサンプルプログラムに対して、JPAを使ったテスト実行プログラムを生成します。arquillianプラグインを使うと、次のように簡単に作成ができます。

[simpleapp] simpleapp $ arquillian create-test --class jp.example.simpleapp.model.dao.UserInfoDao.java --enableJPA

 自動で生成されたプログラムにはいくつか修正が必要です。メソッド「JavaArchive()」は、テストクラスをデプロイする時に利用するJARファイルを生成するメソッドなので、ここで使用する「UserInfo.class」を追加する処理を入れます。

 また、このクラスをimport文でインポートしておきます。@Testアノテーションを付けたメソッドがテスト用のメソッドになります。「UserInfoDao」はテストデータを初期化後に3件登録しているので、テストクラスで3件のデータが登録されているかを確認しています。

package jp.example.simpleapp.model.dao;
import jp.example.simpleapp.model.dao.UserInfoDao;
import jp.example.simpleapp.model.UserInfo; // 追加
import javax.inject.Inject;
【略】
@RunWith(Arquillian.class)
public class UserInfoDaoTest
{
   @Inject
   private UserInfoDao userinfodao;
   @Deployment
   public static JavaArchive createDeployment()
   {
      return ShrinkWrap.create(JavaArchive.class, "test.jar"). // 見やすく改行
          addClass(UserInfo.class). // 追加
          addClass(UserInfoDao.class).
【略】
   // 下記を追加
   @Test
   public void testListUserInfo() {
      Assert.assertEquals(3, userinfodao.listUserInfo().size());
   }
}

テストプログラムの自動実行

 準備ができたら、「build」コマンドを実行します。テストプログラムを追加したため、自動でテストが実行されます。このため、テストの実行時に利用するコンテナの指定が必要になります。コンテナを指定するには、次のようにprofileを指定します。

[simpleapp] simpleapp $ build --profile JBOSS_AS_MANAGED_7.X 
【略】
Results :
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
【略】
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
【略】

 これで実行すると、JBoss AS 7が自動で起動して、そこでテストも実行されて、ビルドがされます。

 テストについては、出力で「Test run」で始まる行でFailures、Errorsが0であれば成功です。テストが通ればビルドも成功して「BUILD SUCCESS」と表示されます。

 なお、テストの結果は「/home/user001/workspace/forge/simpleapp/target/surefire-reports」に出力されます。レポートを表示したい場合は、そこに出力されているファイルを利用します。

テストしないでビルドするには

 ここで、テストしないでビルドしたいこともあるでしょう。そういうときは、次のように「--notest」を指定してbuildコマンドを実行します。

[simpleapp] simpleapp $ build --notest

 ちなみに、コンソールからmvnコマンドで実行するには、次のようにします。

$ mvn -P JBOSS_AS_MANAGED_7.X test

環境に依存しないJavaの対話型開発を試そう

 さて、JBoss Forgeはいかがだったでしょうか。「Spring Roo」「seam-gen」と同じような感じで使えるので、興味を持った開発者も多いのではないでしょうか。

 seam-genはJBoss Seamに依存していたり、Spring RooはSpringに依存しているのですが、JBoss Forgeはコンテナに依存していないので、JBoss ASを使っている人でもGlassFishを使っている人でも、手軽に利用できるのがうれしいですね。

 あまり複雑でないWebアプリなら、こういったツールを使って、どんどんと作ってみるとWebアプリ開発も楽しいはずです。もちろん、本格的な開発プロジェクトでも有効に使えるだけのポテンシャルは持っていますから、利用を検討してみても良いでしょう。

前のページへ 1|2|3|4       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。