8. Dealer类测试
上一篇 / 下一篇 2007-02-25 10:52:33 / 个人分类:单元测试
51Testing软件测试网ED5kz,b%e
^7I
j?X
qL\9S~_0
qL\9S~_0
第八步:Dealer类测试Dealer类中的很多方法无返回值,很多私有变量,这为测试带来一定难度,不能从返回值简单的判断测试是否成功。51Testing软件测试网*U0@ f#Z$u
FB8R
为Dealer类中的方法作为一个简单的分类,大致可以分为四类方法51Testing软件测试网r.^%o1h(C fp
赋值方法51Testing软件测试网$V+H,lm c6j&G6wr
· AssignPlayerHand51Testing软件测试网O gfA0_2\(COp'E
· setDealerHand
q1|c*}(zb0· setBet51Testing软件测试网*e bf2t|/t)Bf
· setMoney
6f&{s.Z#E)CC7z-c0· setTotal51Testing软件测试网4KV&y[v
· Dealer(构造函数)51Testing软件测试网2Ue$S3z2R'NG uy
取值方法51Testing软件测试网qe@7Iw4? @#m3rz
· getBet51Testing软件测试网8leTwKt
· getMoney
-q@ SO+c)M0· getPlayers51Testing软件测试网-?zKOcN
· getTotal
:S!I$erqM0· toString51Testing软件测试网 m0Hp{/t/}[O+j
操作方法
X9eR6Es0· deal51Testing软件测试网V-k"o"V@4GgTAj
· handleTurn
+L'd:y zQV@c0· processTurn
N\v9CHw0· getPlayerStatus51Testing软件测试网c'Qa!A*s]B
· newShoe51Testing软件测试网%~*Y:I2cZ$v
· dealCard
uZDf?_:}[0对于某些方法进行测试发现,不能直接调用该方法,一定要先做一些准备工作,也就是说方法有一个执行顺序。例如:使用deal方法前一定要使用Dealer(构造函数)、AssignPlayerHand、setDealerHand这三个方法,否则无法完成deal方法的测试。这就引起了另一个问题,在进行白盒测试时一定要先了解类方法的使用规则,而规则一定要在设计文档中有说明,否则会为白盒测试带来很大的难度。51Testing软件测试网\A-B;t [5~;_%B`
由于方法使用规则的限制,在一个测试方法中可以完成多个类方法的测试。例:deal方法是为每一位玩家发两张牌,在这之前必须做的事情是使用Dealer(构造函数)确认牌的数量和当少于多少张牌时进行洗牌,AssignPlayerHand加入玩家,setDealerHand加入庄家,然后调用deal方法发牌,在deal方法中又调用了newShoe方法(加入牌和洗牌)和dealCard方法(发牌)。在一个deal方法的测试用例中就完成了Dealer、AssignPlayerHand、setDealerHand、newShoe、dealCard五个方法的测试。51Testing软件测试网y,fGE6|j7Gt
测试Deal方法Deal方法无返回值,应该如何判断测试是否正确呢?Deal方法为每个玩家发两张牌,这个功能可以使用StandardBlackJackHand类的getCards方法进行测试,因为在AssignPlayerHand、setDealerHand方法中输入参数是BlackJackHand。发完牌后需要确认剩余的纸牌数量,这里有一点困难,theDeck是存放牌的变量,但它是一个私有变量,并且没有方法可以得到这个变量,最简单的方法是将私有变量改为保护变量,暂时没有想到更好的方法。咨询了开发人员后得知可以得到私有变量,但实现比较复杂,考虑到测试代码尽可能简洁的原则,暂时不采用这一方法。在本次测试中将theDeck改为为保护变量(因为还一些测试需要对theDeck的纸牌面值进行修改)
S/J_i Q8lT$m%W?0Deal方法的测试思路是判断每个玩家手里牌的数量是否正确,和剩余纸牌的数量是否正确。代码示例如下:
zCgLk|xn0 public void testDeal1() throws Throwable {51Testing软件测试网)vV/f-VN6v0F&HW
StandardDealerHand Dhand=new StandardDealerHand("Dealer");51Testing软件测试网0_%uBh1DA
PlayerHand play=new PlayerHand("Player"); //设置两个新玩家51Testing软件测试网;[wQ2J+l%o6my?
assertEquals(0,Dhand.getCards().size());//判断玩家手中牌的数量51Testing软件测试网.e%[9OEU/I}C+_;d
assertEquals(0,play.getCards().size() );
y)IX*X {\0 Dealer THIS=new Dealer(1,20);
#k,]\?)I'Yu0 THIS.setDealerHand(Dhand);//加入玩家51Testing软件测试网Xxc.gg
THIS.assignPlayerHand(play);51Testing软件测试网:I y[K XO
THIS.deal();//发牌
n1zq1v0M#l+\0 assertEquals(2,Dhand.getCards().size());//判断玩家手中牌的数量
A6jP{g7YgG0 assertEquals(2,play.getCards().size());
F(o*O4`"W-S+K mZ5vW0 assertEquals(48,THIS.theDeck.remainingCards());//判断剩余牌数51Testing软件测试网.wK&m5E5n.^
}51Testing软件测试网S2cU(U;w b
测试getPlayerStatus方法getPlayerStatus方法实现游戏结果的计算,在测试这一方法中需要使用Dealer(构造函数、setDealerHand、assignPlayerHand、BlackJackHand.addCard方法。在实现过程中发现并不需要调用Deal(发牌)方法,同样可以完成测试。如果使用Deal方法则会增加测试的复杂度。因为Deal方法为每个玩家发的牌是随机选择的,我们无法控制牌的面值,这样就无法控制测试结果,为了控制每个玩家手的牌的面值,还需要对theDeck进行修改。
xj7E*Dk$sK'QP~4X0测试代码示例如下:
@'~*c"`P7PI7FH0public void testGetPlayerStatus1() throws Throwable {51Testing软件测试网!}~hI ^4e'B
StandardDealerHand Dhand=new StandardDealerHand("Dealer");51Testing软件测试网? t[6L:Jr |t
PlayerHand play=new PlayerHand("Player");
F(O8qesF&r f+K_0 Dealer THIS=new Dealer(1,20);51Testing软件测试网1ui'POYp
THIS.setDealerHand(Dhand);
9U _.W!Yd8}s0 THIS.assignPlayerHand(play);51Testing软件测试网fT4UX*~ A ]R
/*注释的代码是使用了deal方法进行测试,代码较多,不易阅读理解51Testing软件测试网8D }f5Q ?nPT
THIS.newShoe(); 51Testing软件测试网XW#O5o%Y5h)[P m
Deck DTemp=THIS.theDeck;
C,zcr*sk0 Vector VTemp= DTemp.getCards();51Testing软件测试网$FW d"\#`s
Card card;
#?8bt2mZ-Y#Ep8^9[0 card=(Card)VTemp.elementAt(0);51Testing软件测试网0CIo"S'\(L~ q `I(C
card.setSuit(Suit.HEART );
h7^ d$SD Z:d Z&~D0 card.setType('2'); 51Testing软件测试网7}+t P9p4tn?
card=(Card)VTemp.elementAt(1);51Testing软件测试网F,N | nQw
card.setSuit(Suit.HEART );51Testing软件测试网O.{\g7eb-]!U+Ji6J
card.setType('2');
'O6nY9a n0 card=(Card)VTemp.elementAt(2);51Testing软件测试网1a;iN6o G7w}vd
card.setSuit(Suit.HEART );
6ei`'l,o?G0 card.setType('2');51Testing软件测试网4_[U B+ZF0h
card=(Card)VTemp.elementAt(3);51Testing软件测试网zWU S(U3eTkX)Nk#V
card.setSuit(Suit.HEART );51Testing软件测试网!iq"`%iY)c$r.P CI
card.setType('2');
7J@&`m/k.q-[+U%a m0 THIS.deal();51Testing软件测试网1FZ LOpbbX(A
*/
(r |7RB%?!u;b0 Card card;51Testing软件测试网y'U4c+}7qUx
card=new Card(Suit.DIAMOND ,'3');51Testing软件测试网3Fk7s? xv
play.addCard(card);//为每个玩家加入牌51Testing软件测试网6MPe^fi
play.addCard(card);51Testing软件测试网6E ?J?4x1n}&\7kj
Dhand.addCard(card);51Testing软件测试网8a2}Z1n.^*xJ5d
Dhand.addCard(card);
$j$xw$?flg LJ0 assertSame(Status.PUSH,THIS.getPlayerStatus(play));
!U}:{$L4f&L:P{0 }51Testing软件测试网5bE [ [w,c
测试processTurn方法processTurn方法实现庄家游戏规则,在这一方法中包含发牌的动作,为了能够达到测试目的,需要对牌进行控制。这里不在详细的描述,代码示例如下:51Testing软件测试网+w-k4m[*`"v{#FB
public void testProcessTurn1() throws Throwable {
XJh1B TTxB Wk E ? T0 StandardDealerHand Dhand=new StandardDealerHand("Dealer");
+?Uk(}/YZR.^B0 PlayerHand play=new PlayerHand("Player");
+R vt8? FG Eg F f1@0 Dealer THIS=new Dealer(1,20);
:^{ e&L[0 THIS.setDealerHand(Dhand);
,rF g%mVVv0 THIS.assignPlayerHand( play);51Testing软件测试网?9o%n WSH
THIS.newShoe(); 51Testing软件测试网'A+Vbg"v+P({2E:zv?0D
Deck DTemp=THIS.theDeck;
:M?!qif,b0 Vector VTemp= DTemp.getCards();
%N*]|#f&_3Fu0 Card card;51Testing软件测试网QPy)\Vk.| CaI
card=(Card)VTemp.elementAt(0);
l'? Ul/MW.f0 card.setSuit(Suit.HEART );
sDJi i"z0 card.setType('T'); 51Testing软件测试网:[ T6A4\!x$@D
card=(Card)VTemp.elementAt(1);
%Z C6by'oeoKO0 card.setSuit(Suit.HEART );51Testing软件测试网HGY\m
card.setType('T');51Testing软件测试网t'Q1Q a.zS!A ^ o8D
card=(Card)VTemp.elementAt(2);51Testing软件测试网/\&J;p })bB|
card.setSuit(Suit.HEART );51Testing软件测试网 Nb7gOOK"n"M;V
card.setType('2');
K,V(~!hiK6hh0 card=(Card)VTemp.elementAt(3);
cB9_8qC'S0J6N0 card.setSuit(Suit.HEART );
SiHiH)uZ{#]0 card.setType('2');
crTSv4A,uL0 boolean RET=THIS.processTurn(Dhand);
W%bRA~:i"M2nU0 assertEquals(20,Dhand.highCount());
为Dealer类中的方法作为一个简单的分类,大致可以分为四类方法51Testing软件测试网r.^%o1h(C fp
赋值方法51Testing软件测试网$V+H,lm c6j&G6wr
· AssignPlayerHand51Testing软件测试网O gfA0_2\(COp'E
· setDealerHand
q1|c*}(zb0· setBet51Testing软件测试网*e bf2t|/t)Bf
· setMoney
6f&{s.Z#E)CC7z-c0· setTotal51Testing软件测试网4KV&y[v
· Dealer(构造函数)51Testing软件测试网2Ue$S3z2R'NG uy
取值方法51Testing软件测试网qe@7Iw4? @#m3rz
· getBet51Testing软件测试网8leTwKt
· getMoney
-q@ SO+c)M0· getPlayers51Testing软件测试网-?zKOcN
· getTotal
:S!I$erqM0· toString51Testing软件测试网 m0Hp{/t/}[O+j
操作方法
X9eR6Es0· deal51Testing软件测试网V-k"o"V@4GgTAj
· handleTurn
+L'd:y zQV@c0· processTurn
N\v9CHw0· getPlayerStatus51Testing软件测试网c'Qa!A*s]B
· newShoe51Testing软件测试网%~*Y:I2cZ$v
· dealCard
uZDf?_:}[0对于某些方法进行测试发现,不能直接调用该方法,一定要先做一些准备工作,也就是说方法有一个执行顺序。例如:使用deal方法前一定要使用Dealer(构造函数)、AssignPlayerHand、setDealerHand这三个方法,否则无法完成deal方法的测试。这就引起了另一个问题,在进行白盒测试时一定要先了解类方法的使用规则,而规则一定要在设计文档中有说明,否则会为白盒测试带来很大的难度。51Testing软件测试网\A-B;t [5~;_%B`
由于方法使用规则的限制,在一个测试方法中可以完成多个类方法的测试。例:deal方法是为每一位玩家发两张牌,在这之前必须做的事情是使用Dealer(构造函数)确认牌的数量和当少于多少张牌时进行洗牌,AssignPlayerHand加入玩家,setDealerHand加入庄家,然后调用deal方法发牌,在deal方法中又调用了newShoe方法(加入牌和洗牌)和dealCard方法(发牌)。在一个deal方法的测试用例中就完成了Dealer、AssignPlayerHand、setDealerHand、newShoe、dealCard五个方法的测试。51Testing软件测试网y,fGE6|j7Gt
测试Deal方法Deal方法无返回值,应该如何判断测试是否正确呢?Deal方法为每个玩家发两张牌,这个功能可以使用StandardBlackJackHand类的getCards方法进行测试,因为在AssignPlayerHand、setDealerHand方法中输入参数是BlackJackHand。发完牌后需要确认剩余的纸牌数量,这里有一点困难,theDeck是存放牌的变量,但它是一个私有变量,并且没有方法可以得到这个变量,最简单的方法是将私有变量改为保护变量,暂时没有想到更好的方法。咨询了开发人员后得知可以得到私有变量,但实现比较复杂,考虑到测试代码尽可能简洁的原则,暂时不采用这一方法。在本次测试中将theDeck改为为保护变量(因为还一些测试需要对theDeck的纸牌面值进行修改)
S/J_i Q8lT$m%W?0Deal方法的测试思路是判断每个玩家手里牌的数量是否正确,和剩余纸牌的数量是否正确。代码示例如下:
zCgLk|xn0 public void testDeal1() throws Throwable {51Testing软件测试网)vV/f-VN6v0F&HW
StandardDealerHand Dhand=new StandardDealerHand("Dealer");51Testing软件测试网0_%uBh1DA
PlayerHand play=new PlayerHand("Player"); //设置两个新玩家51Testing软件测试网;[wQ2J+l%o6my?
assertEquals(0,Dhand.getCards().size());//判断玩家手中牌的数量51Testing软件测试网.e%[9OEU/I}C+_;d
assertEquals(0,play.getCards().size() );
y)IX*X {\0 Dealer THIS=new Dealer(1,20);
#k,]\?)I'Yu0 THIS.setDealerHand(Dhand);//加入玩家51Testing软件测试网Xxc.gg
THIS.assignPlayerHand(play);51Testing软件测试网:I y[K XO
THIS.deal();//发牌
n1zq1v0M#l+\0 assertEquals(2,Dhand.getCards().size());//判断玩家手中牌的数量
A6jP{g7YgG0 assertEquals(2,play.getCards().size());
F(o*O4`"W-S+K mZ5vW0 assertEquals(48,THIS.theDeck.remainingCards());//判断剩余牌数51Testing软件测试网.wK&m5E5n.^
}51Testing软件测试网S2cU(U;w b
测试getPlayerStatus方法getPlayerStatus方法实现游戏结果的计算,在测试这一方法中需要使用Dealer(构造函数、setDealerHand、assignPlayerHand、BlackJackHand.addCard方法。在实现过程中发现并不需要调用Deal(发牌)方法,同样可以完成测试。如果使用Deal方法则会增加测试的复杂度。因为Deal方法为每个玩家发的牌是随机选择的,我们无法控制牌的面值,这样就无法控制测试结果,为了控制每个玩家手的牌的面值,还需要对theDeck进行修改。
xj7E*Dk$sK'QP~4X0测试代码示例如下:
@'~*c"`P7PI7FH0public void testGetPlayerStatus1() throws Throwable {51Testing软件测试网!}~hI ^4e'B
StandardDealerHand Dhand=new StandardDealerHand("Dealer");51Testing软件测试网? t[6L:Jr |t
PlayerHand play=new PlayerHand("Player");
F(O8qesF&r f+K_0 Dealer THIS=new Dealer(1,20);51Testing软件测试网1ui'POYp
THIS.setDealerHand(Dhand);
9U _.W!Yd8}s0 THIS.assignPlayerHand(play);51Testing软件测试网fT4UX*~ A ]R
/*注释的代码是使用了deal方法进行测试,代码较多,不易阅读理解51Testing软件测试网8D }f5Q ?nPT
THIS.newShoe(); 51Testing软件测试网XW#O5o%Y5h)[P m
Deck DTemp=THIS.theDeck;
C,zcr*sk0 Vector VTemp= DTemp.getCards();51Testing软件测试网$FW d"\#`s
Card card;
#?8bt2mZ-Y#Ep8^9[0 card=(Card)VTemp.elementAt(0);51Testing软件测试网0CIo"S'\(L~ q `I(C
card.setSuit(Suit.HEART );
h7^ d$SD Z:d Z&~D0 card.setType('2'); 51Testing软件测试网7}+t P9p4tn?
card=(Card)VTemp.elementAt(1);51Testing软件测试网F,N | nQw
card.setSuit(Suit.HEART );51Testing软件测试网O.{\g7eb-]!U+Ji6J
card.setType('2');
'O6nY9a n0 card=(Card)VTemp.elementAt(2);51Testing软件测试网1a;iN6o G7w}vd
card.setSuit(Suit.HEART );
6ei`'l,o?G0 card.setType('2');51Testing软件测试网4_[U B+ZF0h
card=(Card)VTemp.elementAt(3);51Testing软件测试网zWU S(U3eTkX)Nk#V
card.setSuit(Suit.HEART );51Testing软件测试网!iq"`%iY)c$r.P CI
card.setType('2');
7J@&`m/k.q-[+U%a m0 THIS.deal();51Testing软件测试网1FZ LOpbbX(A
*/
(r |7RB%?!u;b0 Card card;51Testing软件测试网y'U4c+}7qUx
card=new Card(Suit.DIAMOND ,'3');51Testing软件测试网3Fk7s? xv
play.addCard(card);//为每个玩家加入牌51Testing软件测试网6MPe^fi
play.addCard(card);51Testing软件测试网6E ?J?4x1n}&\7kj
Dhand.addCard(card);51Testing软件测试网8a2}Z1n.^*xJ5d
Dhand.addCard(card);
$j$xw$?flg LJ0 assertSame(Status.PUSH,THIS.getPlayerStatus(play));
!U}:{$L4f&L:P{0 }51Testing软件测试网5bE [ [w,c
测试processTurn方法processTurn方法实现庄家游戏规则,在这一方法中包含发牌的动作,为了能够达到测试目的,需要对牌进行控制。这里不在详细的描述,代码示例如下:51Testing软件测试网+w-k4m[*`"v{#FB
public void testProcessTurn1() throws Throwable {
XJh1B TTxB Wk E ? T0 StandardDealerHand Dhand=new StandardDealerHand("Dealer");
+?Uk(}/YZR.^B0 PlayerHand play=new PlayerHand("Player");
+R vt8? FG Eg F f1@0 Dealer THIS=new Dealer(1,20);
:^{ e&L[0 THIS.setDealerHand(Dhand);
,rF g%mVVv0 THIS.assignPlayerHand( play);51Testing软件测试网?9o%n WSH
THIS.newShoe(); 51Testing软件测试网'A+Vbg"v+P({2E:zv?0D
Deck DTemp=THIS.theDeck;
:M?!qif,b0 Vector VTemp= DTemp.getCards();
%N*]|#f&_3Fu0 Card card;51Testing软件测试网QPy)\Vk.| CaI
card=(Card)VTemp.elementAt(0);
l'? Ul/MW.f0 card.setSuit(Suit.HEART );
sDJi i"z0 card.setType('T'); 51Testing软件测试网:[ T6A4\!x$@D
card=(Card)VTemp.elementAt(1);
%Z C6by'oeoKO0 card.setSuit(Suit.HEART );51Testing软件测试网HGY\m
card.setType('T');51Testing软件测试网t'Q1Q a.zS!A ^ o8D
card=(Card)VTemp.elementAt(2);51Testing软件测试网/\&J;p })bB|
card.setSuit(Suit.HEART );51Testing软件测试网 Nb7gOOK"n"M;V
card.setType('2');
K,V(~!hiK6hh0 card=(Card)VTemp.elementAt(3);
cB9_8qC'S0J6N0 card.setSuit(Suit.HEART );
SiHiH)uZ{#]0 card.setType('2');
crTSv4A,uL0 boolean RET=THIS.processTurn(Dhand);
W%bRA~:i"M2nU0 assertEquals(20,Dhand.highCount());