.Net 中数据提供程序的单元测试

本文关键字:程序 单元测试 数据 Net | 更新日期: 2023-09-27 18:37:03

我遇到了有关数据提供者单元测试的问题。实现它的最佳方法是什么。一种解决方案是将某些内容插入数据库并读取它以确保它符合预期。然后再次将其删除。但这需要更多的编码。另一种解决方案是拥有一个额外的数据库,我可以对其进行测试。这也需要大量的工作来实现它。实施它的正确方法是什么?

.Net 中数据提供程序的单元测试

正如其他人所指出的,你所描述的称为集成测试。集成测试是你绝对应该做的事情,但了解差异是件好事。

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

前段时间我写了一篇关于此的博客文章,解释了差异并向您展示了在单元测试时删除外部依赖项的方法:单元测试,地狱还是天堂?

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

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

我之前已经为交易范围选择了几次,效果很好。在编写这样的集成测试时,非常重要的一件事是确保您的测试不相互依赖。它们需要按照测试运行程序决定的任何顺序运行。

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

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

通常,

当您从代码调用数据库时,您会编写集成测试。如果你想写 unittest,你应该看看模拟框架。