C# 执行回滚-存储库集成测试

C# 执行回滚-存储库集成测试,c#,.net,database,entity-framework,C#,.net,Database,Entity Framework,我想实现实体框架驱动存储库的集成测试。问题是如何在测试完成后回滚数据库状态。目前,我正计划在测试设置时启动事务,并在测试拆卸时回滚它。除了手动清除数据库外,还有其他解决方案吗?这可能是最简单的方法,另一种方法是在安装时重建数据库。我认为您的思路是正确的 : 交易 重建数据库 使用SQL Server快照 文章接着描述了最快的事务与单个会话相关,可能会产生一些实际问题/限制。如果可以,请使用 重建数据库的速度很慢,但肯定是可行的,但使用快照速度很快,可以绕过事务限制 如果您需要在自动化测试中

我想实现实体框架驱动存储库的集成测试。问题是如何在测试完成后回滚数据库状态。目前,我正计划在测试设置时启动事务,并在测试拆卸时回滚它。除了手动清除数据库外,还有其他解决方案吗?

这可能是最简单的方法,另一种方法是在安装时重建数据库。

我认为您的思路是正确的

:

  • 交易
  • 重建数据库
  • 使用SQL Server快照
文章接着描述了最快的事务与单个会话相关,可能会产生一些实际问题/限制。如果可以,请使用

重建数据库的速度很慢,但肯定是可行的,但使用快照速度很快,可以绕过事务限制


如果您需要在自动化测试中具有非常高的性能。他描述了如何使用MS分布式事务协调器消除单个会话的事务限制

我们在使用MSTest的集成测试中这样做。我们使用
TransactionScope
并在基类中实现测试设置和拆卸。这允许您在事务中运行所有集成测试。基类看起来很像这样:

public class IntegrationTestsBase
{
    private TransactionScope scope;

    [TestInitialize]
    public void Initialize()
    {
        this.scope = new TransactionScope();
    }

    [TestCleanup]
    public void TestCleanup()
    {
        this.scope.Dispose();
    }
}

祝你好运。

在设置中打开TransactionScope,在拆卸中处理的问题是,你没有测试提交

最好的方法是事务性方法。我提供的链接包含一个简短的浏览。我接触过的几乎所有企业解决方案都使用基于事务的方法。请务必查看文章底部的链接,这些链接指向Microsoft关于entity framework事务的文档。在清理测试事务的简单概念中,上面列出的其他选项是compete overkill。在这个问题上,构建数据库或使用服务器快照完全是小题大做。TransactionScope甚至不执行该事务,而留下未完成的集成测试

实现事务

这将在每个测试开始前创建一个事务,并在每个测试结束后回滚该事务

[TestClass]
public class TransactionTest
{
  protected EntitiesV3 context;
  protected DbContextTransaction transaction;

  [AssemblyInitialize]
  public static void AssemblyStart(TestContext testContext)
  {
    RetryDbConfiguration.SuspendExecutionStrategy = true;
  }

  [TestInitialize]
  public void TransactionTestStart()
  {
    context = new EntitiesV3();
    transaction = context.Database.BeginTransaction();
  }

  [TestCleanup]
  public void TransactionTestEnd()
  {
    transaction.Rollback();
    transaction.Dispose();
    context.Dispose();
  }

  [AssemblyCleanup]
  public static void AssemblyEnd()
  {
    RetryDbConfiguration.SuspendExecutionStrategy = false;
  }
}

据我所知,
TransactionScope
适用于Oracle。它是专为多服务器多供应商(两阶段提交)通信而设计的。在测试中执行repo.Save(someObject)后,如何检查对象是否已保存?@Peri您创建TransactionScope ala“返回新TransactionScope(TransactionScope选项)。必需,新TransactionOptions{IsolationLevel=IsolationLevel.ReadUncommitted})。这样,您可以看到未提交的行:-)@Peri:或者您只需在该测试中查询数据库。由于您在同一事务中运行,这应该可以工作。无需任何特殊要求。是否有可能只有在提交后才可以看到一些我们在测试中未执行的错误?例如,某些约束检查失败等等。是否是数据库错误gine(SQL Server、Oracle、MySQL…)独立?如果我们正在测试我们的类是否可以读取数据,并且它们使用ReadCommitted隔离级别,该怎么办?