2

JAX-RS を使用して REST サービス (EJB でもあります) を公開し、基礎となるデータを格納するために JPA を使用する単純な Java EE アプリの統合テストをセットアップしようとしています。外部コンテナ/アプリケーション サーバーを手動で設定する必要はありません。私は解決策を求めてここや Web で多くの検索を行った結果、GlassFish 3.1.2 Embedded を機能させるのに何週間も費やしてしまいました。セキュリティをテストするユーザーを作成します。ドラット!JBoss AS 7 を見ましたが、組み込み製品はサポート対象外のようです。次に、サーブレット コンテナー (Jetty、Grizzly、Simple) を使用して自分で作成し、Jersey を直接実行してみました。(私は最終的に、EclipseLink と Derby 組み込みを追加することを計画していました。) これらはすべて、最も基本的な JUnit テストをセットアップして実行する際に、予期せぬ困難な課題を提示しました。たとえば、Jetty で JAX-RS を実行できませんでした。たとえば、Grizzly には HTTP Basic 認証がありませんでした。ダブルドラ!次に、Arquillian を調べましたが、コンテナー アダプターに JBoss AS 7 がリストされていませんでした。

2 つの質問があります。1) これは、私が予想していたよりもはるかに難しいようです。それが私だけではないと仮定した場合 (お願いします、それは私だけではありません!)、なぜそんなに難しいのでしょうか? 30 以上の API を備えた Java EE スタック全体が、正しく積み上げるのが非常に難しく、1 つの瓶に押し込められないトランプの家であるかどうか疑問に思っています。または、テストを実行する前に開始する外部 (「ローカル」?) コンテナーで統合テストを行うことを好む人もいるかもしれません。

質問 2): さまざまな種類のテスト コンテナー構成の標準的な用語は何ですか? 矛盾しているようです。たとえば、http://mvnrepository.com/artifact/org.jboss.arquillian.containerには「リモート」、「埋め込み」、「マネージド」、および「ローカル」がリストされていますが、それでも「コンテナ内」および「アウト」が見つかりました。 -of-container」テストは別の場所で言及されています。

上記の失敗の詳細についてスペースを使用するのではなく、この経験が私に伝えようとしていることに耳を傾ける準備ができているので、何がうまくいったかを聞いていただければ幸いです. 前もって感謝します!

4

2 に答える 2

1

私は毎日まったく同じ問題を抱えています。私の結論は、ビジネス層をサービス インターフェイス層から分離することです。つまり、ビジネス層を適切に設計して単体テストを行い、必要に応じて外部ツール (jmeter など、デプロイされたシステムで機能テストを実行できるもの) との統合テストを実行します。

ほとんどの場合、サービス抽象化レイヤーではなく、ビジネス ロジックをテストしたいと考えています。私の jax-rs (または何でも) ハンドラーは、多くの場合、ビジネス層への単なるラッパーです。

ちなみに、私はArquillianを使ったことはありません。

これが答えと見なせるかどうかはわかりませんが、それは私の 2 セントです ;)

于 2012-06-08T17:10:55.910 に答える
0

あなたがやろうとしていることは、私がしばらくの間やってきたことのように聞こえます。

私は現在Arquillianを使用していますこれは、本番環境で使用しているアプリケーション サーバーであるため、JBoss AS 7 で実行されます。Arquillian は、マネージド モード (Arquillian はコンテナーの開始と停止を制御します)、リモート モード (Arquillian はサーバーを開始または停止しませんが、どこかで実行されていると想定します)、および組み込みモードをサポートします。すべてのコンテナ アダプタが組み込みモードをサポートしているわけではなく、Glassfish の組み込みにはかなりの問題があると私は理解しています。Apache TomEE は、私がさまざまなコンテキストで使用した組み込みコンテナーを提供し、非常にうまく機能します。TomEE アダプターの良い点は、実際の TomEE チームによって維持されるため、アダプターが常にコンテナーに準拠していることを確認できることです。TomEE は起動/シャットダウンが非常に高速であるため、テストは基本的に単体テストと同じくらい高速であり、違いはほとんどわかりません。

<dependency>
    <groupId>org.apache.openejb</groupId>
    <artifactId>arquillian-tomee-embedded</artifactId>
    <version>1.0.0</version>
    <scope>provided</scope>
</dependency>

JBoss AS 7 はテスト スイートで Arquillian 自体を使用するため、Java EE API と実装がそのコンテナーに対してテストされていないことを心配する必要はありません。ビルドを自己完結型にして JBoss AS 7 インスタンスを含める場合は、jboss-as-dist アーティファクトを使用できます。Maven を使用している場合は、maven-dependency-plugin を使用して JBoss AS 7 インスタンスを展開し、テスト スイートに使用できます。

<build>
  <plugin>
      <artifactId>maven-dependency-plugin</artifactId>
      <executions>
          <execution>
              <id>unpack</id>
              <phase>process-test-classes</phase>
              <goals>
                  <goal>unpack</goal>
              </goals>
              <configuration>
                  <artifactItems>
                      <artifactItem>
                          <groupId>org.jboss.as</groupId>
                          <artifactId>jboss-as-dist</artifactId>
                          <version>7.1.1.Final</version>
                          <type>zip</type>
                          <overWrite>false</overWrite>
                          <outputDirectory>target</outputDirectory>
                      </artifactItem>
                  </artifactItems>
              </configuration>
          </execution>
      </executions>
  </plugin>
</build>

(完全な例 pom.xmlはこちら)

コードが本番環境のアプリケーション サーバー内で実行されているが、統合テストを行っていない場合、コードが実際のランタイムでどのように動作するかを実際に確認することはできません。Arquillian のおかげで、アプリケーション サーバー内で実行される最近のプロジェクトで統合テストを作成することができ、http を介した JAX-RS エンドポイント、JPA ORM マッピングとクエリ、さらには NoSQL データベースへのビジネス ロジックまですべてをテストすることができました。インデックス エンジン。

Arquillian ユーザー フォーラムは、Arquillian で問題が発生した場合に非常に役立ちます。うまくいけば、私の答えがあなたの質問に光を当てることができます.

于 2013-05-14T13:40:16.560 に答える