
1.2 单元测试的好处
单元测试为软件开发提供了诸多好处,比如可尽早发现软件的缺陷、促进源代码和结构的完善、简化软件集成测试的流程(也可以理解为早期集成)、减少软件漏洞、提高交付质量、提升开发效率等,下面就来详细探讨单元测试的好处。
(1)使编码过程更加敏捷
单元测试最大的好处之一是可以使编码过程更加敏捷。当软件中要加入越来越多的特性和功能时,往往需要更改旧的设计结构和代码。众所周知,更改已经测试过的代码充满风险,且成本高昂,因为新增的代码很有可能会导致已有的功能不可用。有了单元测试的加持,就可以放心地进行代码重构了。单元测试需要与各种风格的敏捷编程紧密结合在一起,因为只有确保单元测试顺利执行,才能提交代码,这一机制使得我们可以更加从容地修改源代码(详见图1-1)。一言以蔽之:单元测试可以确保安全重构,进而促进代码的敏捷开发。
(2)提升代码质量
单元测试对于代码质量的提升非常关键,由于它在软件集成测试之前进行,因此可以尽早发现代码中可能存在的缺陷。如果软件开发是以TDD(测试驱动开发)方法论作为指导,那么开发人员将在编写源代码之前就写好单元测试的代码,从而可以更进一步地促使开发人员细致认真地考虑每一个逻辑分支的细节,以增强源代码的稳健性。
(3)尽早发现缺陷
单元测试可以尽早发现源代码中的很多问题,并且使之能够得到及时、快速的修复,从而避免后期高成本(时间成本、人力成本等)的返工和回退等问题。
(4)简化集成测试
开发人员为了添加新功能、新特性,对源代码进行修改之后,可以快速地对整个项目工程进行单元测试,然后决定是否提交更改后的代码,这种方式很容易发现更改的代码是否会影响其他功能模块的正常运行,这将使得后续的系统集成测试变得更加容易(有人将整个项目中所有单元测试的执行过程称为简易版集成测试)。
(5)提供文档帮助
大家可能会有这样的经历,当我们在开源库中查找某些第三方类库的帮助文档时,有的文档比较简略,甚至根本就没有系统性的文档,从而导致我们很难了解这些第三方类库是如何使用的,但是将单元测试代码(开源项目通常都会包含单元测试代码)作为入口,很容易就能掌握它们的使用方法,甚至是一些高阶技巧,因为通常情况下,专业的开发人员会保证单元测试方法足够小巧清晰且容易阅读。
(6)易于调试(debug)
由于单元测试的粒度非常小,因此如果在执行单元测试的过程中出现了错误,那么将单元测试方法作为入口进行调试就会非常方便,根本无须进入项目的main函数来启动运行后再调试,直至追踪到问题源代码。
(7)促进开发者优化代码的设计和结构
理论上,所有的源代码都应该是可进行单元测试的,否则开发人员就需要思考自己的代码结构是否存在问题(比如,是否由于存在较强的耦合,导致单一方法职责过重,承载了大多数业务逻辑),进而促使开发人员主动优化代码的结构和设计。从这个意义上来看,单元测试能够促进开发人员开发出结构清晰、层次分明、容易维护和阅读的软件源代码(在敏捷方法实践中有一派观点认为:源代码不应该有任何文档注释,因为优秀的代码本身就是优秀的文档,由此可见,代码并不是越复杂越好,简洁明了、层次分明的代码才是上乘之作)。
(8)降低软件开发成本
对于这一点,其实我们已经提到过很多次了。由于单元测试能够尽早发现代码中的问题,因此其能有效降低漏洞修复的成本。如果到了项目开发的后期(如系统测试或验收测试期间)才发现错误,然后对问题进行排查、定位和修复,那么修复后,其他本可以正常运行的功能很有可能也会受到影响,乃至某些地方可能还需要进行大规模重构等,这些都需要付出很大的代价。