下面我们就具体来探讨一下单元测试的方法,单元测试必须具有快速性、简单性、正确性,否则由于需要的数量众多,会极大的增加成个开发的工作量,如果不能正确的使用会使其变为那只蛇足。
对于单元测试掌握的总体原则就是:我们的来源(数据或消息)永远都是对的,并且格式等特征都像我们预期的那样。也就是我们的来源不是我们测试范围,即使它和我们的预期不一样,我们不进行异常处理也不是我们的错。因为如果都严格的按照单元测试的要求进行,我们的来源一定是和我们的预期是一样的包括他的格式,而我们只测我们想测试的和我们可预见到的。
具体方法如下:
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);
使得测试程序可以为其断言。
联系客服