【问题标题】:How to unit test database depended behavior C#如何对数据库依赖的行为进行单元测试 C#
【发布时间】:2010-11-18 07:10:03
【问题描述】:


我有一个与 DB 通信的 C# 应用程序。我想测试一些依赖于 DB 的函数。所以我想确保 DB 在每次测试运行之前都有一个初始状态。我使用 NUnit 来测试我的应用程序。有什么方法可以恢复数据库的初始状态?
感谢您的帮助!

【问题讨论】:

  • 单元测试通常意味着单独测试你的代码......模拟数据库怎么样?
  • 有时我需要测试一个存储过程,所以没有办法模拟它。有时测试需要数据库中的大量数据(不是任意的,而是复杂连接的)。因此,与模拟存储库相比,在 db 中准备一次数据并一直使用它要容易得多。
  • NUnit 用于单元测试,您似乎混合了单元测试和集成测试。
  • 这个问题的数百万次重复:stackoverflow.com/search?q=unit%20test%20database

标签: c# database unit-testing


【解决方案1】:

您不会对与数据库的交互进行单元测试。这种类型的测试称为集成测试。您可以为此使用常用的测试工具(NUnit、MSTest 等),但最好是在单独的项目中分离集成测试,使用专用的测试数据库,并在事务中运行这些测试(例如,使用 TransactionScope ) 你回滚。这可以确保数据不会改变,并且您的测试行为是可预测的,这一点非常重要。

如果可以,请尝试以易于伪造所有外部资源(例如数据库)的方式设计您的应用程序,以允许您运行(通常更快)单元测试。然而这并不容易。特别是在处理尚未为可测试性设计的现有应用程序时。在那种情况下,我发现集成测试是一个很好的开始方式。

【讨论】:

  • 这是最好最实用的答案!
【解决方案2】:

您可以在内存中使用 SQLite 数据库来创建测试数据库环境。

SQLite Nunit & Fluent Nhibernate - Test your data access layer

【讨论】:

    【解决方案3】:

    正如其他人所说,您不能依赖数据库及其在单元测试中的结构。 因此,我将创建一个接口,将数据库从使用它的组件(也称为数据库抽象层)中隐藏起来,然后为了单元测试而实现一个内存数据库。

    可以使用每个 DB 表的简单 C# HashTable 来实现此内存中 DB 的表。

    这种分离还具有在代码中创建数据库之间的分离的好处,该数据库可能会从使用它的组件发生变化(例如从 MySQL 移动到 Oracle 等)。

    【讨论】:

      【解决方案4】:

      您应该使用样机程序(插件),例如:

      Rhino mocksmoq

      这些程序可以在测试期间模拟数据库等数据源。

      【讨论】:

        【解决方案5】:

        考虑为您的集成测试切换到 MbUnit。它具有非常方便的 Rollback 属性,完全可以满足您的需求。

        MbUnit 具有与 NUnit 相同的用于标记测试类和方法的属性。因此,您只需要更改 using 指令并引用 MbUnit dll。

        【讨论】:

          猜你喜欢
          • 2010-10-03
          • 2014-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-05
          • 2014-04-01
          相关资源
          最近更新 更多