单元测试是针对代码中的最小模块进行单独测试的方法;一般对于面向过程语言来说,最小模块就是过程函数;而对于面向对象语言,一般是类的各种方法。

单元测试使得我们可以放心修改、重构业务代码,而不用担心修改某处代码后带来的副作用。

单元测试可以帮助我们反思模块划分的合理性,如果一个单元测试写得逻辑非常复杂、或者说一个函数复杂到无法写单测,那就说明模块的抽象有问题。

单元测试使得系统具备更好的可维护性、具备更好的可读性;对于团队的新人来说,阅读系统代码可以从单元测试入手,一点点开始后熟悉系统的逻辑。

TDD

测试驱动开发,是指针对一个项目,在设计好接口的情况下,先针对功能模块编写测试程序,在编写实际代码。这种开发方式能够极大程度的减少代码中单个功能模块的错误发生率。

单元测试框架

编写单元测试代码的过程中会有很多冗余的工作,例如格式化输出,初始化环境等等;而单元测试框架就是用来解决这些问题的。一般单元测试框架会提供例如格式化输出、结果验证宏等功能,有些框架也会提供模拟对象、代码生成器等高级功能。

测试用例(Test Case)

测试代码中针对某一模块进行测试的部分,一般针对某一模块的测试用例放在一起。

夹具(Fixture)

单元测试框架中的夹具实际上就是减少编写单元测试过程中的冗余代码,让编写单元测试的过程尽量集中在测试用例上。

有些单元测试框架也会提供夹具组,其实就是把多个包含测试用例的夹具放到一起,进一步减少冗余的代码。

代码生成器(Generator)

前面提到的TDD开发模式中,是先编写测试代码再去编写模块代码的,对于某些语言例如C,编译测试代码的时候需要模块代码参与编译,这种时候就需要代码生成器来去生成空的模块参与编译。

Mock

在一些面向对象语言中,当某个模块的方法依赖于另一个模块的时候,为了保证单元测试的隔离,不能直接使用另一个模块作为参数,此时就需要对这个模块进行mock,实际上就是构造一个虚拟的模块作为参数去测试其他模块功能;对于面向过程语言来说,需要被mock的模块可能是函数或者结构体对象。