永続性を単体テストするにはどうすればよいですか?
-
08-06-2019 - |
質問
テスト駆動開発を実践する初心者として、私はデータベースに対する永続性の単体テストをどのように行うかについて、しばしば困惑することがあります。
技術的には、これが (単体テストではなく) 統合テストになることはわかっていますが、次のことに対する最適な戦略を見つけたいと考えています。
- クエリのテスト。
- インサートのテスト中。インサートが失敗した場合、どのようにしてそのインサートが間違っているかを知ることができますか?挿入してクエリを実行することでテストできますが、クエリが間違っていないことをどうやって確認できるのでしょうか?
- 更新と削除のテスト -- 挿入のテストと同じ
これらを行うためのベストプラクティスは何ですか?
SQL のテストについて:これができることはわかっていますが、NHibernate のような O/R マッパーを使用すると、出力クエリに使用されるエイリアスにいくつかの命名上の問題が付加されます。これはやや予測不可能なため、テストできるかどうかわかりません。それ。
すべてを放棄して、単に NHibernate を信頼する必要がありますか?それが賢明かどうかはわかりません。
解決
DBユニットを調べてください。これは Java ライブラリですが、C# に相当するライブラリが必要です。これにより、一連のデータを使用してデータベースを準備して、データベースの内容を把握し、DB ユニットとインターフェースしてデータベースの内容を確認できるようになります。多くのデータベース システムに対して実行できるため、実際のデータベース セットアップを使用することも、Java の HSQL (メモリ内オプションを備えた Java データベース実装) などの他のものを使用することもできます。
コードがデータベースを適切に使用していることをテストしたい場合 (おそらくそうすべきです)、これは各テストを分離し、データベースに予期したデータが準備されていることを確認する方法です。
他のヒント
として マイク・ストーンは言った, DbUnit は、テストを実行する前にデータベースを既知の状態にするのに最適です。テストが終了すると、DbUnit はデータベースをテスト実行前の状態に戻すことができます。
データベース接続を模擬して単体テストを行います。このようにして、メソッド呼び出しのフロー内の特定のクエリが成功または失敗するシナリオを構築できます。私は通常、実際のクエリ テキストが無視されるように疑似期待値を構築します。これは、実際にはメソッドのフォールト トレランスとメソッド自体の処理方法をテストしたいためです。SQL の詳細はその目的には無関係です。
これは明らかに、テストではメソッドが実際には検証されないことを意味します。 作品, SQLが間違っている可能性があるためです。ここで統合テストが始まります。それについては、私自身もまだ理解し始めたばかりなので、他の誰かがより完全な答えを持っていることを期待しています。
についてここに記事を書きました データ層の単体テスト これはまさにこの問題をカバーしています。(恥ずかしい)プラグインで申し訳ありませんが、記事が長すぎるため、ここに投稿できません。
お役に立てば幸いです。過去 6 か月間、3 つのアクティブなプロジェクトで非常にうまくいきました。
よろしく、
ロブ・G
永続性の単体テスト、特に ORM を使用せずにデータベース (接続) をモックするときに私が経験した問題は、クエリが成功したかどうかが実際にはわからないということです。クエリが特定のデータベース バージョン向けに特別に設計されており、そのバージョンでのみ成功する可能性があります。データベースをモックしても、それを見つけることはできません。したがって、私の意見では、単体テストの永続性の用途は限られています。対象のデータベースに対して実行するテストを常に追加する必要があります。
のために NHibernate
, 、私は間違いなく、ただ嘲笑することを主張します。 NHibernate API
単体テストの場合 -- ライブラリが正しいことを行うと信頼します。データが実際に DB に送信されることを確認したい場合は、統合テストを実行します。
JDBC ベースのプロジェクトの場合、私の Acolyte フレームワークを使用できます。 http://acolyte.eu.org 。特定のテスト DB を管理することなく、JDBC 抽象化の恩恵を受けて、テストしたいデータ アクセスをモックアップできます。
また、データベースをモックして、クエリが期待どおりであることを確認します。テストで間違った SQL がチェックされるリスクがありますが、これは統合テストで検出されます。
技術的には、永続性の単体テストは単体テストではなく、統合テストです。
mbUnit を使用する C# では、SqlRestoreInfo 属性と RollBack 属性を使用するだけです。
[TestFixture]
[SqlRestoreInfo(<connectionsting>, <name>,<backupLocation>]
public class Tests
{
[SetUp]
public void Setup()
{
}
[Test]
[RollBack]
public void TEST()
{
//test insert.
}
}
属性名が若干異なることを除いて、NUnit でも同じことができます。
クエリが成功したかどうかを確認するには、通常、データベースが期待どおりに変更されたかどうかを確認するために 2 番目のクエリを実行する必要があります。
私は通常、リポジトリを作成し、それを使用してエンティティを保存し、新しいエンティティを取得します。次に、取得されたものは保存されたものと等しいと主張します。