以前曾经写了一篇博文谈如何推广
单元测试,最近有朋友问我如下的问题,因此便又写了本文,阅读时请综合原来的博文。
问题:
有开发人员认为进行单元测试会花费大量时间来编写
测试用例,因此他们做单元测试的意愿比较低,请问有何好的建议进行单元测试的改进?
解答:
1、首先应该明确单元的含义。单元在面向对象的程序中指的是一个类,在结构化的方法中指的是一个函数。
2、其次应该明确单元测试的方法。单元测试的常用方法包括:
(1) 静态检查,即采用静态代码检查的工具对程序进行内部逻辑的分析,以分析程序中可能的错误或坏味道。
(2) 动态测试,通过编写单元测试程序,设计单元测试用例,测试每个函数或每个类的逻辑正确性。
3如果一个类或一个函数对其他的类或环境依赖性很强,需要编写大量的桩程序或驱动程序,那恰恰说明了这个类或这个函数的设计有问题,违背了“低耦合”的基本设计原则,这也正式
敏捷方法中提倡的“测试驱动开发”的作用之一。
4、质量的投入产出也是一种平衡,需要在单元测试上投入到什么程度首先是公司的一个管理方针。如果每个单元都进行单元测试则测试代码的规模和产品代码的规模能够达到1:1,也就是说编写测试代码的
工作量还是比较大的,但是也要看到单元测试的产出。在单元测试、集成测试、
系统测试中,单元测试是投入产出比最大的测试种类,即单元测试在单位时间内发现的缺陷个数大于集成与系统测试。原则上单元测试的投入最大,找到的缺陷最多,集成测试与系统测试依次递减。
5、在实践中推广单元测试时可以采用如下的方法:
(1) 加大静态检查的力度。通过静态检查的工具快速地识别程序中的错误、警告、坏味道,公司可以规定对检查出的哪些警告、坏味道必须进行修改,注意如果修改所有的警告、坏味道可能工作量比较大。静态检查是一种投入产出比很高的单元测试方法。在JAVA下可以采用check Style, Source monitor,PMD,Find Bugs,Jslink等。
(2) 通过测试策略的选择减少测试程序的工作量。单元测试一般有三种策略:
策略一:自底向上的策略:先测底层的函数或类,再测上层的函数或类,此时只需要编写驱动程序,不需要编写桩程序。
策略二:自顶向下的策略:先测上层的函数或类,再测试底层的函数类,此时只需要编写桩程序,不需要或很少需要编写驱动程序。
策略三:混合策略:综合上述的2种策略,需要综合编写桩程序与驱动程序。
如果被测的单元需要调用很多其他的单元,则可以采用自底向上的策略减少驱动程序的编写量。如果被测的单元需要很多外围的环境准备则可以采用自顶向下的策略。
(3) 在组织级可以规定执行单元测试的时机,比如:
i)系统中最核心的、最关键的功能模块;
ii)算法复杂的功能模块;
iii)出错最多的功能模块;
iv)客户最常使用的功能模块;
v)复用的底层代码
根据Pareto定律,我们可以选择少部分代码执行单元测试。
6、单元测试的技术
(1) XUnit的工具
(2) 生成测试用例时可以采用如下的方法:
i)单元功能分析
ii)入口参数等价类分析
iii)入口参数边界分析
iv)全程变量、共享数据的等价类与边界分析
v)调用函数返回值的等价类与边界分析
vi)覆盖率分析
上述的方法要求的严格程度可以循序渐进,不能的严格程度需要投入的工作量不同。