过去的事情是岁月留下的财富

选择了一条路 就是选择了我们的一种追求 一种理想 身未动 心已远
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

浅谈单元测试

Posted on 2006-07-26 09:59  龙易  阅读(6720)  评论(8编辑  收藏  举报
 

         没做过单元测试的人会问什么是单元测试,做过单元测试的人会问为什么要做单元测试。首先可以肯定的说单元测试是必须要做的,并且每个开发代码的人都做过“单元测试”。为什么单元测试必须要做可去查阅理论家们的阐述。我的理由很简单是你见过那个生产车间不对自己的零配件进行检测就直接组装?!(软件行业和机械制造业非常地相近,并且逐渐的向这个行业靠拢)。
        实际上作为每个程序员在代码完后都会对其进行测试,无论是主动原因还是被动使然,大家可以想象你是不是这样做过:做完代码后把它加入成个程序中,运行程序,输入数据观察结果,与预期的结果进行比对,实际上即使我们做个hello world!这样的程序我们都会运行一下看看是否出现了这个结果。
        既然所有人都在做这样的测试,那我们为什么还需要强调单元测试?主要的原因是我们没办法保证所有的人都按照正确方法来进行了单元测试,并且使得单元测试更直接的和文档相结合,使得这个过程变得可控制和可管理(这正是很多单元测试的工具来帮助我们的地方)。所以对于单元测试的主要的问题,不是我们该不该做,而是应该怎么做的问题,也就是个方法学问题。同时在项目管理中还有由谁来做,怎么对资源进行协调等问题,这个可根据项目情况具体制定。

         下面我们就具体来探讨一下单元测试的方法,单元测试必须具有快速性、简单性、正确性,否则由于需要的数量众多,会极大的增加成个开发的工作量,如果不能正确的使用会使其变为那只蛇足。

         对于单元测试掌握的总体原则就是:我们的来源(数据或消息)永远都是对的,并且格式等特征都像我们预期的那样。也就是我们的来源不是我们测试范围,即使它和我们的预期不一样,我们不进行异常处理也不是我们的错。因为如果都严格的按照单元测试的要求进行,我们的来源一定是和我们的预期是一样的包括他的格式,而我们只测我们想测试的和我们可预见到的。

具体方法如下:

1、 一切分支都要走到,包括例外分支。

a.       If 语句分支

如果程序中有如下代码:

If A {

}

If B {

}

If C {

}

                      …

                       我们的测试case设计应为 testA,testB,testC,testD,前三个用于测试正常分支testD测试例外分支。    

b.       循环语句分支

                       如果程序中有如下代码:

                       For(int i=0,i<K,i++){

                       …

                       }

                       我们的测试case设计应为testA满足条件k>0,testB满足条件k<0或k=0.其他循环与此同。

2、 结果输出必须要严格定义

如果我们当前测试的函数具有返回值,那么必须要对返回结果进行严格定义。

例如 return strBnkName; 其中strBnkName为String型,则必须定义好在无数据时strBnkName为空字符串还是null。其它数据类型或者自定义数据类型亦应如此。

3、 要检测的数据必须可以断言

在很多时候我们程序进行数据处理和加工,我们要测试程序是否按照我们预期的那样进行,由于数据处理和加工的结果是个局部变量,这样我们只有进行debug才能知道它的结果。如果在进行单元测试时大面积的出现这种情况,我们应该反过来考察一下我们程序设计的合理性,这些不可“测试”的内容将是我们未来程序的bug的温床甚至是黑洞。

例如:

String strTemp1=objData.getBnkType().substring(1,4);

String strTemp2= objData.getBnkAcc ().substring(1,4);

SaveAc(strTemp1, strTemp2);

对于像这样的程序最好将转化为:

String strTemp1=objData.getBnkType().substring(1,4);

String strTemp2= objData.getBnkAcc ().substring(1,4);

This. BnkType(strTemp1);

This.setBnkAcc (strTemp2);

SaveAc(strTemp1, strTemp2);

使得测试程序可以为其断言。


---------------------------------------------------------------------
以上为一家之言供大家探讨。(原创,转载需同意)