如何单元测试数据库类

问题描述:

这可能已经问了很多次,但这里有云:如何单元测试数据库类

我有一类完全DB连接

开放连接
查询数据库
读值
收盘连接

我应该如何测试这个东西?

我是否需要创建一个假数据库? 我想我可以模拟MySql类(用于C#),但这也是很多工作。

一些陈述是“INSERT INTO”,我应该怎么做呢?

+3

如果您认为某个问题可能已经被询问bofore,您应该[搜索它](http://*.com/search?q=unit+test+database+class)。 – meagar 2010-10-26 20:38:12

难以测试的东西通常是tightly coupled或不在Single Responsibility principle之后。

首先。拆分你的数据层。看看repository pattern。每个实体(表或视图)应该有它自己的类获取数据。

使用数据接口而不是特定的驱动程序实现:IDbConnection而不是SqlConnection。使用DbProviderFactory来获得正确的连接实现。然后使用connection.CreateCommand()来获取命令等。

这样做会使测试数据层变得容易很多。请记住,datalyer不应该有任何逻辑。它的唯一目的是从数据源加载数据。

但是,如果你不想改变的东西:对数据库的工作是最简单的方法。删除所有数据并在每次测试之前插入新的测试数据(以删除先前测试期间的任何更改)。

+0

好,但要小心这些单元测试是否并行运行 - 在这一点上,第二次测试将擦除第一次测试所需的数据。如果测试框架发生了变化,或者新版本更改了测试执行顺序,则会发生这种情况。我最近调试了这个确切的问题。 – 2011-11-21 11:27:24

最简单的做法是创建一个新的测试数据库并制作一些插入查询,然后将结果集存储在一个列表或其他东西中,然后使用调试器运行它,以查看它是否将结果集存储在列表中创建。

不要在源代码中插入任何插入内容,请使用sql管理工作室并在其中插入内容,直到您知道连接和一切正常。现在就列出所有这些值。

您可以使用在本机上运行的实时MySql数据库。

我已经做了NuGet包用于此目的,可以添加到您的项目:https://github.com/stumpdk/MySql.Server

它每次运行测试时启动一个本地MySQL服务器。它很快,为您的团队提供了可共享的解决方案,而且您不必花费时间安装服务器。