したがって、私はデータベース駆動のRESTful Java= Webサービスを開発し、HibernateとMySQLを使用しています。テスト目的で、H2インメモリデータベースを使用しています。H2は素晴らしく高速です。これは本当にうまくいきました。唯一の問題は、テストの前にDBテーブルにデータを入力するのが面倒なことです。基本的には、一連のオブジェクトを手作業で作成して永続化します。間違った道。
教えてください、私がやろうとしていることをするためのベストプラクティスは何ですか?私を助けることができるツールはありますか?一般的な戦略やヒントはありますか?
DBの詳細をDIできるようにAPIを設計したと仮定します。
用語に関しては、FakeTest Doubleを使用したいとします。この特定のケースでは、同じインメモリDB(H2)を使用することをお勧めしますが、 DBUnit を使用してJUnitを操作し、テーブルを作成して、各テストの前にデータを入力し、データを切り捨てます各テストの後、TestSuiteが終了したら、最後にテーブルを破棄します。
GrailsやSpring Rooなど、他にもいくつかのテストデータを作成するソリューションがありますが、DBUnitですぐに動作します。
実際にできることは、オブジェクトを手動で永続化するか、ロードする事前に構築されたデータベースを用意することです。また、各テスト後にデータベースがリセットされていることを確認する必要もあります。
私が取り組んでいるプロジェクトでは、Hibernateを初めて使用するので、基本的な関係とカスケード操作のテストがたくさんあります。 TestNGを使用して、すべてのHibernateテストの拡張元であるGenericHbTest
クラスを用意しています。 @BeforeMethod
dbスキーマを再エクスポートするメソッドと、さまざまなDAOオブジェクトを生成するためのいくつかのユーティリティメソッド。これにより、テストごとに環境を調整できます。
各テストのスキーマを再エクスポートする唯一の欠点は、テストの実行を完了するのに非常に長い時間がかかることです。しかし、私はすべてが個別でクリーンであることを確認する必要があります。 Hibernateの経験が豊富で、スキーマが安定している場合は、すべてのテストの前に再エクスポートする必要はおそらくありません。少なくとも事前にすべてのテーブルをクリアしてください
オブジェクトのシリアル化を検討しましたか?これは、私が使用した最も速くて簡単な方法です。
必要な状態を作成し、それをディスクにシリアル化することで構成されます。これらのファイルを使用して、テストに使用するインメモリデータベースにデータを入力します。
利点の1つは、後でファイルを手動で編集できることです。
別の方法として、単体テストでうまく編成されている場合は、オブジェクトジェネレータを作成できます。テストが開始すると、データベースがインスタンス化され、スキーマがエクスポートされます(nHibernateを使用)。オブジェクトが生成され、データベースに入力されます。
この方法は最初の方法よりも優れています。オブジェクトジェネレーターはコードとともに進化するため、前の提案のようにファイルについて心配する必要はありません。