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

我想实现我的Entity Framework驱动的存储库的集成测试。 问题是如何在测试完成后回滚数据库状态。 目前,我计划在测试SetUp上启动事务,并在测试TearDown时将其回滚。 除手动数据库清除外还有其他解决方案吗?

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

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

祝好运。

我认为你走在正确的轨道上……

这是一个与Linq To SQL相同的例子,您可以自己调整。

此链接描述了三个选项 :

  • 交易
  • 重建数据库
  • 使用SQL Server快照

该post继续描述最快的事务与单个会话相关联,并可能产生一些实际问题/限制。 使用,如果你可以….

重建数据库很慢但绝对可行,但使用快照很快并且可以解决事务限制。

如果您需要在自动化测试中获得非常高的性能,请从同一个博主那里试试 。 他描述了使用MS Distributed Transaction Coordinator来消除单个会话的事务限制。

在安装和在TearDown中处置打开TransactionScope的问题是你没有测试提交!

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

最好的方法是交易方法。 我提供的链接包含一小段步行通过。 我接触过的几乎所有企业解决方案都使用基于事务的方法。 请务必查看文章底部的链接,这些链接指向Microsoft有关entity framework交易的文档的链接。 上面列出的其他选项在清理测试事务的简单概念中具有过度杀伤力。 构建数据库或使用服务器快照对此问题完全过分。 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; } } 

快速浏览事务回滚/清理方法