起步于系统工程师,迈进入测试工程师,从起初的C/S系统到互联网时代的B/S系统,从事过电信增值业务、软交换、烟草OA、公安技侦和电子商务等行业的软件测试开发和管理多年,愿与大家共同分享共同交流,关注软件项目管理、测试团队管理、软件流程控制和软件性能测试及自动化测试技术。互联网时代,技术推动进步,欢迎人才推荐:jonas.wangl@alibaba-inc.com
【整理】单元测试假成功和假失败的避免方法
上一篇 /
下一篇 2008-11-04 20:52:25
/ 个人分类:单元测试
1 基本信息
!{e"]SC0 摘要:描述了单元测试要避免的几个问题,并给出几个最佳实践建议。
,jY*AQ8\R1t c6Mb051Testing软件测试网$Cj6Gy"n{-K6c$q7L 2 假成功的单元测试51Testing软件测试网`^1p'J}5U6B
51Testing软件测试网*o0L(l7Uee6~[ <1>问题描述:
],G/M:i*y^S,@.I0(Qt0ZEK;b_4Y0 在testXXX方法中,看到有这样的测试代码:3. 解决方法:
public void testInvoke(){ H)B*E~2a6k0 try{ s!s~sq;seU2b J#g0 …51Testing软件测试网.CqG
ay assertEquals(a,b);51Testing软件测试网-[I\]'pV&JQS }51Testing软件测试网%~o/\fcrY2G catch(Exception e){ "h[
CN1u0 … L(F5h9q%g/j5c1G%h0 } ;b h^y-@7n\aW
h*y k2b0 } |
51Testing软件测试网 Z%R$QI
L$zmA51Testing软件测试网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
H0dx
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'a6S O } rC2zP4H"pK:M:J0 assertEquals(a,b);51Testing软件测试网.? k:ZK7w } |
51Testing软件测试网Kh3f*VLcl51Testing软件测试网8{g"Ha
f7qO;j 3 假失败的单元测试
w4G
F
A_J{ ~0W{2?z{9ely0 有的时候被测试方法在申明的时候有throws语句,那么单元测试代码应该小心处理这个问题.
'K`6M$x Sk+|@7j051Testing软件测试网 iVH&s#S*K 如果测试方法直接throws被测试方法所扔出的异常,则在被测试方法扔出这个异常的时候,该单元测试被认为是失败;但是作为被测试方法来讲,扔出该异常可能是正常的处理逻辑,而不能被认定是代码有错误. 称这种情况为"假失败"的单元测试.
,H.? J4W|jU8{0Sp2x 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:
单元测试