通过在EntityFramework中仅使用部分数据库来加快测试速度

问题描述 投票:0回答:2

用例:我们有一个很大的数据库(大约200个表),用于大型(旧版)系统。它以数据库优先方式实现,其中一个edmx文件定义了整个数据库。我们正在使用XUnit和Effort进行自动测试。问题在于这些测试非常缓慢。即使我们没有达到我们想要的测试范围,运行我们当前的测试套件也需要大约7-8分钟的时间。

我已经注意到,如果我创建edmx文件的较小子集,通过删除一些不需要的表,测试运行速度会更快。

我正在寻找一种解决方案,对于特定的测试或一组测试,我们可以通过某种方式使Effort仅创建所需表的子集(我认为在许多情况下,我们只需要一个表)。

当前,我们正在像这样建立连接:

connection = EntityConnectionFactory.CreateTransient("metadata=res://entities.csdl|res://entities.ssdl|res://entities.msl");

是否有某种方法可以(例如,通过在运行时中运行XML转换)使Effort仅创建我们定义的表的子集所需的数据结构?

entity-framework unit-testing entity-framework-6 effort
2个回答
1
投票

免责声明:我是项目Entity Framework Effort]的所有者

我们的库具有允许创建还原点并回滚到它的功能。

因此,通过使用此技巧,在创建所有表时只能使用CreateRestorePoint()一次,然后对于每个测试,都以RollbackToRestorePoint开始。 (还有其他几种方法可以使它起作用,但是我想您明白了)

毫无疑问,这将使您的测试运行更快,因为不必每次都创建表。

这里是一个例子:

var conn = Effort.DbConnectionFactory.CreateTransient();

using (var context = new EntityContext(conn))
{
    context.EntitySimples.Add(new EntitySimple { ColumnInt = 1 });
    context.EntitySimples.Add(new EntitySimple { ColumnInt = 2 });
    context.EntitySimples.Add(new EntitySimple { ColumnInt = 3 });
    context.SaveChanges();
}

// Create a RestorePoint that will save all current entities in the "Database"
conn.CreateRestorePoint();


// Make any change
using (var context = new EntityContext(conn))
{
    context.EntitySimples.RemoveRange(context.EntitySimples);
    context.SaveChanges();
}

// Rollback to the restore point to make more tests
conn.RollbackToRestorePoint();

0
投票

分离出单元测试和集成测试。对于集成测试,可以使用数据库并在更高的环境上运行(以节省时间),但是在本地环境上,可以使用Faker \ Bogus和NBuilder生成大量数据进行单元测试。

© www.soinside.com 2019 - 2024. All rights reserved.