2012-01-20 3 views
3

私は、私は春と無休止状態が存在しないことを意味「シンプル」とのJUnit 4を使用して、非常に単純なJavaアプリケーションをテストしています。私はデータアクセス層(JDBCMySQL)をテストする必要があり、私の疑問はこのアプローチの方が良いでしょうか? @Beforeにデータを挿入し、@Afterで削除するか、または@Beforeにトランザクションを作成し、@Afterでロールバックしますか?JUnitの:テストのDAO - ロールバックまたは削除は

ありがとうございます!二つの理由

+1

HSQL DBのようなメモリ内のデータベースを使用してみてください。 – Reddy

+0

@Reddy私はそれを最も有効なものと見なすので、別の答えとしてそれを書くべきだと思います。 – bezmax

+0

@Brianは彼の答えで、私はSQLクエリーが正しいことを確認したいと思っており、彼らはMySQL Xプラットフォームで動作します。また、この場合、MySQLサーバへのアクセスは問題ではありません。 – Morvader

答えて

4

あなたのコードは、MySQLとの抱える問題を隠し、あなたのテストでプラットフォームの違いにさらされる可能性があるように私は、MySQLの以外のDBを使用してそうは思いません。あなたのコード/ SQLの中には、多大なリファクタリングなしに別のプラットフォームで動作しないものもあります。

しかしには、状態を復元するための取引ではなく、削除または更新を使用について他の人と同意します。

1つの警告:あなたがprocsの、機能、などを使用している場合、それらは、JUnitの変更をロールバックしようとする試みをアップマック可能性が内部的にCOMMITを行うことができます。おそらくあなたの問題ではないかもしれませんが、特にユニットテストが決して考慮されていないレガシーDBコードを扱う際には、他の人が心に留めておくべき問題です。

4

取引:

  • 書き込み/削除は、エラーの
  • マージンが小さくなっているロールバック、より高価になるかもしれません
2

(データを削除するには、あなたのコードは、バグがある可能性があります)私はまた、メモリのデータベースやMySQLの一時テーブルのための特定の接続を特定し、自動的に接続が閉じられるときに削除されます。 実際にトランザクション自体をテストしたいので、この種のテストにはトランザクションを使用しません。

0

これは、私が働く場所や、さまざまなソリューションのようなさまざまな開発者がいても、何度も繰り返されます。

まず、私は本当に、次のような理由

  1. コードのためのインメモリ・データベースを使用して同様のテストを上回るようには見えません。メモリ内でテストされているテーブルが実際のデータベースに存在しないコードベースが見つかりました。
  2. データベースはまったく同じではありませんが、メモリ内でhsqlを使用していてメインデータベースがMySQLの場合は、構文に違いがありますが、日付はほんの少しです。私はあなたがASCII Sqlを使用することができますが、あなたが実行しようとしているものではないものをテストしていることを知っています。違いが出てくるでしょう。

私は、トランザクションの開始前の正確な状態でデータベースを残すので、トランザクションのロールバックを優先しますが、何千ものトランザクションがある場合は、テストが大幅に遅くなる可能性があります。

私は時々、データベースのテストの価値を疑問視し、私たちは新鮮なデータベースに統合テストを実行continuos統合を好むんです。そうすれば、私たちはすべてのデータアクセスをカバーします。 単体テストでは、データアクセスレイヤをMockitoまたは同様のモッキングツールでモックします。テスト・データベースをテストは、テスト方法と@After前に停止した場合でも、変更されませんので

1

トランザクションのロールバックは、より安全です。

しかし、いくつかの制約がコミット中に新しいデータ(遅延された外部キーなど)に対してチェックされるので、テストのコミットと削除が優れているため、ロールバックでテストしないことがいくつかあります。

だから、それはあなた次第ですが、ほとんどの場合、トランザクションのロールバックは好きです。私はそれも好きです。

関連する問題