web-dev-qa-db-ja.com

Flywayとの統合テスト

私はデータベースの移行を処理するために Flyway を使用しています。すべてが正常に機能しています。移行ファイルのデフォルトの場所は次のとおりです。

_main/resource/db/migration/V1...
_

私は統合テストを実行しており、セットアップでは統合用に別のデータベーススキーマを使用しています。これもflywayで管理したいと思います。ただし、統合テストはtestフォルダーにあります(mainではありません)。 FlywayBeanがmigrate()を実行すると、移行ファイルはmainフォルダーにあるため、それらは見つかりません。移行ファイルを_test/resource/db/migration/V1..._に入れると、機能します。

これらのファイルをtestリソースフォルダーにコピーする必要は本当にないので、両方を維持する必要はありません。 Flywayに通常のアプリと同じ移行ファイルを統合テストに使用させる方法はありますか?

6
Johny19

Mavenを使用していると思いますか?単体テストの場合、test/resourcesmain/resourcesの両方がクラスパスにロードされます。 test/resourcesファイルは通常、クラスパスの上位に配置されるため、優先されます-正しく思い出せば。とにかく、これを行うことはお勧めしません。

代わりに、統合テスト用にまったく異なるFlyway構成を作成することをお勧めします。これは、別のディレクトリ(つまり、test/resources/integration/migration/)にあり、デフォルトのmain/resources/db/migrationの後に実行されます。

それでも、Flywayを使用して統合データフィクスチャをセットアップせず、代わりに DbUnit (他にもあると確信しています)などの他のデータベースデータロードツールを使用する方が簡単な場合があります。

6
Adam Gent

別のヒント:データベースユニットテストについては、Flyway Test Extensionを使用することもできます https://github.com/flyway/flyway-test-extensions を参照してください。

拡張機能には、データをロードするためのDbUnit統合用のアドオンも含まれているため、テスト環境でのデータベース設定を制御できます。

Adamsの答えは正しいですdonot実際のデータベースセットアップスクリプトをtest/resources/db/migration/にコピーします。

統合テストのセットアップでは、次のオプションの1つまたは組み合わせを実行することもできます。

  1. Mavenプロファイルの統合テストに使用し、このセットアップに、スクリプトの場所用に特別なフォルダーflyway-maven-pluginを追加する特別なtest/resources/integration/migration/またはgradleセットアップを追加します。
  2. 同じフォルダtest/resources/db/migration/をテストで使用し、V999.0.x __やsimularなどの特別なバージョンを使用します。この場合、flywayは常にデータベース内で検出されたすべてのスクリプトを埋めます。
  3. Spring 4.xプロジェクトがある場合は、SqlScriptsTestExecutionListnerでspring-testを使用することもできます。ここでは、テストケースに特定のロード機能を使用できます。
  4. flyway-test-extensionsを使用する

データベース統合テストのヒント:

  • 単一のテストではデータベースのリセットを避けてください。テストはより速く、堅牢になります。
  • 各テストデータの設定は自己完結型である必要があり、他のテスト実行によって妨げられてはなりません。
  • 既存の提供されたインスタンスからのアップグレードが必要な場合は、テストセットアップにいっぱいになったデータベースの移行テストも追加します。 =>移行スクリプトをテストします。
8
Florian E.