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

8. Dealer类测试

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


8nt1E;]'P051Testing软件测试网*g"e-`7y)D"k;v0bO!Z5zG
第八步:Dealer测试Dealer类中的很多方法无返回值,很多私有变量,这为测试带来一定难度,不能从返回值简单的判断测试是否成功。
'k,zp b\6e8La M;^0Dealer类中的方法作为一个简单的分类,大致可以分为四类方法
Q3|O-l~6D-s0赋值方法
[n&?q8FS1j6Z0·         AssignPlayerHand
NYFk5Z0·         setDealerHand51Testing软件测试网/xHW oB$I D&]?;o#i
·         setBet51Testing软件测试网#iG+W"O#du b
·         setMoney51Testing软件测试网Aw[$CjR \f?
·         setTotal
P ^D s1M0·         Dealer(构造函数)
l9KO"J'H,I r5P"s0取值方法51Testing软件测试网G$c"ds0pQ
·         getBet
zr aN}t?0·         getMoney51Testing软件测试网f&BC,\*Y!Nb
·         getPlayers51Testing软件测试网7r8Io%j(w[M
·         getTotal51Testing软件测试网1~"l cx w7U6}9[,M
·         toString
,HQkH.zK.~F1ft.J*r b0操作方法
j3ap-Gyg fE3B0·         deal51Testing软件测试网^N L%R6k+z$[
·         handleTurn
8}+h9j`h0·         processTurn51Testing软件测试网.gH0c"_+^7OXp
·         getPlayerStatus51Testing软件测试网2_2lQj)k&b[)O|
·         newShoe
,ae.q&n-Xo&D^/o M0·         dealCard
Y \5o!QT9e_0对于某些方法进行测试发现,不能直接调用该方法,一定要先做一些准备工作,也就是说方法有一个执行顺序。例如:使用deal方法前一定要使用Dealer(构造函数)、AssignPlayerHandsetDealerHand这三个方法,否则无法完成deal方法的测试。这就引起了另一个问题,在进行白盒测试时一定要先了解类方法的使用规则,而规则一定要在设计文档中有说明,否则会为白盒测试带来很大的难度。51Testing软件测试网`-M N G C;gP
由于方法使用规则的限制,在一个测试方法中可以完成多个类方法的测试。例:deal方法是为每一位玩家发两张牌,在这之前必须做的事情是使用Dealer(构造函数)确认牌的数量和当少于多少张牌时进行洗牌,AssignPlayerHand加入玩家,setDealerHand加入庄家,然后调用deal方法发牌,在deal方法中又调用了newShoe方法(加入牌和洗牌)和dealCard方法(发牌)。在一个deal方法的测试用例中就完成了DealerAssignPlayerHandsetDealerHandnewShoedealCard五个方法的测试。
l)L}Q$|0测试Deal方法Deal方法无返回值,应该如何判断测试是否正确呢?Deal方法为每个玩家发两张牌,这个功能可以使用StandardBlackJackHand类的getCards方法进行测试,因为在AssignPlayerHandsetDealerHand方法中输入参数是BlackJackHand。发完牌后需要确认剩余的纸牌数量,这里有一点困难,theDeck是存放牌的变量,但它是一个私有变量,并且没有方法可以得到这个变量,最简单的方法是将私有变量改为保护变量,暂时没有想到更好的方法。咨询了开发人员后得知可以得到私有变量,但实现比较复杂,考虑到测试代码尽可能简洁的原则,暂时不采用这一方法。在本次测试中将theDeck改为为保护变量(因为还一些测试需要对theDeck的纸牌面值进行修改)51Testing软件测试网'vHrziZ
Deal方法的测试思路是判断每个玩家手里牌的数量是否正确,和剩余纸牌的数量是否正确。代码示例如下:
A^2x1c:Cz0  public void testDeal1() throws Throwable {51Testing软件测试网!XNS T$M+f+\
        StandardDealerHand Dhand=new StandardDealerHand("Dealer");51Testing软件测试网5d4K)F2P3bIokL k(DIV
        PlayerHand play=new PlayerHand("Player"); //设置两个新玩家51Testing软件测试网5z(O+n2GC/LN-A
        assertEquals(0,Dhand.getCards().size());//判断玩家手中牌的数量
Ro+e^Lv0        assertEquals(0,play.getCards().size() );
1\4T^'AH9Lm0        Dealer THIS=new Dealer(1,20);
W#`tb a(qfyNs*^e5M"b0        THIS.setDealerHand(Dhand);//加入玩家51Testing软件测试网!lAgKM `z8J+h
        THIS.assignPlayerHand(play);51Testing软件测试网*W'? {aRyM Su)i
        THIS.deal();//发牌
1iZ6ua6m3wJ0        assertEquals(2,Dhand.getCards().size());//判断玩家手中牌的数量
2mo4^o:IL8V*m0        assertEquals(2,play.getCards().size());51Testing软件测试网7Z U(n+q+n3Q/Jk*D
        assertEquals(48,THIS.theDeck.remainingCards());//判断剩余牌数51Testing软件测试网 P2E&y`Z8W{*V` q
  }
@"W gvrZ0测试getPlayerStatus方法getPlayerStatus方法实现游戏结果的计算,在测试这一方法中需要使用Dealer(构造函数、setDealerHandassignPlayerHandBlackJackHand.addCard方法。在实现过程中发现并不需要调用Deal(发牌)方法,同样可以完成测试。如果使用Deal方法则会增加测试的复杂度。因为Deal方法为每个玩家发的牌是随机选择的,我们无法控制牌的面值,这样就无法控制测试结果,为了控制每个玩家手的牌的面值,还需要对theDeck进行修改。51Testing软件测试网*v#^)G!Z,u\w5IB1g
测试代码示例如下:
+} tHju8MX/i0public void testGetPlayerStatus1() throws Throwable {51Testing软件测试网sQ%[T1U)Y
        StandardDealerHand Dhand=new StandardDealerHand("Dealer");51Testing软件测试网&\9eQM)s2y TN
        PlayerHand play=new PlayerHand("Player");        
IR"sF$jj9F-H7QI0        Dealer THIS=new Dealer(1,20);51Testing软件测试网EZaX0}
        THIS.setDealerHand(Dhand);
6Qn2OR Z5Q'sa$O0        THIS.assignPlayerHand(play);51Testing软件测试网0RT*d6[S(J^
/*注释的代码是使用了deal方法进行测试,代码较多,不易阅读理解51Testing软件测试网ys9a M0SS-u
        THIS.newShoe();      
!IA!q6nQ0        Deck DTemp=THIS.theDeck;
^*ZG o2Ru0        Vector VTemp= DTemp.getCards();
|"c-u,T)t0        Card card;51Testing软件测试网6a,glv/E!H C
        card=(Card)VTemp.elementAt(0);51Testing软件测试网:k#P!\1Pn q_)R1\V
        card.setSuit(Suit.HEART );
7h sd2uv/sYi&G;H4J0        card.setType('2');               51Testing软件测试网 d#GHH ]1{H
        card=(Card)VTemp.elementAt(1);51Testing软件测试网qw@5T xLU
        card.setSuit(Suit.HEART );
/gbSzuZ]0        card.setType('2');51Testing软件测试网h7jy%J/|9Z
        card=(Card)VTemp.elementAt(2);51Testing软件测试网7zj3p)]:cM??nq
        card.setSuit(Suit.HEART );
.to8f$XD-S[||0        card.setType('2');51Testing软件测试网g5p5Oj)h3gu"lw m
        card=(Card)VTemp.elementAt(3);
K&B"A$\p1E1l0        card.setSuit(Suit.HEART );51Testing软件测试网KHD3P rl#V*T
        card.setType('2');
%T,r|Z0m?ia B0        THIS.deal();
l0k z%X0`D0        */51Testing软件测试网Xo6siV l;BiC&r
        Card card;
0d:k ZP?+S0k0        card=new Card(Suit.DIAMOND ,'3');51Testing软件测试网 PR{kw-B2H:~Pp
        play.addCard(card);//为每个玩家加入牌51Testing软件测试网%x d.\2UH h2l4M
        play.addCard(card);
[aDO'v6|G5F!d6WA0        Dhand.addCard(card);
Zj*tQ"i b W.Y(gP0        Dhand.addCard(card);         51Testing软件测试网 ne[3Z;T$Y {+Y
        assertSame(Status.PUSH,THIS.getPlayerStatus(play));
T0uj6?F,a o w0  }
"RI)T-S}}e2bF0测试processTurn方法processTurn方法实现庄家游戏规则,在这一方法中包含发牌的动作,为了能够达到测试目的,需要对牌进行控制。这里不在详细的描述,代码示例如下:
Qx-rQ'CP0public void testProcessTurn1() throws Throwable {51Testing软件测试网4k*h7}^k*D&Mp
        StandardDealerHand Dhand=new StandardDealerHand("Dealer");51Testing软件测试网/@.LztCJV
        PlayerHand play=new PlayerHand("Player");51Testing软件测试网a$u}2gu r"B2KH)\S,\
        Dealer THIS=new Dealer(1,20);51Testing软件测试网9MG a'UT^"lWwR
        THIS.setDealerHand(Dhand);51Testing软件测试网;kM F zuhaG
        THIS.assignPlayerHand( play);51Testing软件测试网+yM#G)b xk(f%Q`
        THIS.newShoe();      
n!K"Sy m$dw0        Deck DTemp=THIS.theDeck;
O.A&HC*P1gy|/D0        Vector VTemp= DTemp.getCards();51Testing软件测试网fs2dD;OF#h9Bs;g
        Card card;
b&f F!MdH J K$kE^0        card=(Card)VTemp.elementAt(0);51Testing软件测试网"H ^3C8}.s e yo+]
        card.setSuit(Suit.HEART );51Testing软件测试网)\H [(S.V f_ j
        card.setType('T');               51Testing软件测试网 v j/wsi Q6V6s
        card=(Card)VTemp.elementAt(1);
#S;B1P [z'^r O0        card.setSuit(Suit.HEART );51Testing软件测试网F{(s*?I;z%V[`6LjR
        card.setType('T');51Testing软件测试网4}$rsZ9uw
        card=(Card)VTemp.elementAt(2);
R ]*TE I0O$H!FM0        card.setSuit(Suit.HEART );
g$W*i(|#Ub$l7?b0        card.setType('2');
l7Djg}0        card=(Card)VTemp.elementAt(3);51Testing软件测试网2^9M}L,@w'o\ J9b
        card.setSuit(Suit.HEART );51Testing软件测试网fV|*]i5O@!_D
        card.setType('2');
+M}0CM/F`c2dP0        boolean RET=THIS.processTurn(Dhand);51Testing软件测试网+C$Ui&W}2yk4H|
        assertEquals(20,Dhand.highCount());51Testing软件测试网Nt^[(plR_z&D
        assertTrue(RET);
,U4Oc Zf/n0  }51Testing软件测试网*^Ul(H@!]io(J"}a;L
完成初步的测试代码后,进行覆盖率分析,对于未覆盖的代码补充测试用例。51Testing软件测试网g'C `Y}TqG/ht
剩余未测试的类,全部用来实现界面的功能,这里暂时未找合理的白盒测试方法,并且有些功能白盒测试无法实现,如验证纸牌的图片错误、界面的文字是否正确、按钮的位置、按钮的功能,对于白盒测试要么无法实现,或者测试成本过高。
WfP8dM?ct Qr0思考问题:·         将私有变量或方法修改成公共或保护的方法是否正确,有没有更好的方法?是否可以请求开发人员在代码中直接修改(修改设计)?

TAG: 单元测试

 

评分:0

我来说两句

Open Toolbar