【问题标题】:Integration testing database rebuild performance集成测试数据库重建性能
【发布时间】:2013-03-24 03:00:42
【问题描述】:

我正在对数据库运行一些集成测试。我想用种子数据设置数据库,运行我的测试,然后为每个测试删除数据库(所以每个测试都有一个新的石板)。我目前正在使用这些设置/拆卸方法来做到这一点:

private ProjectDbContext db;

[TestInitialize]
public void SetUp()
{
    db = new ProjectDbContext("TestConnection");
    (new SeedData()).Run(db); //Seed Data
}

[TestCleanup]
public void Teardown()
{
    db.Database.Delete();
    db.Dispose();
}

我的问题是每次测试需要半秒多一点,我希望看到更好的性能。有什么想法吗?谁有更好的策略?

【问题讨论】:

    标签: c# entity-framework unit-testing integration-testing


    【解决方案1】:

    根据您的代码,我了解到您想删除插入数据库进行测试的数据。我以稍微不同的方式完成了它,但它可能对你有帮助。我们可以使用 TransactionScope 代替手动删除数据。代码图片 也可以visit here了解具体做法。

    【讨论】:

      【解决方案2】:

      你可以这样做:

      public static void ClearDatabase(DbContext context)
      {
          var objectContext = ((IObjectContextAdapter)context).ObjectContext;
          var entities = objectContext.MetadataWorkspace.GetEntityContainer(objectContext.DefaultContainerName, DataSpace.CSpace).BaseEntitySets;
          var method = objectContext.GetType().GetMethods().First(x => x.Name == "CreateObjectSet");
          var objectSets = entities.Select(x => method.MakeGenericMethod(Type.GetType(x.ElementType.FullName))).Select(x => x.Invoke(objectContext, null));
          var tableNames = objectSets.Select(objectSet => (objectSet.GetType().GetProperty("EntitySet").GetValue(objectSet, null) as EntitySet).Name).ToList();
      
          foreach (var tableName in tableNames)
          {
              context.Database.ExecuteSqlCommand(string.Format("DELETE FROM {0}", tableName));
          }
      
          context.SaveChanges();
      }
      

      如果您没有任何限制,并且以某种方式为您的测试设置标识列很重要(我不建议这样做),您可以使用 TRUNCATE 而不是 DELETE FROM。

      here的删除代码。)

      【讨论】:

      • 抱歉,我的笔记本电脑在我打字的时候快死了,我想确保我事先得到了它。您必须确保数据库在测试之间持久存在,并且仅在它不存在时才创建(以确保测试可以原子运行但也可以按顺序运行)。我们这样做的方式是拥有从具有 DB 属性的抽象类继承的固定装置。因此,您检查数据库是否为空 - 如果是,则创建它,如果不是,则重新植入数据。
      • 见鬼,如果你想加快速度,你也可以让 tableNames 成为抽象的一个属性 - 设置一次,这样你就不必每次都进行反射拆解。
      • 谢谢!我正在考虑更多类似的事情。我必须确保它们的订购正确。
      猜你喜欢
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多