如何'单位'测试数据库访问层

时间:2015-09-02 09:04:23

标签: c# .net database unit-testing

我编写了一个.Net应用程序,它有许多组件,其中一些组件是数据库访问层,它们从数据来源的其他组件中抽象出来。

我通过模拟数据库访问层对其余组件进行了单元测试。我测试数据库访问层的一种方法是在测试服务器上使用create new empty database。这可能很慢,并且大多数人认为它不是单元测试,因为我依赖于数据库服务器。

我认为我想要的是一个模拟的数据库,我可以用它来测试我的数据库访问层。模拟数据库可以被赋予一个模式并处理SQL命令,就好像它是一个远程数据库,但实际上它都是内存中的。这是否存在?或者我如何测试我的SQL和数据库< - >数据模型代码。

要解决我的问题,您可能想知道我使用的是SQL Server,2008及更高版本,我的代码是用C#编写的,使用.Net 4.5运行并使用Visual Studio 2013

注意:我不想使用Linq2SQL / EntityFramework来替换我的数据库访问层,因为根据我的经验,它很难调试问题和性能问题。

我试着仔细地说出我的问题,以避免人们在应该测试什么以及如何测试他们的信念,但也许更直言不讳: 我想对我的SQL进行单元测试,对该程序的结果产生很大影响的小改动。我确实有集成测试,但是为测试环境创建发布版本需要花费更长的时间来调整代码并运行单元测试。 我感谢人们花时间阅读我的问题,无论如何回应。

1 个答案:

答案 0 :(得分:1)

我不知道这是否是最好的答案,但是。我们正在做的是我们正在使用SQLite,这是一个内存数据库。有许多不同的方法可以设置它,我们使用NHibernate作为ORM,为此使用FluentNHibernate进行设置相当容易,但我不认为使用任何其他框架要困难得多:

Fluently.Configure()
            .Database(SQLiteConfiguration.Standard.InMemory())
            .Mappings(m => ... )
            .BuildConfiguration()
            .BuildSessionFactory();

我认为您可以在没有任何ORM的情况下对SQLite数据库运行查询,例如使用基础SqlConnection类。

这个数据库可以接受迁移,模式等。它的行为非常接近正确的MsSql数据库,我们可以对它运行任何DDL和DML语句,并且它工作正常。因为它全部在内存中,所以它也非常快。