代码之家  ›  专栏  ›  技术社区  ›  SiberianGuy

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

  •  17
  • SiberianGuy  · 技术社区  · 14 年前

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

    5 回复  |  直到 12 年前
        1
  •  25
  •   Steven    14 年前

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

    public class IntegrationTestsBase
    {
        private TransactionScope scope;
    
        [TestInitialize]
        public void Initialize()
        {
            this.scope = new TransactionScope();
        }
    
        [TestCleanup]
        public void TestCleanup()
        {
            this.scope.Dispose();
        }
    }
    

    祝你好运。

        2
  •  5
  •   Kevin LaBranche    14 年前

    我觉得你走对了。。。。

    Here's an example doing the same with Linq To SQL that you can tweek for yourself.

    This link describes three options :

    • 重建数据库

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

    如果您需要在自动化测试中具有非常高的性能 try this from the same blogger

        3
  •  4
  •   Piotr Perak    13 年前

    在安装程序中打开TransactionScope并在拆卸中处理的问题是,您没有测试提交!

        4
  •  2
  •   Rob Fonseca-Ensor    14 年前

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

        5
  •  1
  •   Mike    6 年前

    最好的方法是事务性方法。我提供的链接包含一个简短的介绍。我接触过的几乎所有企业解决方案都使用基于事务的方法。另外,请务必查看文章底部的链接,这些链接指向有关entity framework事务的Microsoft文档。上面列出的其他选项在清理测试事务的简单概念中是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;
      }
    }
    

    Great quick walk through on transactional rollback/cleanup approach