不要追求绝对的公平,红尘之中没有公平而言,人活一世,难得糊涂。                                           it is no use doing what you like, you have got to like what you do.

2. 第一次尝试

上一篇 / 下一篇  2007-02-25 10:48:28 / 个人分类:单元测试

51Testing软件测试网6jFg0Z3uk)G
51Testing软件测试网'a o0v:Xqd*Hi9e,LL
第二步:第一次尝试51Testing软件测试网4aJ/s*@Z3m d
初步的设想是先了解每一个类的功能,知道它们是做什么用、完成那些功能。但实际操作过程中觉得这样太慢了,而且在实际工作中当一个产品编码未完成时,我们 是否有可能了解每一个类的功能?可能我们只能够知道当前完成的编码所实现的功能。现在设想在Black Jack(以下将简称BJ)这个项目中,已经完成了Suit类的编码,其它的类仍然在编码。我们只要了解Suit类所实现的功能就可以开始进行白盒测试51Testing软件测试网R+R |2Q;\\u
51Testing软件测试网"[ ]"EHA
在对Suit类进行测试之前,要先了解Suit类完成了那些功能。对这些功能如何进行测试?Suit 类包含如下函数:51Testing软件测试网,s7s,ua$QOa4j A.]

"~zQ lcP9E0private Suit(String name);51Testing软件测试网 K T-Y1t;E

(l&fA|+Y0public int compareTo(Object o);
J~X+p?(FvK-d2F0
5O0d? v+b Q0public String toString();51Testing软件测试网)tU,Z!U^9K8Y

Qj2N1T\^'~j0
XVw7?e4`&K-O)`0
EGs F$P;R`0private Suit(String name);是一个私有构造函数,用来对内部四个变量构造时使用;(请教开发工程师后得知这种构造方法是设计者不希望用户控制类的创建过程。通过静态变量引用使用类)51Testing软件测试网hu/A:sA/J
51Testing软件测试网 j+kIS/@~:hi
static final Suit HEART = new Suit("heart");         //红心      51Testing软件测试网!D!e vFF bD

-t v)X Tv*t{0static final Suit DIAMOND = new Suit("diamond");      //方片        
;ns aU m&BUav"q0
;[U8H,jK4N0static final Suit CLUB = new Suit("club");            //草花51Testing软件测试网1V&N!y T)~x!O;T

w0Zo%u?8d%k0static final Suit SPADE = new Suit("spade");  //黑桃
KCc|;a3nJ0
`h,b*X o"jR0public int compareTo(Object o);用来计算花色之间的分值差;红心0分;方片1分;草花2分;黑桃3分;(这是由源代码分析得出,如果有设计文档将会以设计文档为基准;)51Testing软件测试网,D;?lHbxx

;m#v(h\f$A;z(| Z0public String toString();返回花色的小写名称;
3py6U"H D7tK0
R)h,Ig,@7\9q051Testing软件测试网yr1^#PQc

L\-w+K+?r \0确定对Suit类测试public String toString();和public int compareTo(Object o)函数,通过静态变量引用测试四个变量和私有构造函数。
x!O7l/I;R}2f^(D051Testing软件测试网6}*zWuu)l0}3P.|2]
在Jtest中建立一个新的项目,在项目中建立一个新类Suit,将BJ中的Suit类覆盖新的Suit类,使用Jtest自动生成测试用例51Testing软件测试网%IA$o _4P5gA

t2s.cz Q&~z0
.X R7s#]Mv-{Y2`0WR051Testing软件测试网8sz:xN#G5S~0U
BlackJakeTest是新的项目,项目中包含了一个基本的Suit类(由BJ中拷贝),Jtest自动生成了 BlackJackTest.jtest项目,并且生成一个测试类testsuit1();这里暂时不详细介绍Jtest使用方法,具体使用可以参考 Jtest的帮助文档。(点击蓝色播放按钮可以自动生成测试类和项目);51Testing软件测试网X#}Q%MvEz%[6w

4aQa { C!F m051Testing软件测试网6d$sQ7Z(@ o

3s` d*T#Z0Y w0通过覆盖率分析得出自动化测试只生成了Suit类的测试,测试覆盖率为83%;
!E0O ]5` [w_0
PaT\CW0
f!d9a%yF4`K4E051Testing软件测试网qxd/N8DBQ

0] HK };` u j^&D0
'J+y?3}7@5xK8?5h0由于未能自动生成public String toString();和public int compareTo(Object o)函数测试代码,需要手工加入测试代码。
E[ sK9vJ1D:w!w051Testing软件测试网,vD/V-O#c-a M{
51Testing软件测试网W nCP8Uu6r ?1EF

LP;gJUA[:rUNm0同时发现testSuit1()并没有进行任何判断,无法得知测试正确性,所以可以删除这段测试代码);对于Jtest的运行方式还不了解,只是知道只要加入类,工具会自动运行;51Testing软件测试网?e wd,Aoix}S
51Testing软件测试网-};sZ,NZ\_,FG{

lcL6bV:x051Testing软件测试网'_`%b.{8\*kG)ZP
加入了4个类分别用于测试public String toString();加入2个类测试public int compareTo(Object o);测试toString判断返回值是否正确,返回值应该是"club"、"spade"、"diamond"、"heart"。
%K4{"mL/V[e%W'l051Testing软件测试网?;S7g/rz#XB
测试compareTo判断返回值是否正确。在这里引出一个问题:按照设计,红心0分;方片1分;草花2分;黑桃3分;但在测试过程中private final int ordinal是一个私有变量,我们只能测试花色之间的差值,但不能确定每种花色的分值是否与设计相符?也就是说private static int nextOrdinal = 0;当nextOrdinal变量初始化不是0时花色之间的差值仍然与我们的测试设计相符,但实际上与需求并不相符!同时也可以考虑由于是私有变量不能在 类外使用,是否可以不考虑设计分值而只考虑花色差值呢?
7f*hAu WX u"D0
%J#E`4A%c}0执行测试发现测试覆盖率已经达到100%;同时未现错误;51Testing软件测试网!A}jM.M9W!j/|Gl
51Testing软件测试网)U r)X?9c&[

hI4]t W8`0
W_$a*R7\L0到这里已经完成了对Suit类的测试;51Testing软件测试网2xsUaC[PIs
51Testing软件测试网.h'Qj`o`
为了验证测试是否正确可以对Suit类的源代码作一些改动;可以将四个变量的顺序作一些调整,当再次运行测试会提示测试失败,预期值与实际值不相符;还可以将变量构建的字符串作一些修改,同样会提示测试失败。下图是调整了变量的顺序导致了测试失败;
N.f"It__ _'PV7T_0
#K M c&W? B%]3X P0在源代码中有意的加入部分错误代码,最后与测试结果进行分析可以得出测试覆盖率,是一个判断测试覆盖率的简单方法;
klS7s:m051Testing软件测试网;yBj#} R"O
51Testing软件测试网*B g9q#zl?{-t4n

p c$y,Fx(w([Ub0附:
Q)g9q/E*d7@)]0
:GH8@$FAu9y`$Zl4t0部分测试代码:51Testing软件测试网Bwdy-s

^8JSfE&F"Jb JEf0  public void testCompareTo2() throws Throwable {51Testing软件测试网7d/kw;vUC

Ej qVO$[0                 Suit t1, t2;
NV1`NK,fk$hj;W0
Yy6h%rlT)h~iL2k0                  t1 = Suit.HEART;
])y6g^4T/_1f0
Px I9r BB.]@0                  t2 = Suit.SPADE;51Testing软件测试网 i"oU9[ z.S

V$mx@:U @s'c0                  int R = t2.compareTo(t1);51Testing软件测试网HczSE
51Testing软件测试网,XC*Lng2w3v\
                  assertEquals(R, 3);51Testing软件测试网ea.W+c?(G.YK$e
51Testing软件测试网'HYc6U$F/k |(nN
  }51Testing软件测试网CMJcaA1c ~*X

.@ ZaM.mUB:TO0  public void testToString1() throws Throwable {
m/r dLaM!~N0
"iz~ U0V)H0N0        Suit Test1;
"P.A1M hg^-n:q0
?xv7`+PF$v0        Test1=Suit.CLUB;
)N(X8b"z"Q%J {051Testing软件测试网V|w8Q EW8s p
        String RETVAL =Test1.toString() ;
j0L-?y w,B0
;n5h eBpwl'l0        assertEquals("club", RETVAL); // Verified by Administrator51Testing软件测试网L)l+~8R*u;?K EM8X7X

)u2h#Ie!N0  }51Testing软件测试网c5t5S#j*tzAK
51Testing软件测试网%vK8y;a n8C }0S:M'g
思考问题:51Testing软件测试网2J-X\;Ty8F;r
·         是否需要了解每个类之后再开始着手进行测试?51Testing软件测试网g!BM0Ac2kw
51Testing软件测试网m/Cq*wO4_1N/E
·         是否需要对私有变量和私有函数进行测试?(指在源代码中插入测试代码)51Testing软件测试网 ^*q$g+d M?1H'H%m
51Testing软件测试网(F I)miq"@pwD
·         使用白盒测试可以回归测试变得快捷,当需要测试的类很多时如何自动运行不需要人工控制;51Testing软件测试网/C wJ6{E @o

B Tj s:f/jM!f0·         如何与自动化构建相结合;(每个产品打包前将自动进行所有的白盒测试)
;Z9P*W/k3~G_0
w3tvs8HI e0·         测试方法是否正确有没有遗漏或错误的地方?51Testing软件测试网.]"]1Wn iC1~;|
51Testing软件测试网z0s-M t(LJo/]B ~
·         在实际的白盒测试过程中开发人可以提供每个类的输入与预期输出结果吗?
)~ M5Q.}AfDd0
8D&HW:|/LX#E e/R0Sk0·         如何评估本次的工作量?(为白盒测试的实施提供一些数据)51Testing软件测试网sI V*bm0^ T {/PF0JG
51Testing软件测试网,H.a'j1tE"kZH4h
·         如何确定通过标准?是以源代码为标准?还是以设计文档为标准?
fz*MqJ0
F#E']G-Fm)}1q0·         如果没有设计文档时如何确定通过标准?51Testing软件测试网;hEJ6?F5[$s

/R t*W`2x0·         如果以源代码为标准,当源代码出现错误时但运行又不会出现异常,这时就会出现测试错误,如何避免这种情况?
zy!M?2Z^|051Testing软件测试网%w]1^Q"x#}c
·         如何发现缺陷逃逸?

TAG: 单元测试

 

评分:0

我来说两句

Open Toolbar