现在的位置: 首页 > 综合 > 正文

C/C++单元测试理论精要(五)

2013年10月24日 ⁄ 综合 ⁄ 共 1147字 ⁄ 字号 评论关闭

第二章 征服可测性难题

 

2.1 可测性问题详解(1)

 

    单元测试效益特别高,方法也很简单,但却尝试的企业很多,成功实施的企业很少,为什么呢?主要原因就是难于突破可测性问题。“可测”这个词,意思已经很明白了,如果不“可测”的话,那就是不能测,没法测,就是做不下去,或者困难太多,成本太重,热情被逐渐消磨,最后做不下去。所以可测性问题是单元测试的关键,是我们首先要解决的。

 

     
    

    可测性问题是指代码的可测性很差,导致测试很困难,这是单元测试的关键阻碍。为什么代码的可测性会很差呢?原因是什么?一般来说,这些原因导致了代码的可测性差:项目很复杂,开发流程不规范,耦合度很高。耦合是指代码之间的互相依赖,例如一个函数调用另一个函数,就是耦合。

 

    一般的建议是改进开发流程,提高代码可测性。但从实践来看,这是不现实的。可测性差在企业项目中普遍存在,有其客观原因,很难改变。首先,企业项目本身就多是很复杂的,这是需求决定的,改不了。其次,程序并不是虚无的,程序是客观事物的反映,客观事物本身是互相关联,互相纠缠的,必然形成代码间的耦合。第三,流程改进是一个长期的、渐进、困难的过程,不可能短期内实现飞跃,更不是引进几个工具或者规范就可以做到的。这方面我有过教训,几年前,我也认为可以通过流程改进来提高可测性,也给客户推荐过相关的解决方案,结果都差不多:劳民伤财。所以,可以说,可测性差有其必然性,这是客观现实。

 

    那么,如何解决可测性问题呢?只有从测试技术的角度来考虑,才有可能找到真正有效的途径。要解决问题,我们首先要对问题有充分的了解,现在来看看可测性问题具体包含什么。

 

   

 

    一个函数要“可测”,要做到两方面:第一是能够独立运行,第二是要能够覆盖输入分类。为什么要覆盖输入分类呢?因为单元测试的目标是覆盖代码单元的功能逻辑,要做到覆盖功能逻辑,就要覆盖输入的所有分类。如果代码可测性差,又没有办法解决的话,要么没法独立运行,要么做不到覆盖输入。这两点有一个做不到,就是不可测,或者达不到预期效果。

 

   

 

    我们先来看看独立运行。独立运行包括两点:一是与其他代码隔离,二是与依赖系统隔离。与其他代码隔离的一般方式是打桩,打桩就用简单代码代替实际的代码,例如函数A调用了函数B,函数B又调用了函数C和函数F,如果函数B用桩来代替,那么,函数A就可以完全切断与函数C和函数F的关系。与依赖系统隔离主要常见以跨平台测试,例如在PC上测试嵌入式项目。这要解决两个问题:编译差异和平台差异。因为编译环境可能不同,有些数据长度在不同平台上也可能不同,这些都是要解决的。

 

    总的来说,独立运行是比较容易解决的,例如打桩,就是一种简单的技术,并且可以用工具自动生成桩代码。

 

抱歉!评论已关闭.