用于NUnit TestFixure和SetUp的嵌套TransactionScope

我从这个基类中派生出来,以便将每个单独的测试放入一个回退的事务中

public abstract class TransactionBackedTest
{
    private TransactionScope _transactionScope;

    [SetUp]
    public void TransactionSetUp()
    {
        var transactionOptions = new TransactionOptions
        {
            IsolationLevel = IsolationLevel.ReadCommitted,
            Timeout = TransactionManager.MaximumTimeout
        };

        _transactionScope = new TransactionScope(TransactionScopeOption.Required, 
                                                 transactionOptions);
    }

    [TearDown]
    public void TransactionTearDown()
    {
        _transactionScope.Dispose();
    }
}

使用这个我也尝试以同样的方式设置TestFixure事务:

[TestFixture]
class Example: TransactionBackedTest
{

    private TransactionScope _transactionScopeFixure;


    [TestFixtureSetUp]
    public void Init()
    {
        var transactionOptions = new TransactionOptions
        {
            IsolationLevel = IsolationLevel.ReadCommitted,
            Timeout = TransactionManager.MaximumTimeout
        };

        _transactionScopeFixure = new TransactionScope(TransactionScopeOption.Required,
                                                       transactionOptions);


        SetupAllDataForAllTest();
    }

    [TestFixtureTearDown]
    public void FixtureTearDown()
    {
        _transactionScopeFixure.Dispose();
    }


    public void SetupAllDataForAllTest()
    {
        // Sql stuff here that will get undone from the TestFixtureTearDown scope dispose
    }


    [Test]
    public void DoSqlStuff1()
    {
        // Sql stuff here that will get undone from the TransactionBackedTest
    }

    [Test]
    public void DoSqlStuff2()
    {
        // Sql stuff here that will get undone from the TransactionBackedTest
    }
}

这个想法是, SetupAllDataForAllTest在开始时运行一次,并插入所有测试依赖的基础数据。 一旦测试完成,这个基础数据需要被删除/回滚。

我也希望每个测试都是独立的,以便它们不会互相干扰。

我现在遇到的问题是,在第一次测试之后,它说明TestFixture事务已经关闭,即使我只希望它关闭SetUp事务。 我的假设是,如果你Dispose()和内部事务它把外部连接起来,所以我不知道如何完成我想做的事情


你没有说你使用的是什么数据库。

在MS SQL Server中,如果BEGIN TRANSACTION在另一个事务中(使它们嵌套),然后在嵌套事务中使用ROLLBACK TRANSACTION ,它将回滚所有事务(整个外部事务)。

没有savepoint_name或transaction_name的ROLLBACK TRANSACTION会回滚到事务的开始位置。 嵌套事务时,该同一语句将所有内部事务回滚到最外面的BEGIN TRANSACTION语句。

为了能够仅回滚内部嵌套事务,它应该由SAVE TRANSACTION <name>以嵌套事务的一些名称启动。 然后你可以通过ROLLBACK <name>来回滚嵌套的部分。

如果您正在使用其他数据库,则嵌套事务中的行为可能会有所不同。

我不知道如何让你的类根据事务是否嵌套来发出正确的BEGIN or SAVE TRANSACTION SQL语句。

链接地址: http://www.djcxy.com/p/28581.html

上一篇: Nested TransactionScope for NUnit TestFixure and SetUp

下一篇: How to test Spring @Scheduled