一个函数要“可测”,要做到两方面:第一是能够独立运行,第二是要能够覆盖输入分类。为什么要覆盖输入分类呢?因为单元测试的目标是覆盖代码单元的功能逻辑,要做到覆盖功能逻辑,就要覆盖输入的所有分类。如果代码可测性差,又没有办法解决的话,要么没法独立运行,要么做不到覆盖输入。这两点有一个做不到,就是不可测,或者达不到预期效果。
我们先来看看独立运行。独立运行包括两点:一是与其他代码隔离,二是与依赖系统隔离。与其他代码隔离的一般方式是打桩,打桩就用简单代码代替实际的代码,例如函数A调用了函数B,函数B又调用了函数C和函数F,如果函数B用桩来代替,那么,函数A就可以完全切断与函数C和函数F的关系。与依赖系统隔离主要常见以跨平台测试,例如在PC上测试嵌入式项目。这要解决两个问题:编译差异和平台差异。因为编译环境可能不同,有些数据长度在不同平台上也可能不同,这些都是要解决的。
总的来说,独立运行是比较容易解决的,例如打桩,就是一种简单的技术,并且可以用工具自动生成桩代码。