2008-08-05 5 views
41

テスト駆動開発の初心者として、テストの永続性をデータベースに分割する方法については、しばしば困惑します。ユニットテストの永続性はどのようにして得られますか?

私は技術的には、これは統合テスト(ないユニットテスト)になることを知っているが、私は次のために最善の戦略を知りたい:

  1. テストを照会します。
  2. インサートのテスト。それが失敗した場合、インサートが間違っていることをどのように知ることができますか?挿入してからクエリを実行することでテストできますが、クエリが間違っていないことをどのように知ることができますか?
  3. テストの更新と削除 -

テストのインサートと同じでは、これらを行うためのベストプラクティスは何ですか?テストSQLについて


:私はこれを行うことができることを承知していますが、私はNHibernateのようにO/Rマッパーを使用している場合、それは出力クエリに使用別名でいくつかの命名いぼを添付し、その通りですいくぶん予期せぬことに、私はそれを試すことができるとは確信していません。

私はちょうど、すべてを放棄し、単にNHibernateを信頼する必要がありますか?私はそれが賢明であるかどうかはわかりません。

答えて

16

DBユニットを調べます。これはJavaライブラリですが、C#に相当するものが必要です。データベースの内容を把握できるようにデータベースの準備を行い、データベース内の内容を確認するためにDBユニットとインターフェースすることができます。これは多くのデータベースシステムに対して実行できるので、実際のデータベース設定を使用するか、JavaのHSQL(メモリオプションを備えたJavaデータベース実装)のようなものを使用することができます。

あなたのコードがデータベースを適切に使用していることをテストしたい場合は、これがそれぞれのテストを分離し、データベースが予期されたデータを準備していることを確認する方法です。

4

データベース接続を模擬してユニットテストを行います。このようにして、メソッド呼び出しのフロー内の特定のクエリが成功または失敗するシナリオを構築できます。私は実際には、実際のクエリテキストが無視されるように私のモックの期待を構築します。なぜなら私は本当にメソッドのフォールトトレランスをテストしたいし、それ自身をどのように処理するのかということです.SQLの詳細は無関係です。

明らかに、これは、実際には、のメソッドがであることをテストで確認できないことを意味します。これは、SQLが間違っている可能性があるためです。これは統合テストが始まるところです。そのために、他の誰かがもっと徹底的な答えを得ることを期待しています。

1

また、データベースを模擬して、クエリが期待どおりであることを確認します。テストで間違ったSQLがチェックされる危険性がありますが、これは統合テストで検出されます

2

ユニットテストの永続性、特にORMがなく、データベース(接続)を嘲笑しているときに発生した問題は、あなたの質問が成功するかどうか本当に分かりません。クエリは特定のデータベースバージョン用に特別に設計されており、そのバージョンでのみ成功する可能性があります。あなたがあなたのデータベースを模倣するなら、あなたはそれを決して見つけられません。だから、私の意見では、単体テストの永続性は限られた使用に過ぎません。常に対象となるデータベースに対して実行されるテストを追加する必要があります。

+0

私はTDDの純粋さをしたことはありませんでしたが、私はTDDのメリットの多くを見ていますが、現実を無視して、あなたのアプリケーションが真実であるかどうかわからない野生でやろうとしている。何度も何度も私に割り当てられた "バグ"が私のコードが動作していないことを知り、私は単体テストを実行し、別の開発者が私のsproc(邪悪な悪魔のsprocs)の全部を踏んだり、私のユニットテストは彼らがシステム全体を破壊したのを見ます。 –

2

NHibernateの場合、単体テストのためにNHibernate APIを嘲笑するだけでよいでしょう - ライブラリが正しいことをするのを信頼してください。データが実際にDBに送られるようにするには、統合テストを行います。

1

持続的なユニットテストはユニットテストではなく、統合テストです。 MbUnitのを使ってC#で

、あなたは、単に使用SqlRestoreInfoとロールバックが

[TestFixture] 
    [SqlRestoreInfo(<connectionsting>, <name>,<backupLocation>] 
    public class Tests 
    { 

     [SetUp] 
     public void Setup() 
     { 

     } 

     [Test] 
     [RollBack] 
     public void TEST() 
     { 
      //test insert. 
     } 
    } 

属性と同じではNUnitので行うことができ、excpet属性名はslighty異なります。

クエリが成功したかどうかを確認するために、通常、データベースが期待どおりに変更されているかどうかを確認するために2番目のクエリを実行する必要があります。

3

この正確な問題をカバーするunit testing the data layerに関する記事をここに書いています。 (恥ずかしい)プラグのお詫びですが、記事が長すぎてここに投稿できません。

私はあなたに役立つことを願っています。過去6ヶ月間、3つのアクティブなプロジェクトでとてもうまくいきました。

よろしく、

ロブG

15

Mike Stone saidとして、DbUnitをあなたのテストを実行する前に、既知の状態にデータベースを取得するための素晴らしいです。テストが終了すると、DbUnitはテストを実行する前の状態にデータベースを戻すことができます。

DbUnit (Java)

DbUnit.NET

1

私は通常のリポジトリを作成し、新鮮なものを取得し、その後、私のエンティティを保存するためにそれを使用。次に、私は、取り出されたものが保存されたものと等しいことを主張する。

2

JDBCベースのプロジェクトでは、Acolyteフレームワークを使用することができます。http://acolyte.eu.org。特定のテストDBを管理することなく、JDBC抽象化の恩恵を受けるテスト用のデータアクセスをモックアップすることができます。

関連する問題