我遇到了有关数据提供者的单元测试的问题。实现它的最佳方法是什么。一种解决方案是将某些内容插入数据库并读取它以确保它符合预期。然后再次删除它。但这需要更多的编码。另一个解决方案是拥有一个额外的数据库,我可以对其进行测试。这也需要大量的工作来实现它。实施它的正确方法是什么?
问问题
491 次
3 回答
2
正如其他人所指出的,您所描述的称为集成测试。集成测试是您绝对应该做的事情,但最好了解其中的差异。
- 单元测试测试没有任何依赖关系的单个代码。依赖关系是诸如数据库、文件系统或 Web 服务之类的东西,但也包括其他复杂且需要自己的单元测试的内部类。单元测试运行得非常快。尤其是在执行测试驱动开发 (TDD) 时,您希望单元测试以毫秒为单位执行。
- 集成测试用于测试不同组件如何协同工作。如果您通过单元测试确保您的业务逻辑是正确的,那么您的集成测试只需确保不同元素之间的所有连接都到位。集成测试可能需要很长时间,但你的测试比单元测试少。
前段时间我写了一篇关于此的博客文章,解释了这些差异,并向您展示了在单元测试时删除外部依赖项的方法:单元测试,地狱还是天堂?.
现在关于你的问题。在对数据库运行集成测试时,您有几个选项:
- 使用增量测试。这意味着在测试开始时,您会记录数据库的当前状态。例如,您在 people 表中存储现在 3 个人。然后在您的测试中添加一个人并验证现在有 4 个人。在数据库中。这可以在简单的场景中非常有效地使用。但是,当您的项目变得更加复杂时,这可能不是要走的路。
- 围绕单元测试使用事务。这是确保您的测试不会留下任何数据的简单方法。只需在测试开始时启动一个新事务(使用 .NET Framework 中的 TransactionScope 类)。只要您不完成事务,所有更改都会自动回滚。
- 为每个测试使用一个新数据库。使用
localdb
Visual Studio 2012 及更高版本中的支持,这可以相对快速地完成。
我之前曾多次选择事务范围,并且效果很好。在编写这样的集成测试时非常重要的一件事是确保您的测试不相互依赖。他们需要按照测试运行者决定的任何顺序运行。
您还应该确保避免任何“幻数”。例如,也许您知道您的数据库包含 3 个人,因此在您的测试中添加一个人,然后断言数据库中有四个人。对于您的测试的读者(几天、几周或几个月后将是您)来说,这很难理解。确保您的测试是自我解释的,并且您不依赖于测试中不明显的外部状态。
于 2013-10-28T11:57:13.500 回答
1
您不能对数据库连接等外部依赖项进行单元测试。这里有一篇关于为什么会这样的好帖子。简而言之:应该测试外部依赖项,但那是集成测试,而不是单元测试。
于 2013-10-28T11:44:01.503 回答
0
通常,当您从代码调用数据库时,您会编写集成测试。如果你想编写单元测试,你应该看看模拟框架。
于 2013-10-28T11:44:21.083 回答