nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

Arquillianを使った本物のJava EEテスト その3

JBoss Advent Calendar 2011の19日目のエントリです。

Arquillianを用いたテストではRemote, Managed, Embeddedという3種類のコンテナの使い方をサポートしています。それぞれ以下のようにテストを行います。

  • Remote
    • 既に起動されているコンテナに対してテストを行う
  • Managed
    • 指定されたコンテナを利用してテストを行う、コンテナの起動と停止はArquillianが行う
  • Embedded

Arquillianがサポートするコンテナ一覧ドキュメントがありますが、JBoss AS 7はRemote, Managedがサポートされていて、Embeddedが未サポートです。ユーザからはJBoss AS 7のEmbeddedコンテナをサポートしてほしい、という要望もあがるのですが、Embeddedは位置づけ的に少し微妙なところもあります。

Arquillianを利用したテストは基本的にアプリケーションにJava EE (JPAを通してアクセスされるデータベースやJMSも含む)とのインタラクションを含めた状態のテストとなるので、単体テストというよりもインテグレーションテストという位置づけになります。単体テストレベルだと手軽に使えるEmbeddedは確かに魅力なのですが、インテグレーションテストとなると少し重点が変わってきます。

インテグレーションテストにおいてはなるべく「本物」の環境に近いこと、つまり環境の再現性を最大化したいと思うでしょう。RemoteやManagedタイプのコンテナは実際にインストールされているコンテナをそのままの設定で利用するため、環境の再現性は最大化されます。一方、Embeddedタイプのコンテナの場合、テスティングフレームワークが管理するJava VM上でコンテナが起動されてテストが実行されることになります。本物のコンテナとは異なる起動のされかたをされ、本番で利用する設定は参照されず(もしくは個別に手動で設定する必要があり)、クラスローディングなども本物の環境とは異なる形で行われることになります。Embeddedはこのように環境の再現性が高いとは言えず、インテグレーションテストを実行するのには少しイマイチな選択肢となってしまいます。もちろんJava EEでインジェクションのみできれば良く、JPAなどは使っていない、単にEJBに記述してあるロジックを単体テストしたい、という場合はEmbeddedで問題ありません。

まとめ

  • 単体テストは主にロジックのテストなので環境あまり関係ない
  • インテグレーションテストは環境全体のテストを行いたい
  • RemoteやManagedは環境の再現性が高く、単体テストとインテグレーションテストの両方で使える
  • Embeddedは環境の再現性が低いので単体テスト向け

個人的にはArquillianのRemoteやManagedを利用して「Real Java EE Testing」をするのがオススメです。