3

テストの前にデータベースにデータを挿入し、テストの実行後にデータをロールバックするプロジェクト/ツールを探しています。

ruby on rails には yaml フィクスチャがあることを知っているので、.net プロジェクト用のプロジェクトがあることを期待していました。

4

2 に答える 2

2

.NETのテストにデータを提供するための良い方法がいくつかあります。1つは、パラメーター化されたテストや理論など、NUnitに組み込まれている機能を使用することです。

パラメータ化されたテスト:

TestCaseAttributeを使用すると、nunit.orgの次の例のように、ハードコードされたデータをテストに簡単に提供できます。

[TestCase(12,3, Result=4)]
[TestCase(12,2, Result=6)]
[TestCase(12,4, Result=3)]
public int DivideTest(int n, int d)
{
  return( n / d );
}

TestCaseDataAttributeを使用すると、データの提供(データベースからのデータの返送など)をより簡単に行うことができます。

ロールバックのトランザクション

よく使用されるもう1つのトリックは、トランザクションに依存することです。基本的に、テストの前にトランザクションを開始し、テスト後にロールバックします。これは基本クラスを使用して自動化することもできるため、テストではトランザクション自体をまったく処理しません。たとえば、次のようなテストフィクスチャの基本クラスがあるとします。

public class TestBase
{
    private TransactionScope _transacation;

    [SetUp]
    public virtual void InitializeTest()
    {
        //NOTE: Base class TestInitialize methods are called before test Initialize methods in derived class.

        // Setup a DB transcation to roll everything back after the tests.
        if (_transacation != null)
            throw new Exception("old transacation still exists");
        // Give a long timeout on this transacation for debugging...
        _transacation = new TransactionScope(TransactionScopeOption.RequiresNew, TimeSpan.FromSeconds(60));   
    }

    [TearDown]
    public virtual void CleanupTest()
    {

        // Roll all the changes made during the test back.
        _transacation.Dispose();
        _transacation = null;
    }
}

基本クラスのTestInitialize装飾メソッドは、派生クラスのTestInitializeメソッドの前に呼び出されるため、親クラスのTestInitializeメソッドのデータベースにデータを追加することもできます。

親クラスは次のようになります。

[TestFixture]
public class MyClassTests : TestBase
{
    [TestFixtureSetUp]
    public void InitializeUnit()
    {
            //Setup mocks...
    }

    [SetUp]
    public override void InitializeTest()
    {   
            base.InitializeTest();
            // Add test data to database
    }

    [Test]
    public void RealTest()
    {
            ...
    }
}
于 2011-10-27T00:40:44.723 に答える
0

私は Sql Server Compact Edition を使用し、毎回データベースの新しいコピーを再生成します (最初のデータベースをコピーするだけで問題ありません)。読み取り専用モードで使用すると、複数のテストで同じデータベース ファイルを共有できます。

いくつかの落とし穴があり、プログラマビリティはサポートされていませんが、私が必要としていた基本にはうまく機能します。また、驚くほど速いです。

于 2009-02-24T14:59:05.573 に答える