少年智则国智,少年富则国富,少年强则国强,少年独立则国独立,少年自由则国自由,少年进步则国进步,少年胜于欧洲,则国胜于欧洲,少年雄于地球,则国雄于地球。红日初升,其道大光;河出伏流,一泻汪洋;潜龙腾渊,鳞爪飞扬;乳虎啸谷,百兽震惶;鹰隼试翼,风尘吸张;奇花初胎,矞矞皇皇;干将发硎,有作其芒;天戴其苍,地履其黄;纵有千古,横有八荒;前途似海,来日方长。美哉,我少年中国,与天不老!壮哉,我中国少年,与国无疆!

java单元测试篇:使用clover为junit单元测试做覆盖率分析(三)

上一篇 / 下一篇  2009-09-25 12:39:31

三、修改build.xml文件添加clover任务51Testing软件测试网O*^^ q4l*vy0G/Y6H

c8KzV%V0    现在我们开始修改build.xml文件,添加clover任务,以实现junit测试覆盖率的分析。首先,我们添加clover任务的配置任务;在build.xml文件里添加如下代码:51Testing软件测试网;Q"}D[ j$Ai

51Testing软件测试网F,k OR Kcs)Kb&vLX

51Testing软件测试网&s fF&e(W&| p

)ay5q?D$w)E-H0

N[;nD;s HIj0E0    这两行定义了能够在ant文件里使用clover任务的配置工作。然后再添加一个clover任务,用来启动clover构建任务:51Testing软件测试网T3p}0P,I)Wz

51Testing软件测试网]8PA!^M:ay

z:g n3@ u9{%d+W6P&{/k0

i.?U d&C`@1U{l0

;xaR jI0

5}Em cT$e:F1h0    这里的initString定义了clover覆盖数据库的信息,它会在执行clover任务时自动创建,里边保存了源路径执行测试任务时候的全部信息,clover通过这个demo_coverage.db来创建覆盖率分析报告。如果这个demo_coverage.db存在,clover在每次运行时自动覆盖,如果不存在,clover自动创建它。51Testing软件测试网)W{7t jCd ^ S$pC

e![Df(Nqh,B*Ow0   我们这里使用clover,是为了搜集junit测试时候的覆盖率信息,所以呢,junit测试过程中,我们需要使用clover.jar包,所以我们还需要把clover.jar文件作为junit运行的依赖库,因此修改build.classpath代码成如下所示:51Testing软件测试网,x%c:qy.p6P

A$c X:vX.r051Testing软件测试网(x t$@&ce'jY

wdDG4n051Testing软件测试网aHLJ2P/sUK

51Testing软件测试网n9Ql$OY.Engpa

51Testing软件测试网%o;l YY c.}N\

51Testing软件测试网zWA{q]"de H

5Jl9ufzeP(b;m }051Testing软件测试网`m0j4L y-Hzr{

nU'BH}s.qzl051Testing软件测试网 G2L$d m|}!m$^

    这里顺便我们也把path的值说明一下,省得有人不懂哦!这里的ant.home是在计算机里创建的环境变量ANT_HOME,它的值应该是你的ant的安装路径,例如c:ant,所以前两行代码的意思,就是把c:antlibclover.jarc:antlibjunit.jar作为依赖库。当然,事先你一定要拷贝这两个jar文件到你的lib目录。

DifNi}'pD051Testing软件测试网!M#y3v~-I9Gr@(N8g;g

好了,我们现在开始重新使用clover任务来运行junit测试!

v.Io5EfB$rL051Testing软件测试网.I` {Pi o

C:cloversincky>ant clean51Testing软件测试网 d0w(V nxm

51Testing软件测试网r-|'|c6b(M4UYyFc

Buildfile: build.xml51Testing软件测试网2tR!`|[%]9sH!| z

51Testing软件测试网+T.N!Z nx1m7R$A

clean:51Testing软件测试网 AC2lP6T0K f:a1G

-RwNs Ff0[delete] Deleting directory C:cloversinckybuild

/T%Q_,q$nx0

%j;NgA%d5V _0BUILD SUCCESSFUL51Testing软件测试网V$G-v!|B+A*P

`&{o0`N0Total time: 0 seconds51Testing软件测试网xN,fCyC QthM

"p/Esa{ai0C:cloversincky>ant clover compile51Testing软件测试网r'kBf d&[b

I p:n&X^p)o0Buildfile: build.xml51Testing软件测试网B*I+u&[ZFY G"ty

51Testing软件测试网 X_7v!SC s

clover:

N2A uaysS051Testing软件测试网,uZ/K&YT.G!H!E6Iz

[clover-setup] Clover Version 1.3.8, built on May 18 2005

Go1hQ`DR0

m)@'kk|0P;_0[clover-setup] loaded from: C:cloverlibclover.jar51Testing软件测试网,Q Sv`2J.B)y'\hix

[(Q`.` L ea7`0[clover-setup] 30 day Evaluation License registered to sinckyzhang@163.com51Testing软件测试网^%j/Cz'yFK$Q-s

51Testing软件测试网N#xs$[W

[clover-setup] You have 10 day(s) before your Evaluation License expires.51Testing软件测试网2DY nsQ+aw

51Testing软件测试网1e*\@:HL)y0X$`PX

[clover-setup] Clover is enabled with initstring 'C:cloversinckydemo_coverage.db'

)J Fx]-s+j'S0

M1iXe#\+D0compile:

DL_r6}R\#i0

2ydF4S8M.o0[mkdir] Created dir: C:cloversinckybuild51Testing软件测试网IR4j5Ygi\

51Testing软件测试网?%~FG2@g ~-R.y!E

[javac] Compiling 4 source files to C:cloversinckybuild

Qb}0sANu1D)I0

+sPT8k?^W0[clover] Clover Version 1.3.8, built on May 18 2005

c[f9|)t]0

nd u/T [.@0[clover] loaded from: C:cloverlibclover.jar

;E m5||'BT051Testing软件测试网 ?d F5R B U [;G

[clover] 30 day Evaluation License registered to sinckyzhang@163.com51Testing软件测试网)m*S'X*{6r

?9b4q$`/WzQM+t+Lwv0[clover] You have 10 day(s) before your Evaluation License expires.51Testing软件测试网we_+@5[:Y F*l*~'i

z5Uwv3[s}\G!P0[clover] No coverage database 'C:cloversinckydemo_coverage.db' fou51Testing软件测试网z]@5W8ByV~%ff5[

51Testing软件测试网*{?R$|Xw$nv

nd. Creating a fresh one.51Testing软件测试网7\ey6m!E'{

51Testing软件测试网4U`3y2Cp5Er

[clover] Clover all over. Instrumented 4 files.51Testing软件测试网3yY m:D,c |qw

51Testing软件测试网 Y(d?kM.nUJ

BUILD SUCCESSFUL

H x9n4K*[0

8O[8h`Q'^u0Total time: 2 seconds

v0i;B3Lu-L0

Bp~:O7o6d[0我们会发现在sincky目录下多了一个demo_coverage.db文件;之后我们再执行测试任务:51Testing软件测试网3Y`;`p3P p `

51Testing软件测试网T\!^n)c W$lP'|qj

C:cloversincky>ant test51Testing软件测试网0?["}1OQ S$N|eRp

LS0Z:@r-t0Buildfile: build.xml

;bE i#IGWHR051Testing软件测试网;oq&M,s'a,W5GsT

test:

qC2p'jxW051Testing软件测试网/R @l'J)XmBU7]

[java] ......................51Testing软件测试网O P-R[1]}1\A

3xeDkQ5I@0[java] Time: 051Testing软件测试网cN'S,}'Rt0@!?

to8F-vcC)j'W0[java] OK (22 tests)51Testing软件测试网 A8bsZB6`t

k/C;`oi#H%egJ0BUILD SUCCESSFUL51Testing软件测试网'|9M9v3X7Pd m7s5w;f

6~~:v,|+h){0Total time: 0 seconds

7hK k%w"a+v9F8kdV0

YwK j7}z!m^[Y0我们会看到又多了一个关于junit测试的.db文件!现在,我们已经使用clover统计完了覆盖率信息,之后创建clover报告,以直观方式来查看具体的覆盖率结果!这个任务需要在build.xml里创建任务。Clover的报告有多种方式:htmlpdfxml以及swingview的图形化报告,当然与eclipsejavaIDE集成,也会在IDE里创建报告;这里我们只演示html类型的报告!我们修改build.xml文件,添加如下任务:51Testing软件测试网vQ'f8h0@T~Nq

51Testing软件测试网~$\ sZ mYD

51Testing软件测试网z.dB.p| u6N Q

BT_&MY2E051Testing软件测试网9n5^;qpCeM!I

mU.v0t hJ051Testing软件测试网?BRP&G,gH^

51Testing软件测试网c'pb-do)G

51Testing软件测试网.JT:dP D'no2e

gH`1d"g!Q-o051Testing软件测试网%IfS&@:|6lK)J0Z

~WWz$~%nc0I;H0

LB,o^%q%Z2w0

2lor(xe y_`051Testing软件测试网m%U)mNA6{

51Testing软件测试网B'{#sjZ(?-xyr

这里的元素指产生的报告类型是当前的测试报告,还有历史报告,我们在后边讲解!这个报告是html格式,创建后的报告放在一个叫做clover_html的文件夹里,报告标题叫做Clover demo

.z[ k3Z7i(YZ0

R5`1q*a)NTM0我们现在给出完整的修改后的build.xml文件:

V rv4SF+m"}0

\2y!s(I%{O0

.~?n\5b4Gq0

IR%_9hBm{k051Testing软件测试网P`G j.p2|Eu

.?9K~]k0moneytest build file

j @t y4\ Ms051Testing软件测试网(Wk1MC y }

yy9f3V V051Testing软件测试网 u J9DN%c*\ `

51Testing软件测试网$h/H2gK]3R6GR v

%n_m5B&XCP0

%L'd n cW9i$R-Ty051Testing软件测试网A*?nmw,^@U|?

(o1zBQ,p%S)yf-S S051Testing软件测试网NGe|RcEh#Ro4P

5G/C9]9n8k0

.kP9Ej8@n051Testing软件测试网6}]0rV(_

51Testing软件测试网I0G k2XkO

#?5zAp1_ MC051Testing软件测试网%Q0OAbz(M7Z"p8]R

$r8P l3c*g`2?h0?w051Testing软件测试网;j ZQc M {/Q

51Testing软件测试网un3\ dN+V7GgA7?-b

51Testing软件测试网8S#}|D*g;xv

51Testing软件测试网#y#l}0}1m\h)p

W4GpX'w;k'T,y0

wB%mv9x8e4E0

!d,j#O,V.Km$t0

(u2`S)[4L0?qN}b051Testing软件测试网k:R8V QDC6q ].b t/H

51Testing软件测试网6}!{y t3QO3@1\

51Testing软件测试网(U(@n+ge

-\-}0p:T,wx$tD0

%hY^7o*vDq051Testing软件测试网 K'VT$CYOtx

'{+[ z\4\ jN0fork="yes">

!R-nvM&O+Z f6q0

#_H(~[)S1wzV0

!D+D p2Ih7Lz@/o051Testing软件测试网8h"Q4c"X,ha,}g

w+l1z^#i+\_&k0

,U(A p4pM(T051Testing软件测试网F(sN:E8F

51Testing软件测试网8|Bp(HGcY f ET}k q

51Testing软件测试网3?"e&qWgH

~Z6R+tl`051Testing软件测试网_p/k$R;I)_

51Testing软件测试网g%W-d2Y'E*c7iV2@5Y

q:Hmr0in0

)T`dw IvsoU0

ty)[q*F'jP051Testing软件测试网6qbC*W9^}#My-q+b H3@

WBRy5Pv,`9Q;LFT051Testing软件测试网W(M7c ~4cBmvH

1z1N#tTpX^6P"o*n0

$s)Y.Q c:z051Testing软件测试网7Uge.~)Ku]t

S7_b^Z051Testing软件测试网|+I)~Mw z

51Testing软件测试网)hV_@H8W"S7NWs

Xu/PC;J5a'Mx0

.\ cs7RI;\ _GkZz1d0

{O,Xa-r~051Testing软件测试网 r;_u"?J!h~H$X

bS2V tg9~0

Gfs["P+HK;?!@^0

+R)lmG}0

fJB#HTf$P j3|0

8nQrEB051Testing软件测试网.M7v}!?+eW4n C

51Testing软件测试网+L/op eZwR(F

51Testing软件测试网)BoP2H Fv"xw-UEz

51Testing软件测试网u[kru4U$X8S

w @@waEp0

"~]kv"t5m051Testing软件测试网%B6J;X*E&_k4mI` me

现在我们执行report这个任务:

(JJ&U A x4M9L051Testing软件测试网J5Ut/Fnl m&z

C:cloversincky>ant report

7U/{5nlG+TLt+d0

D.H)~,Kx0`8[ pK0Buildfile: build.xml51Testing软件测试网+E5d_yt\fU/f4b

51Testing软件测试网5U9{/U)z6^6O

clover:

}Q!LN8s$U0

2Lgc8i7oYqR0[clover-setup] Clover Version 1.3.8, built on May 18 200551Testing软件测试网"p _,_MK2PL

51Testing软件测试网dwwu$b9o `/q

[clover-setup] loaded from: C:cloverlibclover.jar

F+m[&rAM051Testing软件测试网1n8} HrzmB$zfsa

[clover-setup] 30 day Evaluation License registered to sinckyzhang@163.com

`3Ub0?ID0~xc'\0

:ih~t]Xk3U0[clover-setup] You have 10 day(s) before your Evaluation License expires.51Testing软件测试网c,Mwh6H9R&V9v,W

M&Kl!]RF ^5_0Tv0[clover-setup] Clover is enabled with initstring 'C:cloversinckydemo_coverage.db'51Testing软件测试网,bk/@YWuV9H

"u Ep0G&L0report:

J2y0?:W*D+u c)?0

o4iz]['R(JzHxm0[clover-report] Clover Version 1.3.8, built on May 18 200551Testing软件测试网3Xz U:g*KP[!Kt

51Testing软件测试网J6D u.OnF(L#s

[clover-report] loaded from: C:cloverlibclover.jar

#il.L C${K0

_&_!~tkF2Db|0[clover-report] 30 day Evaluation License registered to sinckyzhang@163.com51Testing软件测试网~)q'\F!E9Li%]X

5C!rnT3vVRj5D1k0[clover-report] You have 10 day(s) before your Evaluation License expires.

Yb7Nd*J e3g"Y0

(~RbFTgkIa`!|$c0[clover-report] Loaded results from 1 coverage recording.51Testing软件测试网.F)`&oc?8^t

Ib/t?;E:BY2]V L0[clover-report] Writing report to 'C:cloversinckyclover_html'51Testing软件测试网y%J0B9Q?!rni

E^w/B2{%G;` S0[clover-report] Done. Processed 1 packages.

:h/~"mW9{y@4A0

$w0yDDB&R0BUILD SUCCESSFUL

pR [3OVUX5wF051Testing软件测试网!J~?ph7mZ

Total time: 1 second

M4F}V2le0

Q1_%}X0U \ CF0现在你可以打开sincky下的clover_html文件夹下的index.html文件,如下所示:

,T"T S.Ri+zO051Testing软件测试网X#UR(B~|

3G2f*ni"Y/z0A[;|0

BR+X#l;Qc4NY Sz0

0KK pW&Moi8C/z8y [051Testing软件测试网 SZr E/tQc6g%K

报告最左边是包名,以及包下边的类;右边是主窗口,显示当前这个Money类的测试覆盖率,我们可以通过行号来查看到151617行执行了156次,下边还会有两行一次也没有执行过,所以造成这个类整体的测试覆盖率不是100%。

(o3W}%@ N0

"e_c"Ha'K4@?V0

i#e7a*SzM L D7C0

j x!Q i#I/UM:z0四、重构测试代码实现百分百测试覆盖率

DfC.p)o f b9j%D0

+i/p7E j'? Aj$fC0我们总是希望做单元测试的时候,让代码的测试覆盖率尽可能的达到100%,所以我们需要重构测试代码。从分析得知,第40行虽然执行了27次,但是从来没有测试if的判断条件为true的情况,所以我们要添加测试用例,测试isZero()返回为true的情况!因此,我们修改测试代码MoneyTest.java文件,在前边初始化地方加上一个Money实例,如下:

'{.Tk"Lt5C"Y3a0
public class MoneyTest extends TestCase {
private Money f12CHF;
private Money f14CHF;
private Money f7USD;
private Money f21USD;
private Money f0USD;
51Testing软件测试网&A\/s2C9b lB}&}^

setup方法里添加:51Testing软件测试网i,f g xtH4n%Ru

X~W%Wtp0protected void setUp() {

};k D/[K&c k051Testing软件测试网0v+da},TF&f

f12CHF= new Money(12, "CHF");

wXR3z Z051Testing软件测试网f5i {)L(W4T+Vf-L

f14CHF= new Money(14, "CHF");

.qp^J __3d`051Testing软件测试网%eao4qnY1|I

f7USD= new Money( 7, "USD");

UF(bD&AFR?051Testing软件测试网:f.Kg,`)rc Z

f21USD= new Money(21, "USD");51Testing软件测试网R T;sy1Fd!OU

rk)E2CO1c yxfc0f0USD = new Money(0, "USD"); //sincky

p&e)c-Q ZZl[051Testing软件测试网X+` V*x!~%U

-u)en'bqaP K6` \-t/]051Testing软件测试网Xn:Q.C5e'W

在最后加上一个测试用例:51Testing软件测试网C5uANV uct

51Testing软件测试网0R2F#x;}v ~J

public void testMoneyEqualsZero() {51Testing软件测试网4b5dWcY.AH1D

,Hj)be%h`0}0assertTrue(!f0USD.equals(null));

r!J:VG!Zu1`/i051Testing软件测试网$vsIJ j(jKwi_

IMoney equalMoney = new Money(0, "CHF");51Testing软件测试网Tz0MO\/^:q%q

,K8S4i\ql0assertTrue(f0USD.equals(equalMoney));

[ TP R{.A0

cjh2D yc*f2h4h6j0}

u_]H-S5A051Testing软件测试网f,y3loO$r8@9Y

之后,我们重新编译,测试,创建报告,即执行下列命令:51Testing软件测试网4k ]l]U1U

51Testing软件测试网2r~2cgm$H

>ant clean

Z#l\ W-RoS.@051Testing软件测试网8G2QM my@O9A`;M

>ant clover compile51Testing软件测试网6c:b[5o:g_3C1~

51Testing软件测试网'w"k+vq(A5zl3K"l:Rw

>ant test

w'[sh"pYG#E051Testing软件测试网n(Y T8y\7t9Yt3~.Y

>ant report

\2m aC8`\+N0

_n4NO$c|f6c-X0这时候再打开新的html报告,看到如下效果覆盖率已经到达100%:51Testing软件测试网 u t;@xw7GG3]Q

51Testing软件测试网g GTu Ox)T^

n|5c'u^ Jb0

wKMF9W0完毕,如果能进展到这一步,相信你已经对使用junitantcloverjava的单元测试,已经到了一个新的飞越!如果有兴趣,你还可以把junit报告和clover报告一并输出,以更好的为企业开发中使用这种工作模式!51Testing软件测试网o-w7d0j#r_v\*Y

51Testing软件测试网bJ-O$?tM

文章源码均来自clover网站,本人稍做修改。

X i!E6_ k J,{051Testing软件测试网K4w i`'K:J.X)E

写在后面的话:目前国内单元测试尚在起步阶段,由于工作量大,耗时耗成本,很多公司都省去该环节;但是使用一些先进的技术,对源代码一些关键的类进行单元测试是可行的,也是必要的;希望本文对测试与java开发界朋友有所收获,Sincky在来日会写一些关于clover高级应用的文章,分享给大家!(20059月于上海台风暴雨夜)

9nS|`m8J+Y D0

9JrGz3]051Testing软件测试网l^ ]N/t,b


TAG:

 

评分:0

我来说两句

日历

« 2024-02-05  
    123
45678910
11121314151617
18192021222324
2526272829  

数据统计

  • 访问量: 20567
  • 日志数: 27
  • 建立时间: 2006-12-22
  • 更新时间: 2007-07-18

RSS订阅

Open Toolbar