質問

ユニットテストに関するこの質問 私を悩ませている別のことを引き起こしました。データベースにヒットしたときに、ユニットテストを行う3つの方法を行き来しました。

  1. モックオブジェクトを作成してプラグインします。これにはデータベースが必要ないという利点がありますが、時間がかかるという利点があり、投資収益率がわかりません。私はIOCとMOQに少し入りましたが、それでも痛みを伴うようです。
  2. 既知のケースを作成するために、セットアップおよび断片化データベーススクリプトを作成し、それらをテストします。繰り返しますが、時間がかかる場合もありますが、ほとんどの場合、モックオブジェクトよりも作成しやすくなります。また、職場の他の人は、ローカルホストにSQLサーバーがあると仮定して、まだ実行できます。
  3. 開発データベースを手動で確認し、ユニットテストを変更します。集中的に手動で作業しますが、変更されない「テストセット」がある場合、うまく機能しているようです。私のマシンで、少なくとも:-)。

オプション1はユニットテストを行う「適切な」方法であることは知っていますが、3つのうち、それはおそらく私が最も使用したオプションです(最新のプロジェクトはIOCを使用しているので、ドアは私に開かれています)。私はそれの多くが正確に何を模倣されているのか、何をテストしているのかに依存していることに気付きましたが、ここで何が欠けているのでしょうか?

コンテキストが役立つ場合、私はC#Shopに参加して、社内アプリケーションを作成していますが、開発者は数人しかいません。

役に立ちましたか?

解決

最初のものは、ほんの一握りを公開するデータアクセスレイヤーを持っている場合、それほど難しくないはずです IQueryable<T> 方法。偽のデータに使用できる素晴らしいトリックがあります:エンティティオブジェクトをに保存するだけです List<T> そして使用します AsQueryable. 。これは、データパーツのMOQよりも簡単だと思います。

IOCに関して、私はそれが現在使いすぎているという立場を取ります(私の意見はこの点で少数のプログラマーを表していることに注意してください)。次のようなツールを使用できます ほくろ プログラムの設計を悪用することなく、モックするテスト中。設計が実際にそれを必要としない限り、私はIOCを使用しません。

他のヒント

私は間違いなく真のユニットテストを引き続き使用します(オプション1)。私はこれに対するスティーブンのアドバイスが好きです。

また、実際のデータベースを使用した統合テストを見つけることもできます(オプション2) 必要 同様に使用する(オプション2)。なんで?テストする必要があるもの(O/Rマッピング、実際のDBスキーマとの互換性など)の一部は、真の単位テストではカバーされていないためです。

セットアップと分解ロジックについては、これから継承すると十分に十分です(データベースに.NET、nunit、およびsqlserverを使用):

using System.Transactions;
using NUnit.Framework;
namespace Crown.Util.TestUtil
{
    [TestFixture]
    public class PersistenceTestFixture
    {
        public TransactionScope TxScope { get; private set; }

        [SetUp]
        public void SetUp()
        {
            TxScope = new TransactionScope();
        }

        [TearDown]
        public void TearDown()
        {
            if (TxScope != null)
            {
                TxScope.Dispose();
                TxScope = null;
            }
        }
    }
}

やさしい。

これに対する一連の答えがあります。最初にすべきことは、あなたがテストしているものを明確に明確に表現することです。それは、その背後にデータベース、DAOオブジェクト、データベース構造があるAPIのファサードですか?

これに到達することは、物事をテストするための最良の方法を決定するのにも役立ちます。あなたがリストしているものの代替手段を見ることができるものからもあります。つまり、HSQLなどのメモリデータベースで起動し、クラスとテストを実行します。これは、テストの開始時にデータベース構造を作成できることを意味します。メモリにあるため、データベースサーバーを使用することを心配する必要はありません。高速で、テストに固有のデータでロードできます。

私はモックをかなり使用していますが、クラスのユニットテストには優れていますが、場合によってはそうではありません。また、リードを非常に簡単に見逃すこともあります。モックで機能するものが統合されたときに機能しないことは珍しくありません。これの理由は、特定の期待と応答を模擬模擬にロードしているということです。これは、模擬が表すものから誤って意図している可能性があります。

誤解しないでください、私は模擬が好きで、かなり使用します。しかし、そうすることで、何かがユニットテストされているため、それは正しいことを決して想定してはなりません。チャンスが増加しますが、統合テストでは実際には100%の保証が得られます。

これが難しいと感じさせる、本当に何をテストしていますか?

永続的なコードからビジネスとサービスレイヤーのロジックを切り離す場合、DBを使用せずにユニットテストするコードを隔離できるようにする必要があります。

単体テストの最も重要な原則の1つは、分離して分離してテストすることです。それを行う方法を明確に理解している場合、ユニットテストは簡単です。そうしないと、単体テストが難しくなります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top