1.2.7 100%代码覆盖率的谬误

代码覆盖率是度量自动化测试运行代码库中代码行数的一个指标。通常,代码覆盖率以百分比来度量:100%代码覆盖率意味着在执行测试期间每行代码都会被运行,0%代码覆盖率意味着未执行任何代码行。这是一个有趣的度量标准,但它可能会导致一些可怕的后果。

测试会削弱回报。就像去健身房健身,当你第一次去健身房,你会迅速锻炼出肌肉。在几个月的时间里,每周只要健身三小时,就可以让你的身材看起来更健美。但是你获得的成效越大,随之所需要消耗的时间就越多。即在健身房锻炼的时间越长,每增加一小时所获得的成效就越少。

同样的原则也适用于测试。你可以在几个小时内完成可以覆盖应用程序核心功能的简单测试。在编写完这些测试之后,增加代码覆盖率就变得越来越困难了。如果你的目标是100%的代码覆盖率,那将会像拧干毛巾中的最后一滴水一样辛苦。

大多数情况下,将100%代码覆盖率作为目标并没有意义。当然,如果你正在开发一个极其重要的支付应用程序,存在的bug可能会导致数百万美元的损失,那么100%代码覆盖率对你是有用的,但根据我的经验,大多数应用程序并不会从100%代码覆盖率中受益。

在过去的几年里,我工作过的项目有0%代码覆盖率的,有100%代码覆盖率的,也有覆盖率介于两者之间的。0%代码覆盖率会使开发变得很艰难,但是,100%的代码覆盖率会使开发变得很慢,那种感觉比小毛虫爬沙丘还要痛苦。

实现传说中的100%代码覆盖率不仅耗时,而且即使代码覆盖率达到100%,测试也并非总能发现bug。有时你可能还会做出错误的假设,当你测试调用一个API代码时,假定的是该API永远不会返回错误,然而当API确实在生产环境中返回错误时,你的应用程序就崩溃了。

你不会因执着于为每一个应用程序实现100%代码覆盖率而成为测试大师。就像一个好的拳击手知道何时远离格斗一样,真正的测试大师知道如何选择何时编写测试,何时不编写测试。

在第2章中,我们将开始为Hacker News应用程序编写第一个单元测试。在此之前,我会对Hacker News应用程序做一个简单概述。