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
にバインドする機能これは codehausページ といくつかのガイドラインがあります。フェイルセーフプラグインはちょっとしたハックであり、Eclipseでの単体テストの実行は非常に複雑になります。私はあなたが説明していることを広くします。
Src/itest/Javaで統合テストを定義する統合テスト前の段階で:
次に、統合テストフェーズで、surefire-pluginを使用してテストを実行します。
最後に、整頓された目標を統合テスト後のフェーズにバインドします(ただし、テストteardown()を使用して整頓できるため、通常は必要ありません)。
レポートフェーズが過ぎたので、テスト結果をマージする方法をまだ見つけていませんが、レポートに合格することがそれほど重要でない限り、統合テストを追加ボーナスと見なす傾向があります。
更新:突堤の目標を使用するのではなく、統合テスト内からJettyを実行できることを指摘する価値があると思います。これにより、テストをより細かく制御できます。 this answer および参照ブログから詳細を入手できます。
これを行う非常に簡単な方法は、JUnitカテゴリを使用することです。
その後、テスト段階でいくつかのテストを実行し、統合テスト段階で別のテストを簡単に実行できます。
数分で完了し、必要な手順は3つだけです。
完全な例をここに示します。 https://stackoverflow.com/a/10381662/136538
この良いブログ記事 は3つのオプションを提案しています。
1)統合テスト用の個別モジュール
2)異なるソースディレクトリ
3)異なるファイル名パターン
私はまだ3つすべてを試していないので、私が好む意見を提供することはできません。
私は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>
.....
.....
.....