单元测试
- 确保程序的部分满足程序设计,并且行为、表现符合预期
- 单测的目的是通过对程序的每一个独立的部分进行验证,从而确保程序的正确性。
- 这样就要求我们对程序进行合理的代码设计,尽量可以去独立的验证
- 类似linux的哲学,每一个功能就做一件事情,并且做好
- bottom-up测试方式:先对基础单元进行保证,然后是各个单元的组合,之后是集成测试(integration testing)将变的更有保障
基础越扎实,稳定,上层建筑越可靠。
如何划分单元
- 在
procedural programming
(面向过程编程)领域中,一个单元可以是整个模块(比如单个文件,或者是功能类似的一组文件),但是通常是那些独立的函数或者是过程 - 在
obeject-oriented-programming
(面向对象编程)领域中,通常是整个接口,比如一个class,或者是一个方法
如何进行单元测试
- 首先对那些最小可以测试的单元进行测试,然后对这些最小单元的组合进行测试。
- 设计test case:指定的输入、条件,特定的预期的结果
- 重点是控制测试变量,隔离外部依赖的影响
- 为了隔离其他依赖的问题(依赖的稳定可靠性由他们自身保证),通常我们会对依赖的对象进行mock(比如方法,对象等)
单元测试的缺点和难点
- 单元测试无法覆盖所有的错误,还是结合
integration test
、E2E test
- 覆盖完整的测试用例需要花费一定的人力、时间成本:以bool为例,至少需要两个单测覆盖;对于编写的每一行代码通常需要3-5行的测试用例代码,而且有时候也无法收到对应付出的努力的收获
- 另一个难点是如何编写优秀的单元测试
- 持续维护单元测试,让它真正发挥作用也是非常有挑战
- 当方法具有输入参数和一些输出时,单元测试往往是最简单的。当方法的主要功能是与应用程序外部的东西交互时,创建单元测试并不容易