web-dev-qa-db-ja.com

Mavenとの統合テストのベストプラクティスは?

Hibernate(およびSpring)を使用してデータベースなどからデータを取得するMavenで構築しているプロジェクトがあります。

私のプロジェクトのDAOに対する「テスト」は、SpringのAbstractTransactionalDataSourceSpringContextTestsを拡張して、データソースを実際にクエリ/ Hibernateロジックを実行したり、データを取得したりするためにテスト中のクラスに配線できるようにします。

他のいくつかのプロジェクトでは、外部データベースに依存せずに実際のデータベースクエリロジックを効率的にテストできるように、これらのタイプのテストをHSQLデータベース(メモリ内またはファイルを指す)と連携して使用しました。これは、外部依存関係を回避し、テストを実行する前のデータベースの「状態」(それぞれがロールバックされるトランザクションにラップされる)が適切に定義されているため、非常に効果的です。

しかし、これらのテストを整理する最良の方法について興味があります。これは、Mavenを使用した統合テストの非常にゆるいフレーバーです。これらのテストをsrc/test/Javaに保持するのは少し汚い感じがしますが、私が読んだことから、Mavenとの統合テストを整理するための一貫した戦略や実践はないようです。

これまでに読んだことから、 Failsafeプラグイン (またはSurefireの2番目のインスタンス)を使用してintegration-testフェーズにバインドできるようで、バインドすることもできますpre-integration-testまたはpost-integration-testへのカスタムの起動またはシャットダウンロジック(HSQLインスタンスの起動/停止など)。しかし、これは本当に最良の方法ですか?

だから私の質問は基本的に-Mavenでこれを整理する上で一般的に受け入れられているベストプラクティスは何ですか?ドキュメントで一貫した答えを見つけるのに苦労しています。

私がしたいことは:

  • 統合テストから単体テストを分離するため、testフェーズでは単体テストのみが実行されます
  • カスタムの起動/シャットダウンロジックをpre-integration-testおよびpost-integration-testにバインドする機能
  • 統合テストのレポートをユニットテストのSurefireレポートとマージ/提示する
68
matt b

これは codehausページ といくつかのガイドラインがあります。フェイルセーフプラグインはちょっとしたハックであり、Eclipseでの単体テストの実行は非常に複雑になります。私はあなたが説明していることを広くします。

Src/itest/Javaで統合テストを定義する統合テスト前の段階で:

  • ターゲット/テストクラスをクリアする
  • build-helper-maven-plugin のadd-test-sourceゴールを使用して、最初のソースの場所を追加します
  • カスタムMojoを使用してsrc/test/Javaを構成から削除し、ユニットテストが再度コンパイルされないようにします(これはあまり好きではありませんが、ユニットテストと統合テストの分離を維持するために必要です)。
  • Compiler-pluginを使用して統合テストをコンパイルします

次に、統合テストフェーズで、surefire-pluginを使用してテストを実行します。

最後に、整頓された目標を統合テスト後のフェーズにバインドします(ただし、テストteardown()を使用して整頓できるため、通常は必要ありません)。

レポートフェーズが過ぎたので、テスト結果をマージする方法をまだ見つけていませんが、レポートに合格することがそれほど重要でない限り、統合テストを追加ボーナスと見なす傾向があります。

更新:突堤の目標を使用するのではなく、統合テスト内からJettyを実行できることを指摘する価値があると思います。これにより、テストをより細かく制御できます。 this answer および参照ブログから詳細を入手できます。

21
Rich Seller

これを行う非常に簡単な方法は、JUnitカテゴリを使用することです。

その後、テスト段階でいくつかのテストを実行し、統合テスト段階で別のテストを簡単に実行できます。

数分で完了し、必要な手順は3つだけです。

  1. マーカーインターフェイスを定義する
  2. 分割するクラスに注釈を付けます
  3. Mavenプラグインを構成します。

完全な例をここに示します。 https://stackoverflow.com/a/10381662/136538

26
John Dobie

この良いブログ記事 は3つのオプションを提案しています。

1)統合テスト用の個別モジュール

2)異なるソースディレクトリ

3)異なるファイル名パターン

私はまだ3つすべてを試していないので、私が好む意見を提供することはできません。

7
Mike

私は2番目のオプションである異なるソースディレクトリを好みますが、統合テストを終了するかパッケージを除外するのは非常に面倒です。

これを回避するために、私はこの設定になりました:

<properties>
    <testSource>src/test/Java</testSource>
    <testSourceResource>src/test/resources</testSourceResource>
</properties>
<build>
    <testSourceDirectory>${testSource}</testSourceDirectory>
    <testResources>
            <testResource>
            <directory>${testSourceResource}</directory>
            </testResource>
        </testResources>
.....
.....

そして、統合と受け入れテストのために、異なるプロファイルの両方の変数をオーバーライドします。

<profiles>
  <profile>
   <id>acceptance-tests</id>
   <properties>
    <testSource>src/acceptance-test/Java</testSource>
    <testSourceResource>src/acceptance-test/resources</testSourceResource>
   </properties>
  </profile>
 <profile>
   <id>integration-tests</id>
    <properties>
    <testSource>src/integration-test/Java</testSource>
    <testSourceResource>src/integration-test/resources</testSourceResource>
    </properties>
  </profile>
.....
.....
.....
1
Pablo Gutierrez