测试作为投资
- 除非是为了使失败的单元测试通过,否则你被禁止编写任何生产代码。
现在,大多数程序员第一次听到这种技术时会想“这太蠢了!”“这会减慢我的速度,这是浪费精力,这会阻止我思考,这会阻止我设计,这只会破坏我的流程。”
- 鲍勃叔叔,TDD 的三大定律
我记得我第一次严格遵循这条规则 - 测试很好,代码很干净,我最终把它们都扔掉了。 我在现实生活中测试了代码,最终证明代码是多余的。
问题在于它完全解决了错误的问题 - 客户不想要我刚刚 TDD 的代码。
TDD 是一种非常强大的方法,我总是默认使用它,但是有些情况下它没有奏效,因为测试的成本太高,而最终收益很小。
构建模拟的成本
事实上,只要我们的测试保持简短、结构良好且命名清晰,它们就应该读起来很流畅。 它们应该读起来像规范一样;因为它们就是规范。
- 鲍勃叔叔,测试先行
与鲍勃一样,我相信你应该编写规范,而不是测试。 与鲍勃不同,我不认为图灵完备代码是编写规范的合适语言。 单元测试是错误的。
如果你不把所有东西都进行单元测试,而是认同测试应该密切模仿代码的外部世界这一观点,那么你必须开始考虑如何构建外部世界的近似值。
这并不总是容易。 这并不总是便宜。 这并不总是明智的。 如果有一个易于使用的预先存在的项目可以模仿代码的外部世界,它可能很便宜,但不能保证,如果该项目没有正确地模仿现实,那么你可能也会运气不好,你必须自己改进该项目。
误报的成本
测试不仅在存在错误的情况下才会失败。 测试也可能在代码发生变化但没有引入错误的情况下失败。 事实上,这在紧密耦合的测试中是一个非常常见的现象。
当测试在存在非错误的情况下失败时,它们会以以下形式产生成本
编写测试的回报
自动化测试可以带来四种回报
- 捕获错误
- 对代码充满信心
- 记录代码
- 提供重构的自由