
上QQ阅读APP看书,第一时间看更新
1.1 单元测试的定义
单元测试并没有一个特别官方的定义,维基百科对其的定义[1]是:“单元测试的工作通常由开发人员完成,主要是针对软件源代码进行较小粒度的测试,这种类型的测试通常称为白盒测试,因此单元测试的前提是测试者(开发者)需要足够了解源代码本身,在理想情况下,单元测试需要覆盖所有的源代码,以确保所有源代码都能够正确执行。”
姑且将此认为是对单元测试比较官方和权威的定义也无妨,我们可以从中摘录出如下几点比较重要的关键信息。
- 单元测试的工作需要由开发人员完成:假如A是开发人员,那么单元测试是由A自己编写,还是由同样是开发人员的B去完成呢?通常情况下,开发人员需要自己完成单元测试代码,甚至在TDD模型下,单元测试代码的编写要早于软件的源代码开发,因此如果是A开发了源代码,那么A同时也要编写针对源代码的单元测试代码,但是现实情况往往没有这么简单。比如,A离开了原有的项目团队,并且遗留了未完成的单元测试,那么B就要负责编写原本应该由A编写的单元测试,这也是实际工作中经常遇到的场景。再比如,当软件交由测试人员进行测试,或者已经部署到了生产环境但出现了问题时,开发人员首先要重现这些问题(进行单元测试),然后尝试修复,修复问题的开发人员有时并不是原来编写源代码的开发人员。
- 单元测试是白盒测试:从广义上来说,可以笼统地将测试分为白盒测试和黑盒测试,白盒测试需要测试人员足够熟悉源代码的逻辑、结构,以及其中的算法,因此开发人员是最适合写单元测试代码的人。
- 单元测试代码需要针对源代码进行最细粒度的测试:单元测试应尽可能全面地覆盖源代码中的每一个分支,如if/else/ifelse、循环、异常、switch/case/default等。
在了解了单元测试是什么,以及详细探讨了几点关键信息之后,下面看看通常情况下单元测试在开发生命周期中所处的具体位置,如图1-1所示。

图1-1 单元测试生命周期
由图1-1可知,每次对源代码进行修改之后、将其提交至代码仓库之前,都要执行所有的单元测试,以确保程序能够正确运行。