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

2. 第一次尝试

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

51Testing软件测试网(\5W"PX"A^C v D p/S

/KN;Qu Z W0
第二步:第一次尝试51Testing软件测试网#@H'db cR:{
初步的设想是先了解每一个类的功能,知道它们是做什么用、完成那些功能。但实际操作过程中觉得这样太慢了,而且在实际工作中当一个产品编码未完成时,我们 是否有可能了解每一个类的功能?可能我们只能够知道当前完成的编码所实现的功能。现在设想在Black Jack(以下将简称BJ)这个项目中,已经完成了Suit类的编码,其它的类仍然在编码。我们只要了解Suit类所实现的功能就可以开始进行白盒测试
a?)s e {U0
?(i7cO D0在对Suit类进行测试之前,要先了解Suit类完成了那些功能。对这些功能如何进行测试?Suit 类包含如下函数:51Testing软件测试网 p6MGYY*~n
51Testing软件测试网K+M7fz5o
private Suit(String name);51Testing软件测试网5|n\.\'B

a!{Y K sN0public int compareTo(Object o);
NZd TCY8XK9?V/n051Testing软件测试网3SP3r` ~ L^K9xO"}
public String toString();
&r/Mu.i:w:h\051Testing软件测试网1Tj,[k.`-~Cd8[
51Testing软件测试网aF*f#q hd8}K
51Testing软件测试网 s{ qE2XWn
private Suit(String name);是一个私有构造函数,用来对内部四个变量构造时使用;(请教开发工程师后得知这种构造方法是设计者不希望用户控制类的创建过程。通过静态变量引用使用类)
{Yg4ILN{051Testing软件测试网m2L@\ mYw
static final Suit HEART = new Suit("heart");         //红心      51Testing软件测试网 h C-j~:q9e+h

4c ?M%Vax0static final Suit DIAMOND = new Suit("diamond");      //方片        51Testing软件测试网 c)A ]#x3Qg[^

)O Ems4Eb0static final Suit CLUB = new Suit("club");            //草花
~:@r'N e1W,O0
^]yIp#@.Q0static final Suit SPADE = new Suit("spade");  //黑桃51Testing软件测试网%x;X)F#WZ%F0e#@Pu:]
51Testing软件测试网2vM!YLD @s,M
public int compareTo(Object o);用来计算花色之间的分值差;红心0分;方片1分;草花2分;黑桃3分;(这是由源代码分析得出,如果有设计文档将会以设计文档为基准;)
5vX E0?yx051Testing软件测试网3u,Cng7IHF%z
public String toString();返回花色的小写名称;51Testing软件测试网B/dc0l)j!s

0O$M i!iEP051Testing软件测试网W/]3m$\OS*IM0a
51Testing软件测试网l&T7]+M%{^T3u,j
确定对Suit类测试public String toString();和public int compareTo(Object o)函数,通过静态变量引用测试四个变量和私有构造函数。
VIp3p"@{051Testing软件测试网)v$d5Rzy*Bb
在Jtest中建立一个新的项目,在项目中建立一个新类Suit,将BJ中的Suit类覆盖新的Suit类,使用Jtest自动生成测试用例51Testing软件测试网,aN.Qf[ SD

J ?[si!u0
i)R)E&l9UR5O'V2m051Testing软件测试网 q*qO9cO `^s
BlackJakeTest是新的项目,项目中包含了一个基本的Suit类(由BJ中拷贝),Jtest自动生成了 BlackJackTest.jtest项目,并且生成一个测试类testsuit1();这里暂时不详细介绍Jtest使用方法,具体使用可以参考 Jtest的帮助文档。(点击蓝色播放按钮可以自动生成测试类和项目);51Testing软件测试网d |.Z0`4jzsU
51Testing软件测试网Ot8]3_%AEK

E'SUU4o3^ X051Testing软件测试网Lv/W ^9y^eX
通过覆盖率分析得出自动化测试只生成了Suit类的测试,测试覆盖率为83%;51Testing软件测试网)o.|ub U@0ju,fQ
51Testing软件测试网(yr:p?$tO

S&Q[4~)xi$T-`u051Testing软件测试网ya th'S
51Testing软件测试网*u xP9G._'wo3@ X
51Testing软件测试网 `#W%g&xPQ_:rmuY
由于未能自动生成public String toString();和public int compareTo(Object o)函数测试代码,需要手工加入测试代码。51Testing软件测试网3D_(Q{/D

G0v3F VzW0
8b5W_ZI8C+y@a0
7q)A,Zp"LFY1y0同时发现testSuit1()并没有进行任何判断,无法得知测试正确性,所以可以删除这段测试代码);对于Jtest的运行方式还不了解,只是知道只要加入类,工具会自动运行;
G9]*vjOg0
%GF'?9Ow{0
(vhaf&GZt051Testing软件测试网:_8e0{!Yx2z?'W(u
加入了4个类分别用于测试public String toString();加入2个类测试public int compareTo(Object o);测试toString判断返回值是否正确,返回值应该是"club"、"spade"、"diamond"、"heart"。
w5Dr%qB$S0z051Testing软件测试网Gz2[q v.c I*K%wR,s
测试compareTo判断返回值是否正确。在这里引出一个问题:按照设计,红心0分;方片1分;草花2分;黑桃3分;但在测试过程中private final int ordinal是一个私有变量,我们只能测试花色之间的差值,但不能确定每种花色的分值是否与设计相符?也就是说private static int nextOrdinal = 0;当nextOrdinal变量初始化不是0时花色之间的差值仍然与我们的测试设计相符,但实际上与需求并不相符!同时也可以考虑由于是私有变量不能在 类外使用,是否可以不考虑设计分值而只考虑花色差值呢?51Testing软件测试网"I-v l'iMO9@ T)l x5`

|2wEPWy6a@0执行测试发现测试覆盖率已经达到100%;同时未现错误;
.sfqN ~ M-[u051Testing软件测试网9H(^N |q4sW:e3[
51Testing软件测试网1u1H~0n7w$_ldT

M6IsqY*R4i#ae0到这里已经完成了对Suit类的测试;
5?;l3];J1l*P8]!R051Testing软件测试网%kc#CH a#O d:J
为了验证测试是否正确可以对Suit类的源代码作一些改动;可以将四个变量的顺序作一些调整,当再次运行测试会提示测试失败,预期值与实际值不相符;还可以将变量构建的字符串作一些修改,同样会提示测试失败。下图是调整了变量的顺序导致了测试失败;51Testing软件测试网5ZK w"d }(MjU V
51Testing软件测试网(My;ZguAhZ
在源代码中有意的加入部分错误代码,最后与测试结果进行分析可以得出测试覆盖率,是一个判断测试覆盖率的简单方法;
!KM5{D$gGBS051Testing软件测试网 Z S(jg.n*vdc&G
51Testing软件测试网"Wj&c0Ll O
51Testing软件测试网0xI;`z\:l*b2[NC
附:
Q/M4q `$T7_3`]Fs051Testing软件测试网~ o!UJ;D
部分测试代码:51Testing软件测试网OY [Q!{_

$l.~,gQ la0  public void testCompareTo2() throws Throwable {51Testing软件测试网3uKK0m xRk0~

]/xp&n _(Py$at0                 Suit t1, t2;51Testing软件测试网r8T,T8e-a j

6UsV3}Z9dC*g0                  t1 = Suit.HEART;
\ ?'`NOr#N051Testing软件测试网'XIJ [iL8yU!E+Z*o
                  t2 = Suit.SPADE;51Testing软件测试网I.t{+RpM]W[5i

P$c%n9[sn3kE s0                  int R = t2.compareTo(t1);
["RO"iZ$XtY051Testing软件测试网3j VAu,d;J
                  assertEquals(R, 3);51Testing软件测试网g.n^NYZD
51Testing软件测试网QKA h J$u
  }51Testing软件测试网2L8NWJQ[N%H4r)F)N0t
51Testing软件测试网P`&jSJ*N
  public void testToString1() throws Throwable {
;q]GE} C051Testing软件测试网+[+am7z K+Uo2WkOn
        Suit Test1;51Testing软件测试网(U bda$Z"C.E
51Testing软件测试网:esY1Z.nvD
        Test1=Suit.CLUB;
G'Z7l#hU6g$J051Testing软件测试网T*LZ)Q$b/Ix%]
        String RETVAL =Test1.toString() ;
/S!B w%bnW1d&N0
({1{E+Xr5wr0        assertEquals("club", RETVAL); // Verified by Administrator51Testing软件测试网l&lp5s%R zX+G
51Testing软件测试网xt6g5]5t(x~x/qm'D
  }51Testing软件测试网l:z!mTKf S[@

o,H6dr]$u)A"A0思考问题:51Testing软件测试网RRG}~(|"sF4cA
·         是否需要了解每个类之后再开始着手进行测试?51Testing软件测试网J0AiTex H y}m

7fg { _E&l1W7a9h0·         是否需要对私有变量和私有函数进行测试?(指在源代码中插入测试代码)
t%U3{4By4p dI*Jet051Testing软件测试网e'}1M3u,K'v8R
·         使用白盒测试可以回归测试变得快捷,当需要测试的类很多时如何自动运行不需要人工控制;51Testing软件测试网%V&c_m8hw"\)d(~`
51Testing软件测试网 E s VMJUlE.G)X
·         如何与自动化构建相结合;(每个产品打包前将自动进行所有的白盒测试)
Xgp{@0
3j`/f,K$n+T0·         测试方法是否正确有没有遗漏或错误的地方?
0{6O2Z }G7L(e"lH0
1E$J5G4ia e*E~0·         在实际的白盒测试过程中开发人可以提供每个类的输入与预期输出结果吗?
7iKEGV#tj]0
*D;n,V8[n,~j*_h0·         如何评估本次的工作量?(为白盒测试的实施提供一些数据)51Testing软件测试网 L-n/b9^5wO

;e&^1~Y-I*}_H@0·         如何确定通过标准?是以源代码为标准?还是以设计文档为标准?
&MRD6B,No)l0
"DQ~.}Uf3fr1Y(o0·         如果没有设计文档时如何确定通过标准?51Testing软件测试网+Z6a+t'vC a"XT0fqt

my|.e^&s*M#E0·         如果以源代码为标准,当源代码出现错误时但运行又不会出现异常,这时就会出现测试错误,如何避免这种情况?
-i2P c$K&mQhb;LUM0
8C3r7f&kV"_2^2`2t0·         如何发现缺陷逃逸?

TAG: 单元测试

 

评分:0

我来说两句

Open Toolbar