テストデータベースに入力して使用するためのベストプラクティスは何ですか?


8

そこで、HibernateとMySQLを使用して、データベース駆動型のRESTful Java Webサービスをいくつか開発しています。テスト目的で、私はH2インメモリーデータベースを使用しています。H2は素晴らしく高速なので、これは非常にうまくいきました。唯一の問題は、テストの前にDBテーブルにデータを入力するのが面倒なことです。基本的には、一連のオブジェクトを手動で作成して永続化します。多分私は間違った道を行くのではないかと思っています。

教えてください、私がやろうとしていることをするためのベストプラクティスは何ですか?私を助けることができるツールはありますか?一般的な戦略やヒントはありますか?

回答:


4

DBの詳細をDIできるようにAPIを設計したと想定します。

用語に関しては、偽の テストダブルを使用したいと考えています。この特定のケースでは、同じインメモリDB(H2)を使用することをお勧めしますが、DBUnitを使用してJUnitを操作し、テーブルを作成し、各テストの前にデータを入力し、各テストの後にデータを切り捨て、最後にティアダウンしますTestSuiteが終了したら、テーブルを作成します。

GrailsやSpring Rooなど、他にもいくつかのテストデータを作成するソリューションがありますが、DBUnitですぐに動作します。


DBUnitの場合は+1。ユニットテストのDBコードを非常に快適にします。
TMN 2011

かっこいい-私は間違いなくそれをチェックする。現在、hibernate.hbm2ddl.auto = create-dropプロパティを使用して、テーブルを自動作成するようにHibernateに指示しています。これはDBUnitで動作しますか、それとも停止する必要がありますか?
sangfroid 2011

はい、それで動作します。実際、DBUnitを模倣する方法の1つは、Hibernateを介してPOJOとしてデータを挿入することです
Martijn Verburg

驚くばかり!さて、私はこれをチェックするつもりです。
sangfroid

また、これにはDIを使用する必要がありますか?現在、/ main / resources / META-INFフォルダーにpersistance.xmlがあり、実際のDBサーバーを指定しています。/test/resources/META-INFフォルダーに、H2を指定しているpersistance.xmlがあります。これは本当にうまくいくようです。一般的に、Springについて100%超混乱しています。これまで使用したことがなく、使用する必要があると誰もが言っているにもかかわらず、ここでどのように役立つか理解していません。
sangfroid 2011

1

おそらく、自動化された単体テストでモックフレームワークを利用することでメリットを得られるでしょうか?

いくつかの異なるものから選択できます。


はい、私はすでにユニットテストにMockitoを使用しています。しかし、DBに到達する(統合?)テストも実行したいと考えています。
sangfroid 2011

データベースソリューションに対してモックフレームワークを提案するための+1。データベースアプローチでは、不必要な複雑さが頻繁に発生し、ほとんどの場合、DAOではなくHibernateがテストされます。また、私はそのリストにJMockitを追加します-それはすべてを行います。不変文字列?私はそうは思いません。
ゲイリーロウ

1
まあ、私はHibernateが初めてだということを述べておかなければなりません。したがって、実際には、休止状態のものをすべて正しくテストしたことをテストすることが重要です。また、多くの操作はモックフレームワークではテストできなかったようです。たとえば、一連のレコードを返すメソッドがあるとします。実行するデータベースがない場合、そのメソッドが実際に一連のレコードを返すことをテストするにはどうすればよいですか?
sangfroid

@sangfroid、これは良い点であり、私も恩恵を受けることができます。HibernateロジックとHQLクエリは、従来の意味では特にユニットテストをうまく実行できません。以前は、機能を検証するために統合ユニットテストに依存していましたが、これらはほとんどの場合、環境固有で壊れやすいものでした。DBUnitは以前の回答で言及されており、再検討するに値するように見えます。
maple_shaft

1

実際にできることは、オブジェクトを手動で永続化するか、ロードする事前構築されたデータベースを用意することだけです。また、各テストの後にデータベースがリセットされていることを確認する必要もあります。

私が取り組んでいるプロジェクトでは、Hibernateを初めて使用するので、基本的な関係とカスケード操作のテストがたくさんあります。TestNGを使用するGenericHbTestと、すべてのHibernateテストの拡張元となるクラスがあります。これは持っている@BeforeMethodDBスキーマと各種DAOオブジェクトを生成するためのいくつかのユーティリティメソッドを再エクスポートすること法。これにより、テストごとに環境を調整できます。

各テストのスキーマを再エクスポートすることの唯一の欠点は、テストの実行を完了するのに非常に長い時間がかかることです。しかし、私はすべてが個別でクリーンであることを確認する必要があります。Hibernateの経験が豊富で、スキーマがより安定している場合は、すべてのテストの前に再エクスポートする必要はおそらくありません。少なくとも事前にすべてのテーブルをクリアしてください


1

オブジェクトのシリアル化を検討しましたか?これは、私が使用した最も速くて簡単な方法です。

必要な状態を作成し、それをディスクにシリアル化することで構成されます。これらのファイルを使用して、テストに使用するインメモリデータベースにデータを入力します。

利点の1つは、後でファイルを手動で編集できることです。

別の方法として、単体テストでうまく編成されている場合は、オブジェクトジェネレータを作成できます。テストが開始すると、データベースがインスタンス化され、スキーマがエクスポートされます(nHibernateを使用)。オブジェクトが生成され、データベースに入力されます。

この方法は最初の方法よりも優れています。オブジェクトジェネレーターはコードとともに進化するため、前の提案のようにファイルについて心配する必要はありません。


興味深いアプローチには+1ですが、少し壊れやすいかもしれません。
ゲイリーロウ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.