C# 如何对依赖于数据库的行为进行单元测试#
C# 如何对依赖于数据库的行为进行单元测试#,c#,database,unit-testing,C#,Database,Unit Testing,我有一个与DB通信的C#应用程序。我想测试一些依赖于数据库的函数。所以我想确保DB在每次测试运行之前都有一个初始状态。我使用NUnit测试我的应用程序。有什么方法可以恢复DB的初始状态? 谢谢你的帮助 您可以使用内存中的SQLite数据库来创建测试数据库环境 您应该使用模拟程序(插件),如: 或 这些程序可以在测试期间模拟数据库之类的数据源。您不需要对与数据库的交互进行单元测试。这种类型的测试称为集成测试。为此,您可以使用常用的测试工具(NUnit、MSTest等),但最好是在单独的项目中分离
我有一个与DB通信的C#应用程序。我想测试一些依赖于数据库的函数。所以我想确保DB在每次测试运行之前都有一个初始状态。我使用NUnit测试我的应用程序。有什么方法可以恢复DB的初始状态?
谢谢你的帮助 您可以使用内存中的SQLite数据库来创建测试数据库环境
您应该使用模拟程序(插件),如: 或
这些程序可以在测试期间模拟数据库之类的数据源。您不需要对与数据库的交互进行单元测试。这种类型的测试称为集成测试。为此,您可以使用常用的测试工具(NUnit、MSTest等),但最好是在单独的项目中分离集成测试,使用专用的测试数据库,并在回滚的事务(例如,use)中运行这些测试。这可以确保数据不会更改,并且测试的行为是可预测的,这一点非常重要
如果可以,请尝试以这样一种方式设计应用程序,即很容易伪造所有外部源(如数据库),以便运行(通常更快)单元测试。然而,这并不容易。尤其是在处理尚未设计为可测试性的现有应用程序时。在这种情况下,我发现集成测试是一个很好的开始。正如其他人所说,在单元测试中,您不能依赖DB及其结构。 因此,我将创建一个接口,该接口对使用它的组件(也称为DB抽象层)隐藏DB,然后为了单元测试而实现内存中的DB 内存中DB的表可以使用一个简单的C#哈希表为每个DB表实现
这种分离还有一个好处,就是在您的代码中,在DB和使用它的组件之间创建一个分离(例如,从MySQL移动到Oracle等)。考虑切换到MbUnit进行集成测试。它有非常方便的回滚属性,完全符合您的需要
MbUnit具有与NUnit相同的用于标记测试类和方法的属性。因此,您只需更改using指令并引用MbUnit dll。单元测试通常意味着单独测试代码。。。模拟数据库怎么样?有时我需要测试一个存储过程,所以没有办法模拟它。有时,一个测试需要大量的数据(不是任意的,而是复杂的连接)在数据库中。因此,在db中准备一次数据并一直使用它要比模拟存储库容易得多。但对于单元测试,您似乎混合了单元测试和集成测试。这个问题有数百万个重复:这是最好、最实用的答案!