集成测试数据库重建性能

时间:2013-03-24 03:00:42

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

我正在对数据库运行一些集成测试。我想用种子数据设置数据库,运行我的测试,然后为每个测试删除数据库(因此每个测试都有一个新的平板)。我目前正在使用这些设置/拆解方法来执行此操作:

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();
}

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

2 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

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删除的代码。)

答案 1 :(得分:0)

根据您的代码,我了解您要删除插入数据库中的数据以进行测试。我以稍微不同的方式完成它,但它可能对您有所帮助。我们可以使用 TransactionScope 而不是手动删除数据。代码Using TransactionScope in TestMethod的图片 您也可以visit here了解该方法的详细信息。