起步于系统工程师,迈进入测试工程师,从起初的C/S系统到互联网时代的B/S系统,从事过电信增值业务、软交换、烟草OA、公安技侦和电子商务等行业的软件测试开发和管理多年,愿与大家共同分享共同交流,关注软件项目管理、测试团队管理、软件流程控制和软件性能测试及自动化测试技术。互联网时代,技术推动进步,欢迎人才推荐:jonas.wangl@alibaba-inc.com

【整理】单元测试假成功和假失败的避免方法

上一篇 / 下一篇  2008-11-04 20:52:25 / 个人分类:单元测试

        1 基本信息

!{e"]SC0        摘要:描述了单元测试要避免的几个问题,并给出几个最佳实践建议。

,j Y*AQ8\R1tc6Mb051Testing软件测试网$Cj6Gy"n{-K6c$q7L

        2 假成功的单元测试51Testing软件测试网`^1p'J}5U6B

51Testing软件测试网*o0L(l7Uee6~[

        <1>问题描述:

],G/M:i*y^S,@.I0

(Qt0Z EK;b_4Y0        在testXXX方法中,看到有这样的测试代码:3. 解决方法:

         public void testInvoke(){
H)B*E~2a6k0        try{
s!s~s q;seU2b J#g0        …51Testing软件测试网.CqG ay
        assertEquals(a,b);51Testing软件测试网-[I\]'p V&JQS
        }51Testing软件测试网%~o/\fcrY2G
        catch(Exception e){
"h[ CN1u0        …
L(F5h9q%g/j5c1G%h0        }
;b h ^ y-@7n\aW h*yk2b0        }
51Testing软件测试网 Z%R$QI L$zmA

51Testing软件测试网3N#Ykl3Jh

        <2>问题分析:如果运行过程中没有出现异常,整个流程不会有任何问题,JUnit也认为整个测试正常通过。51Testing软件测试网!pA$c/o/[+J-s\z

L!m9a6X#_.P"wd2m0        但是一旦try中的某段代码运行出错,我们会发现由于在assertEquals被调用之前就已经跳到catch中,所以assertEquals并没有被执行,而catch及之后的代码中并没有相应的assertEquals语句,因此JUnit认为这个testXXX方法对应的测试用例正常通过,我们被结果欺骗了。

F|$h4|M H0

dx x%?`txo0        将assertEquals语句移道try…catch之外,变成如下的代码样式:

         public void testInvoke(){51Testing软件测试网;}i_6LoN1U
        Object a;
ev7]-W'E$r'K0        Object b;
'LrR^J{%~0        try{
*U|]0^"w0        …51Testing软件测试网r/N$C3Qn
        // assertEquals(a,b);
K,_7^"V zG!R0        }51Testing软件测试网H {:^ to!X,F
        catch(Exception e){
fqbh$Y0        …51Testing软件测试网pn;tbTV!N'a6SO
        }
rC2zP4H"pK:M:J0        assertEquals(a,b);51Testing软件测试网.?k:ZK7w
        }
51Testing软件测试网Kh3f*V Lcl

51Testing软件测试网8{ g"Ha f7qO;j

        3  假失败的单元测试

w4G F A_J{ ~0

W{2?z{9e ly0        有的时候被测试方法在申明的时候有throws语句,那么单元测试代码应该小心处理这个问题.

'K`6M$x Sk+|@7j051Testing软件测试网 iVH&s#S*K

        如果测试方法直接throws被测试方法所扔出的异常,则在被测试方法扔出这个异常的时候,该单元测试被认为是失败;但是作为被测试方法来讲,扔出该异常可能是正常的处理逻辑,而不能被认定是代码有错误. 称这种情况为"假失败"的单元测试.

,H.?J4W|jU8{0

Sp2x io/oO0        4 最佳实践

c$sQ z6J/uB051Testing软件测试网P;c;ip.ccl[

        单元测试最好不要有try/catch这些内容,这些内容应该是正式代码中处理的。51Testing软件测试网%}4f D_ctGYW

51Testing软件测试网$|Sn+V\M D

        单元测试只要在故意测试异常时才应该用到try/catch,如需要在某个环境下是否抛出某个异常;而其它情况try/catch应该避免使用。51Testing软件测试网2v}c*?Q lx


TAG: 单元测试

 

评分:0

我来说两句

Open Toolbar