.Net中Dataprovider的单元测试

时间:2013-10-28 11:38:46

标签: c# unit-testing

我已经遇到过关于dataprovider的单元测试的问题。实现这一目标的最佳方式是什么? 一种解决方案是将某些内容插入数据库并读取它以确保它符合预期。然后再次删除它。但这需要更多编码。 另一个解决方案是有一个额外的数据库,我可以测试。这也需要很多工作来实现它。 实现它的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

正如其他人所指出的,您所描述的内容称为集成测试。集成测试是你应该做的事情,但理解差异是很好的。

  • 单元测试测试单个代码段而没有任何依赖性。依赖关系是数据库,文件系统或Web服务之类的东西,但也是其他内部类,它们很复杂并且需要自己的单元测试。单元测试运行得非常快。特别是在执行测试驱动开发(TDD)时,您希望单元测试按毫秒级执行。
  • 集成测试用于测试不同组件如何协同工作。如果您已通过单元测试确保业务逻辑正确,则集成测试只需确保不同元素之间的所有连接都已到位。集成测试可能需要很长时间,但是它们比单元测试更少。

我前段时间写了一篇博文,解释了这些差异,并向您展示了在单元测试时删除外部依赖关系的方法:Unit Testing, hell or heaven?

现在问你的问题。在针对数据库运行集成测试时,您有几个选择:

  • 使用delta测试。这意味着在测试开始时,您将记录数据库的当前状态。例如,您在people表中存储现在3个人。然后在测试中添加一个人并验证现在有4个人。在数据库中。这可以在简单的场景中非常有效地使用。但是,当您的项目变得越来越复杂时,这可能不是最佳选择。
  • 围绕您的单元测试使用交易。这是一种简单的方法,可确保您的测试不会留下任何数据。只需在测试开始时启动一个新事务(使用.NET Framework中的TransactionScope类)。只要您没有完成交易,所有更改都将自动回滚。
  • 为每个测试使用新数据库。在Visual Studio 2012及更高版本中使用localdb支持,这可以相对快速地完成。

之前我已经选择了几次交易范围而且效果很好。在编写这样的集成测试时,有一点非常重要,那就是确保测试不依赖于彼此。他们需要以测试运行员决定的任何顺序运行。

你还应该确保避免任何“魔术数字”。例如,您可能知道您的数据库包含3个人,因此在测试中添加一个人然后断言数据库中有四个人。对于您的测试读者(将在几天,几周或几个月内完成),这很难理解。确保您的测试是自我解释的,并且您不依赖于测试中不明显的外部状态。

答案 1 :(得分:1)

您无法对外部依赖项(如数据库连接)进行单元测试。有一个很好的帖子here关于为什么会这样。简而言之:应该测试外部依赖性,但这是集成测试,而不是单元测试。

答案 2 :(得分:0)

通常,在从代码调用数据库时,您会编写集成测试。如果你想编写单元测试,你应该看一下模拟框架。