2. 第一次尝试
上一篇 / 下一篇 2007-02-25 10:48:28 / 个人分类:单元测试
%lF![ ]m9i'\d051Testing软件测试网wDE5BYW y:l[
第二步:第一次尝试
fqP"J |p3|{N|#s?0初步的设想是先了解每一个类的功能,知道它们是做什么用、完成那些功能。但实际操作过程中觉得这样太慢了,而且在实际工作中当一个产品编码未完成时,我们 是否有可能了解每一个类的功能?可能我们只能够知道当前完成的编码所实现的功能。现在设想在Black Jack(以下将简称BJ)这个项目中,已经完成了Suit类的编码,其它的类仍然在编码。我们只要了解Suit类所实现的功能就可以开始进行白盒测试。
Ic _!['e/M051Testing软件测试网zcG``/D
在对Suit类进行测试之前,要先了解Suit类完成了那些功能。对这些功能如何进行测试?Suit 类包含如下函数:
2[RBH I6R2x0
M#v;SX:x VT P0private Suit(String name);
[x0g1K/L/ygT g0
3UC(i^-f0public int compareTo(Object o);
A#[&B/[YIu0
!D9r|o/z*Fap3b0public String toString();
3t6M:O(x%Ci%gr051Testing软件测试网 wL.@[%~5i"bd"b4D_
51Testing软件测试网-m E7CK1vM"^c]
51Testing软件测试网Ap ]|yj!{|vk
private Suit(String name);是一个私有构造函数,用来对内部四个变量构造时使用;(请教开发工程师后得知这种构造方法是设计者不希望用户控制类的创建过程。通过静态变量引用使用类)51Testing软件测试网&a3Y3?.wY-h7C:@4O
51Testing软件测试网"KE(G&~y4y"z
static final Suit HEART = new Suit("heart"); //红心 51Testing软件测试网{6S.u3xIa$y9O%G
51Testing软件测试网"Rp;QUT4b+}
static final Suit DIAMOND = new Suit("diamond"); //方片
"cd~@B5v#V D0
A}b.kteX0static final Suit CLUB = new Suit("club"); //草花51Testing软件测试网U#I*}}_(v!b
51Testing软件测试网 j,gD7`UR
static final Suit SPADE = new Suit("spade"); //黑桃
+M Z:Wsj051Testing软件测试网-A*xl o-\9fm
public int compareTo(Object o);用来计算花色之间的分值差;红心0分;方片1分;草花2分;黑桃3分;(这是由源代码分析得出,如果有设计文档将会以设计文档为基准;)
-X3|tr"h/`"{d051Testing软件测试网:se7m#[)S{
public String toString();返回花色的小写名称;
Ug ]?4Pv0
"Dd%J-I6XzU0
}+nxT|*^R0
N)U(Kc;Q)s$J] R@@0确定对Suit类测试public String toString();和public int compareTo(Object o)函数,通过静态变量引用测试四个变量和私有构造函数。51Testing软件测试网-n7?%Y%v.sq
51Testing软件测试网9\q E;t8^D:Eo
在Jtest中建立一个新的项目,在项目中建立一个新类Suit,将BJ中的Suit类覆盖新的Suit类,使用Jtest自动生成测试用例。51Testing软件测试网b f^3~O'Y!I'a%W
dhl*s&j-B0
h;?Is8c$h(_051Testing软件测试网DJ]/A aM$Ovz:|
BlackJakeTest是新的项目,项目中包含了一个基本的Suit类(由BJ中拷贝),Jtest自动生成了 BlackJackTest.jtest项目,并且生成一个测试类testsuit1();这里暂时不详细介绍Jtest使用方法,具体使用可以参考 Jtest的帮助文档。(点击蓝色播放按钮可以自动生成测试类和项目);51Testing软件测试网 ju6g9E/B:|&EIGf^
cqMI,nd{#](or051Testing软件测试网]6|1LL$K
IL;Pl5Q*uKH0通过覆盖率分析得出自动化测试只生成了Suit类的测试,测试覆盖率为83%;
!O| Jo1X6AYf,]GM1b051Testing软件测试网 `/_7z#}L#l$k DI
iy@R3B}0
D(x)Of5lL$b4v-r0
-x$F [!x~ q0
N'J-Z b*^:u6R'O0由于未能自动生成public String toString();和public int compareTo(Object o)函数测试代码,需要手工加入测试代码。
E/X!S~)VcG2e051Testing软件测试网V w.w3{,rfl"vt
!x0i7?!\*V"Z#JY'K051Testing软件测试网"fO{J)z Zk
同时发现testSuit1()并没有进行任何判断,无法得知测试正确性,所以可以删除这段测试代码);对于Jtest的运行方式还不了解,只是知道只要加入类,工具会自动运行;
!R6t"pF b3s0
]Rl1?EK;l5a0
DA[4y*m0
X,R2b"]&R3\EV0加入了4个类分别用于测试public String toString();加入2个类测试public int compareTo(Object o);测试toString判断返回值是否正确,返回值应该是"club"、"spade"、"diamond"、"heart"。51Testing软件测试网C'sS k.kq
51Testing软件测试网%?V#Pkp2?e
测试compareTo判断返回值是否正确。在这里引出一个问题:按照设计,红心0分;方片1分;草花2分;黑桃3分;但在测试过程中private final int ordinal是一个私有变量,我们只能测试花色之间的差值,但不能确定每种花色的分值是否与设计相符?也就是说private static int nextOrdinal = 0;当nextOrdinal变量初始化不是0时花色之间的差值仍然与我们的测试设计相符,但实际上与需求并不相符!同时也可以考虑由于是私有变量不能在 类外使用,是否可以不考虑设计分值而只考虑花色差值呢?
T*t4v3I8y051Testing软件测试网~/J@Lrx.x
执行测试发现测试覆盖率已经达到100%;同时未现错误;
6] u,t(A#^-o0
"Zx9k`Lj051Testing软件测试网o\5NO-z5Xd `C8N T
UimG4~w0到这里已经完成了对Suit类的测试;51Testing软件测试网}P|+R7~;^%b Y ZO_3R
51Testing软件测试网d!G,[qQ s$Zt"Ep
为了验证测试是否正确可以对Suit类的源代码作一些改动;可以将四个变量的顺序作一些调整,当再次运行测试会提示测试失败,预期值与实际值不相符;还可以将变量构建的字符串作一些修改,同样会提示测试失败。下图是调整了变量的顺序导致了测试失败;
zE:kp$Dbzo(D0
"mr;o9n;{0在源代码中有意的加入部分错误代码,最后与测试结果进行分析可以得出测试覆盖率,是一个判断测试覆盖率的简单方法;
@V;?"\"k1k L#XR051Testing软件测试网!?C;s)y2@Z0e+B
51Testing软件测试网0m6C:Tt#Qm-_F
,DB"o;\WDUy0附:
'l8J-d:M |0
"ZE1J{&a A/]0部分测试代码:
lfV)O&|:h {0
[)y2`b.SdW-R0 public void testCompareTo2() throws Throwable {
4Jy G2z6c]'j ?3aM051Testing软件测试网#`"D3[6_`L
Suit t1, t2;
K?-E+?RMRCuXq051Testing软件测试网*p0D(Pv2s"~ u7rg
t1 = Suit.HEART;51Testing软件测试网V HrDo
C4h2i(H;s9k0 t2 = Suit.SPADE;51Testing软件测试网(De8l.fr*M.b
^/fse1o$M8L [0 int R = t2.compareTo(t1);51Testing软件测试网L.no j2GP-BI
$X(v6?%H_&Ui i0 assertEquals(R, 3);
sz*uy;v l0
fqP"J |p3|{N|#s?0初步的设想是先了解每一个类的功能,知道它们是做什么用、完成那些功能。但实际操作过程中觉得这样太慢了,而且在实际工作中当一个产品编码未完成时,我们 是否有可能了解每一个类的功能?可能我们只能够知道当前完成的编码所实现的功能。现在设想在Black Jack(以下将简称BJ)这个项目中,已经完成了Suit类的编码,其它的类仍然在编码。我们只要了解Suit类所实现的功能就可以开始进行白盒测试。
Ic _!['e/M051Testing软件测试网zcG``/D
在对Suit类进行测试之前,要先了解Suit类完成了那些功能。对这些功能如何进行测试?Suit 类包含如下函数:
2[RBH I6R2x0
M#v;SX:x VT P0private Suit(String name);
[x0g1K/L/ygT g0
3UC(i^-f0public int compareTo(Object o);
A#[&B/[YIu0
!D9r|o/z*Fap3b0public String toString();
3t6M:O(x%Ci%gr051Testing软件测试网 wL.@[%~5i"bd"b4D_
51Testing软件测试网-m E7CK1vM"^c]
51Testing软件测试网Ap ]|yj!{|vk
private Suit(String name);是一个私有构造函数,用来对内部四个变量构造时使用;(请教开发工程师后得知这种构造方法是设计者不希望用户控制类的创建过程。通过静态变量引用使用类)51Testing软件测试网&a3Y3?.wY-h7C:@4O
51Testing软件测试网"KE(G&~y4y"z
static final Suit HEART = new Suit("heart"); //红心 51Testing软件测试网{6S.u3xIa$y9O%G
51Testing软件测试网"Rp;QUT4b+}
static final Suit DIAMOND = new Suit("diamond"); //方片
"cd~@B5v#V D0
A}b.kteX0static final Suit CLUB = new Suit("club"); //草花51Testing软件测试网U#I*}}_(v!b
51Testing软件测试网 j,gD7`UR
static final Suit SPADE = new Suit("spade"); //黑桃
+M Z:Wsj051Testing软件测试网-A*xl o-\9fm
public int compareTo(Object o);用来计算花色之间的分值差;红心0分;方片1分;草花2分;黑桃3分;(这是由源代码分析得出,如果有设计文档将会以设计文档为基准;)
-X3|tr"h/`"{d051Testing软件测试网:se7m#[)S{
public String toString();返回花色的小写名称;
Ug ]?4Pv0
"Dd%J-I6XzU0
}+nxT|*^R0
N)U(Kc;Q)s$J] R@@0确定对Suit类测试public String toString();和public int compareTo(Object o)函数,通过静态变量引用测试四个变量和私有构造函数。51Testing软件测试网-n7?%Y%v.sq
51Testing软件测试网9\q E;t8^D:Eo
在Jtest中建立一个新的项目,在项目中建立一个新类Suit,将BJ中的Suit类覆盖新的Suit类,使用Jtest自动生成测试用例。51Testing软件测试网b f^3~O'Y!I'a%W
dhl*s&j-B0
h;?Is8c$h(_051Testing软件测试网DJ]/A aM$Ovz:|
BlackJakeTest是新的项目,项目中包含了一个基本的Suit类(由BJ中拷贝),Jtest自动生成了 BlackJackTest.jtest项目,并且生成一个测试类testsuit1();这里暂时不详细介绍Jtest使用方法,具体使用可以参考 Jtest的帮助文档。(点击蓝色播放按钮可以自动生成测试类和项目);51Testing软件测试网 ju6g9E/B:|&EIGf^
cqMI,nd{#](or051Testing软件测试网]6|1LL$K
IL;Pl5Q*uKH0通过覆盖率分析得出自动化测试只生成了Suit类的测试,测试覆盖率为83%;
!O| Jo1X6AYf,]GM1b051Testing软件测试网 `/_7z#}L#l$k DI
iy@R3B}0
D(x)Of5lL$b4v-r0
-x$F [!x~ q0
N'J-Z b*^:u6R'O0由于未能自动生成public String toString();和public int compareTo(Object o)函数测试代码,需要手工加入测试代码。
E/X!S~)VcG2e051Testing软件测试网V w.w3{,rfl"vt
!x0i7?!\*V"Z#JY'K051Testing软件测试网"fO{J)z Zk
同时发现testSuit1()并没有进行任何判断,无法得知测试正确性,所以可以删除这段测试代码);对于Jtest的运行方式还不了解,只是知道只要加入类,工具会自动运行;
!R6t"pF b3s0
]Rl1?EK;l5a0
DA[4y*m0
X,R2b"]&R3\EV0加入了4个类分别用于测试public String toString();加入2个类测试public int compareTo(Object o);测试toString判断返回值是否正确,返回值应该是"club"、"spade"、"diamond"、"heart"。51Testing软件测试网C'sS k.kq
51Testing软件测试网%?V#Pkp2?e
测试compareTo判断返回值是否正确。在这里引出一个问题:按照设计,红心0分;方片1分;草花2分;黑桃3分;但在测试过程中private final int ordinal是一个私有变量,我们只能测试花色之间的差值,但不能确定每种花色的分值是否与设计相符?也就是说private static int nextOrdinal = 0;当nextOrdinal变量初始化不是0时花色之间的差值仍然与我们的测试设计相符,但实际上与需求并不相符!同时也可以考虑由于是私有变量不能在 类外使用,是否可以不考虑设计分值而只考虑花色差值呢?
T*t4v3I8y051Testing软件测试网~/J@Lrx.x
执行测试发现测试覆盖率已经达到100%;同时未现错误;
6] u,t(A#^-o0
"Zx9k`Lj051Testing软件测试网o\5NO-z5Xd `C8N T
UimG4~w0到这里已经完成了对Suit类的测试;51Testing软件测试网}P|+R7~;^%b Y ZO_3R
51Testing软件测试网d!G,[qQ s$Zt"Ep
为了验证测试是否正确可以对Suit类的源代码作一些改动;可以将四个变量的顺序作一些调整,当再次运行测试会提示测试失败,预期值与实际值不相符;还可以将变量构建的字符串作一些修改,同样会提示测试失败。下图是调整了变量的顺序导致了测试失败;
zE:kp$Dbzo(D0
"mr;o9n;{0在源代码中有意的加入部分错误代码,最后与测试结果进行分析可以得出测试覆盖率,是一个判断测试覆盖率的简单方法;
@V;?"\"k1k L#XR051Testing软件测试网!?C;s)y2@Z0e+B
51Testing软件测试网0m6C:Tt#Qm-_F
,DB"o;\WDUy0附:
'l8J-d:M |0
"ZE1J{&a A/]0部分测试代码:
lfV)O&|:h {0
[)y2`b.SdW-R0 public void testCompareTo2() throws Throwable {
4Jy G2z6c]'j ?3aM051Testing软件测试网#`"D3[6_`L
Suit t1, t2;
K?-E+?RMRCuXq051Testing软件测试网*p0D(Pv2s"~ u7rg
t1 = Suit.HEART;51Testing软件测试网V HrDo
C4h2i(H;s9k0 t2 = Suit.SPADE;51Testing软件测试网(De8l.fr*M.b
^/fse1o$M8L [0 int R = t2.compareTo(t1);51Testing软件测试网L.no j2GP-BI
$X(v6?%H_&Ui i0 assertEquals(R, 3);
sz*uy;v l0