2016-12-09 15 views
1

私の親ポンポンがに、JUnitの4 @Category注釈のための私のインターフェイスcom.adam.testutil.IntegrationTestを使用して、以下のよう<groups><excludedGroups>のparamsを定義maven-surefire-pluginmaven-failsafe-plugin構成が含まれているために使用するサードパーティのライブラリのインターフェイスはありますどのテストにも統合テストとしてフラグを立てます。JUnitの@category()

pomの下にあるすべてのモジュール(統合テストを持つモジュールだけではありません)は、クラスパスにcom.adam.testutil.IntegrationTestが必要になり、確実なプラグインとフェイルセーフプラグインが実行されます。そうでなければClassNotFoundExceptionがスローされます。

したがって、クラスはすべてのモジュールが依存関係として宣言しなければならないモジュール内になければなりません。私はそれを親のpom の依存関係として宣言して、すべてのモジュールが自動的に継承するようにしたいと思いますが、mvnの実行を停止する循環依存関係の問題が発生します。

モジュールにユニットテストや統合テストがなくても、モジュールは依然として依存関係を宣言する必要があります。

また、com.adam.testutil.IntegrationTestのモジュールをビルド順に最初のモジュールにする必要があります。そうしないと、新しいシステムの初回インストールでは利用できなくなります。鶏肉と卵のジレンマがあります - IntegrationTestの依存関係はまだローカルリポジトリにないので、空のリポジトリにmvn installを実行するだけではありません。

実際、IntegrationTestを提供するだけでは特に新しいモジュールを作成したくありません。 JUnitが適切なorg.junit.IntegrationTestクラスをライブラリに含んでいれば、ずっと簡単になります。

@Cateogryはテストに注釈を付けて統合テストとしてフラグを立てるのに最適な方法ですが、マルチモジュールプロジェクトではこれらの欠点がすべてあります。

自分で持っている代わりに使用できる適切な名前のインターフェイスがありますか?

最悪の場合のシナリオでは、JUnit @Category、maven-surefire-plugin、およびmaven-failsafe-pluginに関する限り、JDKのインターフェイスを使用できます。 java.lang.Cloneable - 誰がコードを読んでいても、何が起こっているのだろうかと思います。

私はJUnitが何かを持っていることを望んでいましたが、役に立たないものは何も見つかりませんでした。

私は親のpomの第三者のライブラリに依存関係を置くことができ、すべてがうまくいくはずです。

私は、サードパーティ製のライブラリから適切なインターフェイスを提案してくれた人から答えを受け取ります。インターフェイスの名前は、コードを初めて読んだ人からすぐに質問をしません。

import org.junit.experimental.categories.Category 
import com.adam.testutil.IntegrationTest 

@Category(IntegrationTest.class) 
public DbAndJpaIntegrationTests { 
    ... 
} 

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.18.1</version> 
    <configuration> 
     <excludedGroups>com.bp.gis.util.HeavyTest 
     </excludedGroups> 
    </configuration> 
</plugin> 
<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-failsafe-plugin</artifactId> 
    <version>2.18.1</version> 
    <configuration> 
     <includes> 
      <include>**/*.java</include> 
     </includes> 
     <groups>com.bp.gis.util.HeavyTest</groups> 
    </configuration> 
    <executions> 
     <execution> 
      <goals> 
       <goal>integration-test</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 
+0

*問題は、プロジェクト内のすべてのモジュールがcom.adamに引っ張る依存性を有していなければならないことです。 testutil.IntegrationTest *ここで必要な依存関係は何ですか? – nullpointer

+0

'IntegrationTest'が現在どこにあるのか、今のところあなたのモジュール構造は何を使用しているのかについて詳細を教えてください。 – nullpointer

+0

私はあなたの質問に答えるために質問を言い換えました。 – Adam

答えて

0

あなたのモジュールの..mostが必要な場合は...インタフェース、あなたは私だけではなく、単一のインターフェースを示唆が、そのインタフェースに関連するものを試してみて置くのに(個々のモジュールであなたのIntegrationTestを宣言することができますこのモジュールにも同様に)。アーティファクトについてはintegration-testという名前で呼んでみましょう。

私は親のポンポンで依存関係としてそれを宣言することを好むので、すべての のモジュールが自動的にそれを継承しますが、それはMVNの実行を停止した円形 依存関係の問題を作成します。

  • それは<dependencyManagement>を使用してそうすることが維持さintegration-testアーティファクトのバージョンの有効活用にマークを付けることができますが、親pom.xmlに依存関係を宣言するために必須ではありません。 Read more about it in the doc。実際に

ない単位または統合テストモジュールに存在しない場合でも、 モジュールは依然として依存性を宣言しなければなりません。

  • それはあなたがちょうどこのモジュール用のpom.xmlにintegration-testアーティファクトの依存関係を宣言する必要はありませんケースの場合。私もcom.adam.testutil.IntegrationTest ビルド順序、 の最初のモジュールを含むモジュールを作成する必要があり、それ以外の場合は、初回に使用することはできません任意の新しい システムにインストールさ

  • 原子炉のソートは、依存するモジュールは、彼らが依存するモジュールのビルドが成功した後に構築されている前記プロジェクト内のモジュールを構築するための世話をします。 You get to know more about it here. あなたのintegration-testは、それに依存する同じプロジェクト内のモジュールの前にビルドされます。実際に

私は特にちょうど IntegrationTestを提供するために、新しいモジュールを作成する必要はありません。 JUnitが に適切なorg.junit.IntegrationTestクラスをライブラリに含めたほうがはるかに簡単です。

どこか手軽なインターフェイスがありますか?私はちょうど私の親pomのそれに の依存関係を置くことができ、すべてはうまくいくでしょう。

  • あなたが公開しIntegrationTestインターフェースが便利です何を証明されない限り、私はそれがjunit libの中に含ませることができることを疑います。どこか手軽なインターフェースのために同じで、あなたのインターフェースIntegrationTestがやろうとしていることは、究極の質問でしょう。
  • その後、テストスコープのライブラリのいずれかにインクルードする(受け入れる)ことができれば、そのlibの依存関係を親のpom.xmlにインポートすることは非常に便利です。
  • それまでは、integration-test個別モジュールアプローチを使用することをお勧めします。
+0

maven-surefire-pluginとmaven-failsafe-pluginが、親pom内で参照を使って設定されている場合は、すべてのモジュールのクラスパス上にインターフェイスを設定する必要があります。原子炉の選別を参考にしてくれてありがとう。 – Adam

1

IntegrationTestインターフェイスの目的は、確実にどのテストが確実に実行され、どのテストがフェールセーフによって実行されるのかを単に示すことです。

この場合、命名規則を使用できます。フェイルセーフのための デフォルトは described in the docsです:

<includes> 
    <include>**/IT*.java</include> 
    <include>**/*IT.java</include> 
    <include>**/*ITCase.java</include> 
</includes> 

the defaults are、確実な場合:

<includes> 
    <include>**/Test*.java</include> 
    <include>**/*Test.java</include> 
    <include>**/*TestCase.java</include> 
</includes> 
+0

これは微分を行うための基本的な方法ですが、クラス内のJUnitテストメソッドが '@ Test'アノテーションでマークされているのと同じように、テストクラスに適切なアノテーションを付けてラベル付けすることが実際にはるかに効果的です。それがより効果的な理由 - ドメインが実際にテストと関係するプロジェクトに取り組む必要があり、 "テスト"という言葉がクラス名の人口に広がっている場合、あなたの名前の付け方を心配する必要がある場合テストだけでなく、それはそれに注釈を付けるよりも精神的なエネルギーです。 – Adam