31

以前にこの質問をしました DALの単体テストを正しく行うには? 、私にとって未回答のことの1つは、DALを実際にテストすることがテストDBを持つことである場合、モックとテストDBの役割は何ですか?

これを追加するために、別の人が「単体テストの最後にトランザクションとロールバックを使用して、db をクリーンにする」ことを提案しました。つまり、db をテストします。DAL をテストするためのこのテスト + テスト DB + トランザクション ロールバック (つまり、db は実際には書かれていない) アプローチについてどう思いますか?

完全にするために、私の DAL は Entity Framework で構築されており、DB にはストアド プロシージャはありません。EF は非常に新しいため、DAL をテストして正しく動作することを確認する必要があります。

4

8 に答える 8

17

おそらく、制約、トリガー、自動インクリメント列など、データベース構造によって適用されるロジックをチェックするために、いくつかの統合テストを実行する必要があると思います。必要に応じて (単体テストで) 依存して、コーディングしたコンポーネントのみをテストします。SqlCommand や SqlConnection でメソッドをテストする必要はありません (たとえば)。使用するフレームワーク コンポーネントが機能し、既知のデータ (正常、不良、例外) をメソッドに返すスタブまたはモックを作成して、メソッドが適切に機能することを確認する必要があります。モックを作成しない場合は、データベースでデータを生成し、それが正しいことを確認する責任があります。また、ネットワーク、データベース自体、

また、単体テストによって他の種類のテストが不要になるわけではありません。統合テストと受け入れテストはまだ有効であり、実行する必要があります。単体テストと同じ頻度で実行する必要はなく、単体テストでコードの品質が向上するほど広範囲に行う必要はないかもしれませんが、単体テストは特効薬ではありません。

于 2008-11-21T21:50:51.937 に答える
11

データ アクセス コードをテストするとき、モックはあまり役に立ちませんでした。単体テストの目的は、データベース関連のコードが機能することを確認することであり、データベースをモックするとテストが妨げられます。

ビジネスコードをテストするとき、モッキングは確かに役に立ちます。データベース呼び出しをモックしてテスト データを返し、そのような状況でのビジネス ロジックの動作を検証できます。

トランザクションの使用に関して - アーキテクチャに、テストの開始時にトランザクションを開始し、そのトランザクション内でユニット テストのすべてのデータベース関連の呼び出しを実行する余地がある限り、それは確かに可能です。しかし、それを試したことはありません。

于 2008-11-21T21:54:17.157 に答える
1

トランザクション単位のテストを使用して、Hibernate のマッピングの問題を数回防止しました。それ以外の場合 - 単体テストとは何ですか? のような些細なことList<Item> getAllItems()?:)

于 2008-11-22T00:14:22.583 に答える
0

ただし、アプリをテストするだけではありません。また、構成とストアド プロシージャおよびビューもテストしています。これらは単体テストで文書化されています。

于 2012-09-20T16:48:38.013 に答える
0

テスト データベースを使用することで、データベース自体または DAL とデータベースの間の通信パス (ネットワークなど) で問題が発生する可能性が開かれます。モッキングはそれらの可能性を排除します。

于 2008-11-21T21:44:26.273 に答える
-1

問題は元の質問にある可能性が非常に高いです。DbSetMVC のより一般的な例のいくつかは、次のような値を返すことでショートカットを使用します。

public class MusicStoreEntities : DbContext
    {
        public DbSet<Album> Albums { get; set; }
        public DbSet<Genre> Genres { get; set; }
        public DbSet<Artist> Artists { get; set; }
        public DbSet<Cart> Carts { get; set; }
        public DbSet<Order> Orders { get; set; }
        public DbSet<OrderDetail> OrderDetails { get; set; }
    }

私にとって、これは永続性の実装と密接に結びついており、これは悪いことだと思います。嘲笑されやすい方は帰っList<t>たほうがいい。

于 2012-09-06T15:03:49.477 に答える