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

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

2014年04月05日 ⁄ 综合 ⁄ 共 1459字 ⁄ 字号 评论关闭

2.1 可测性问题详解(2)

 

 

   

 

    接下来我们讨论重点问题:覆盖输入。一个函数,输入会有哪些呢?输入包括两方面:外部输入,内部输入。外部输入容易理解,就是函数外部可以设定的输入,包括参数,全局变量,成员变量。

    

   

 

    关键是内部输入。因为很少有文献讨论内部输入,对很多人来说,内部输入可能是一个陌生的词,我们首先来看看内部输入是什么。一个函数,对于调用底层函数获得的数据,是如何处理的呢?跟参数一样,也是分类处理。所以,测试时也要分类检测,这与参数没什么区别。这就是内部输入。

 

   

  

 

    内部输入有几种情形?一共有六种:自然输入、不可控、失真、难于初始化、静态输入,中断输入。

自然输入
 

   

 

    自然输入就是调用底层函数的实际代码,获得自然的计算结果。底层函数必须存在,可控,并且正确。对于自然输入,测试时并不是什么也不用做。为了检测程序是否对底层函数的各种可能输出做合适的判断和处理,需要让底层函数输出合适的数据,这就要通过设置合适的参数等数据来间接控制底层函数的输出。有时候,这个工作是很困难的,这就是难以初始化,后面有专门介绍。

 

不可控

 

   

 

 

    底层函数还是调用实际代码,但是底层函数的输出不符合测试需求。在这个例子中,底层函数的功能是取得环境温度,我们要检测程序是否对各种环境温度做了合适的处理,但是真实的环境温度不可能实时大幅变化,这就是不可控。不可控在单元测试当中是相当常见的,例如底层函数返回一个随机数、也是不可控,底层函数是用来连接网络的,可能无法控制它的各种状态,这些都是不可控。

 

失真
 

   

 

 

    底层函数调用的是桩代码。桩代码当然不能实现原有代码的功能,这就是失真。这个例子跟介绍不可控是同一个函数,不同的是,底层函数调用的是桩代码,一般的桩代码是什么也不做的,底层函数的返回值总是0,并且未输出环境温度,测试做不下去。失真是打桩造成的,是打桩的必然结果。可不可以通过修改桩代码来解决失真呢?有时候是可以的,有时候不行,后面会有进一步的介绍。
刚才我们讨论了失真。

难于初始化
    

   

 

 

    在谈到自然输入时,我们讨论过,为了使底层函数产生需要的测试输出,需合设置合适的外部输入,即通过设置外部输入的方式来初始化底层函数,很多时候,这个工作是很困难的,例如,要使圆的面积等于100.00,半径应该是多少?再如,为了使一个映射表在搜索某个对象时能返回真,需要预先建立该对象并加入表中,很简单的一个输出,却需要比较麻烦的初始化。实际工作中比这些例子更难的多得是。这些就是难于初始化。

 

静态输入

 

   

 

 

    局部静态变量在C代码中,尤其是嵌入式代码中相当常用。局部静态变量与全局变量一样,通常每个用例也需要设定不同初值。但在外部却无法访问,这也是一种内部输入。

 

中断输入
 

   

 

    中断输入常见于嵌入式项目。如果在被测程序运行过程中,系统有可能产生中断,中断可能调用某些代码,并且可能造成全局变量的修改,而且这种修改又会影响程序的功能逻辑,那么,这也是一种内部输入,测试时也必须考虑。

 

    前面介绍了内部输入的六种情形,除了自然输入外,其他五种都是必须解决的。

 

     如果解决可测性问题呢?前面说过,试图通过改进开发流程来解决可测性是不现实的。通过对可测性问题的具体分析,我想大家也已经了解,无论怎样改进开发流程,最多只能解决一小部分问题。例如内部输入问题,多数都不是因为代码写得不够好形成的。我们只能通过改进测试技术,使用合适的工具来解决。

抱歉!评论已关闭.