2017-01-30 14 views
4

Flywayを使用して、Spring MVCアプリケーションで自分のDBの状態を管理します。Spring MVC - Flywayを使用してテスト間でデータベースをクリーニングする

私はそれがまさに私が私のJUnitテストでは二つのことをやってみたいtheir docs

<bean id="flyway" class="org.flywaydb.core.Flyway" init-method="migrate"> 
    <property name="dataSource" ref="..."/> 
    ... 
</bean> 

<!-- The rest of the application (incl. Hibernate) --> 
<!-- Must be run after Flyway to ensure the database is compatible with the code --> 
<bean id="sessionFactory" class="..." depends-on="flyway"> 
    ... 
</bean> 

にお勧めしますように私のサーブレットコンテキストのXMLファイルで構成されている - の前に、

  1. たら、 ALLはデータベースをテストし、削除して再作成し、再移行させます。これにより、各テストスイートごとにクリーンなデータベースが作成されます。

  2. 各テストの前に、すべてのDBテーブルをクリーニングしてください。他のフレームワーク(RSpec/Railsなど)では、テストの最後にロールバックするようにDB文をトランザクションで実行することでこれを達成しました。 Spring MVCの世界でベストプラクティスが何であるかは不明です。

実際に上記の実装を開始するにはどこに手掛かりがないので、どのような指針も高く評価されます。

ありがとうございます!

答えて

8

まず、あなたは以下のように各テストの前にデータベースをきれいにすることができます:

@Autowired 
Flyway flyway; 

@Before 
puublic void init(){ 
    flyway.clean(); 
    flyway.migrate(); 
} 

第二に、あなたがテーブルからすべての行を削除するには、JdbcTestUtilsを利用することができます。 は、ここにドキュメントを見つけてください:JDBCのテストのサポートをhttps://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html

あなたはまた、テストメソッドを実行するために@Rollback@Commitを利用することができ、トランザクション

@Rollbackは、トランザクションかどうかを示しますテストメソッドが完了した後、トランザクションテストメソッドをロールバックする必要があります。 trueの場合、トランザクションはロールバックされます。それ以外の場合は、トランザクションがコミットされます(@Commitも参照)。 @Rollbackが明示的に宣言されていなくても、Spring TestContext Frameworkの統合テストのロールバックセマンティクスはデフォルトでtrueになります。

+0

私は手動でクリーン移行、最も信頼性が高く、防弾で第一オプションを発見しました。各テストの前にデータベースが元の状態に戻らなければ、テストがお互いに影響を及ぼすという問題を解決します。 – alebu

2

私のチームはSpringBootを使用しています。これにはFlywayの統合機能が組み込まれています。以下はSpringBootに依存するものではありませんが、SpringBootを使用すると、これを簡単にすることができます。

Flywayとの統合テストでは、Spring Testと、メモリ内のH2データベースを使用します。 Spring Profilesを使用して、H2 JDBC設定を持つ '統合テスト'プロファイルを定義します。 Spring Testクラスは各テストのためにコンテナをスピンアップします。このように、各テストはに対して実行するフライウェイによって作成されたクリーンなスキーマを取得します。以来、それはすべてH2のメモリ内にクリーンアップはありません。また、テストの動作に影響を与える可能性のあるトランザクションの偽名も必要ありません。

あなたが本当にあなたの統合テストではフライウェイで、いわば、ベッドにジャンプしたい場合Flyway/Spring Test annotation libraryがあります。

+0

@FlywayTest注釈は、クリーンスレートで始める必要があるすべてのテストに明示的に追加する必要があるため、各テストの間でDB状態をクリーンアップするのには適していません。テストクラスに追加すると、おそらく最初のテストの前に1回だけ実行されます。その場合、https://stackoverflow.com/a/41929329/854151がそのようなユースケースに対してより良い解決策になるようです。 –

関連する問題