2

私は、SetUp フェーズ中に TransactionScope を開き、ティアダウン中にトランザクションをロールバックする NUnit テスト フィクスチャの基本クラスを作成するとよいと考えていました。このようなもの:

    public abstract class TestFixtureBase
{
    private TransactionScope _transaction;

    [TestFixtureSetUp]
    public void TestFixtureSetup()
    {
        _transaction = new TransactionScope();
    }

    [TestFixtureTearDown]
    public void TestFixtureTearDown()
    {
        if (_transaction != null)
        {
            _transaction.Dispose();
        }
    }
}

これは良い考えだと思いますか?

明らかに、データベースは単なるテスト データベースであり、ライブ データベースではありませんが、単体テストからのジャンク データでいっぱいになると、やはり面倒です。

大量のデータ アクセスを伴う単体テストを実行するとき、他の人は何をしますか?

4

2 に答える 2

4

ここで気をつけていただきたいことがあります。データベースへの複数の接続を開くと、TransactionScope はトランザクションを分散トランザクションに昇格させます。テストの実行を開始する前に、テスト クラスに対して対象のテーブルをクリアする単純な SQL を記述する方が簡単であることがわかりました。

編集:通常、データベースに触れるテストは、別のシステムが関与するため、統合テストと呼びます。通常、コードの単体テストを行うときは、データベースをモックアウトします。

[TestSetup]
public void Setup()
{
   foreach (string table in new string[] { "table1", "table2" })
   {
        ClearTable( table );
   }
}

private void ClearTable( string table )
{
     ...standard stuff to set up connection...
     SqlCommand command = connection.CreateCommand() );
     command.CommandText = "delete from " + table;
     command.ExecuteNonQuery();
     ... stuff to clean up connection...
}
于 2008-12-02T04:19:57.017 に答える
1

XtUnitを使用しました。単体テスト の最後に自動的にロールバックします。[Rollback] 属性をテストに追加するだけです。これは、NUnit または MbUnit の拡張です。

于 2008-12-09T19:04:49.767 に答える