首页 > 解决方案 > 单元测试如何测试任何东西?

问题描述

我不明白我是如何用单元测试来测试任何东西的。

假设我正在测试我的存储库类是否可以正确地从数据库中检索值。执行此操作的正确方法是实际调用真实数据库并检索和检查这些值。

但是单元测试背后的想法是它应该隔离完成,连接到正在运行的数据库并不是隔离。所以通常做的是模拟存根数据库。

但是,为什么要在带有硬编码数据和硬编码返回值的假数据库上进行测试甚至测试任何东西呢?这似乎是同义反复并且浪费时间。

还是我不了解如何正确进行单元测试?

甚至对数据库调用进行单元测试吗?

标签: unit-testingtestingtdd

解决方案


我不明白我是如何用单元测试来测试任何东西的。

简短的回答:您正在测试逻辑,并忽略副作用

你没有测试一切;但你正在测试一些东西。

此外,如果您记住您并没有真正测试具有副作用的代码,那么您就会有动力安排代码,以便实际依赖于副作用的部分很小。大块实际上并不关心数据来自哪里,因为它们很容易测试。

所以“某事”可以是“大多数事情”。

存在阻抗问题 -如果您的测试替身未能充分模拟生产原件,那么您的某些测试结果将不准确。

我的理念是尽可能少地测试以达到给定的信心水平

肯特贝克,2008

想象“尽可能少”的一种方法是考虑成本——我们的目标是给定的置信水平,所以我们希望使用廉价的单元测试尽可能多地实现这种置信度,然后使用更昂贵的技术来提高差异。

Cory Benfield 的演讲Building Protocol Libraries the Right Way描述了我们在这里讨论的那种分离的例子。如何解析 HTTP 消息的逻辑与读取字节的问题是分开的。如果你让复杂的部分容易测试,而难以测试的部分太简单而不能失败,你成功的机会就很大。


推荐阅读