跳至内容

测试作为投资

  1. 除非是为了使失败的单元测试通过,否则你被禁止编写任何生产代码。

现在,大多数程序员第一次听到这种技术时会想“这太蠢了!”“这会减慢我的速度,这是浪费精力,这会阻止我思考,这会阻止我设计,这只会破坏我的流程。”

  • 鲍勃叔叔,TDD 的三大定律

我记得我第一次严格遵循这条规则 - 测试很好,代码很干净,我最终把它们都扔掉了。 我在现实生活中测试了代码,最终证明代码是多余的。

问题在于它完全解决了错误的问题 - 客户想要我刚刚 TDD 的代码。

TDD 是一种非常强大的方法,我总是默认使用它,但是有些情况下它没有奏效,因为测试的成本太高,而最终收益很小。

构建模拟的成本

事实上,只要我们的测试保持简短、结构良好且命名清晰,它们就应该读起来很流畅。 它们应该读起来像规范一样;因为它们就是规范。

  • 鲍勃叔叔,测试先行

与鲍勃一样,我相信你应该编写规范,而不是测试。 鲍勃不同,我不认为图灵完备代码是编写规范的合适语言。 单元测试是错误的

如果你不把所有东西都进行单元测试,而是认同测试应该密切模仿代码的外部世界这一观点,那么你必须开始考虑如何构建外部世界的近似值。

这并不总是容易。 这并不总是便宜。 这并不总是明智的。 如果有一个易于使用的预先存在的项目可以模仿代码的外部世界,它可能很便宜,但不能保证,如果该项目没有正确地模仿现实,那么你可能也会运气不好,你必须自己改进该项目。

误报的成本

测试不仅在存在错误的情况下才会失败。 测试也可能在代码发生变化但没有引入错误的情况下失败。 事实上,这在紧密耦合的测试中是一个非常常见的现象。

当测试在存在非错误的情况下失败时,它们会以以下形式产生成本

编写测试的回报

自动化测试可以带来四种回报

  • 捕获错误
  • 对代码充满信心
  • 记录代码
  • 提供重构的自由