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

8. Dealer类测试

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

51Testing软件测试网ED5kz,b%e ^7I j?X

qL\9S~_0
第八步:Dealer测试Dealer类中的很多方法无返回值,很多私有变量,这为测试带来一定难度,不能从返回值简单的判断测试是否成功。51Testing软件测试网*U0@ f#Z$u FB8R
Dealer类中的方法作为一个简单的分类,大致可以分为四类方法51Testing软件测试网 r.^%o1h(C f p
赋值方法51Testing软件测试网$V+H,lm c6j&G6wr
·         AssignPlayerHand51Testing软件测试网Og fA0_2\(CO p'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'NGuy
取值方法51Testing软件测试网q e@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(构造函数)、AssignPlayerHandsetDealerHand这三个方法,否则无法完成deal方法的测试。这就引起了另一个问题,在进行白盒测试时一定要先了解类方法的使用规则,而规则一定要在设计文档中有说明,否则会为白盒测试带来很大的难度。51Testing软件测试网\ A-B;t [5~;_%B`
由于方法使用规则的限制,在一个测试方法中可以完成多个类方法的测试。例:deal方法是为每一位玩家发两张牌,在这之前必须做的事情是使用Dealer(构造函数)确认牌的数量和当少于多少张牌时进行洗牌,AssignPlayerHand加入玩家,setDealerHand加入庄家,然后调用deal方法发牌,在deal方法中又调用了newShoe方法(加入牌和洗牌)和dealCard方法(发牌)。在一个deal方法的测试用例中就完成了DealerAssignPlayerHandsetDealerHandnewShoedealCard五个方法的测试。51Testing软件测试网y,fGE6|j7Gt
测试Deal方法Deal方法无返回值,应该如何判断测试是否正确呢?Deal方法为每个玩家发两张牌,这个功能可以使用StandardBlackJackHand类的getCards方法进行测试,因为在AssignPlayerHandsetDealerHand方法中输入参数是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_%uBh1D A
        PlayerHand play=new PlayerHand("Player"); //设置两个新玩家51Testing软件测试网;[ w Q2J+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'Y u0        THIS.setDealerHand(Dhand);//加入玩家51Testing软件测试网Xxc.gg
        THIS.assignPlayerHand(play);51Testing软件测试网:I y[KXO
        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(构造函数、setDealerHandassignPlayerHandBlackJackHand.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?n PT
        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软件测试网0CI o"S'\(L~ q ` I(C
        card.setSuit(Suit.HEART );
h7^ d$SD Z:d Z&~D0        card.setType('2');               51Testing软件测试网7}+tP9p4tn?
        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;iN6oG7w}vd
        card.setSuit(Suit.HEART );
6ei`'l,o?G0        card.setType('2');51Testing软件测试网4_[U B+ZF0h
        card=(Card)VTemp.elementAt(3);51Testing软件测试网zW U 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软件测试网3F k7s? xv
        play.addCard(card);//为每个玩家加入牌51Testing软件测试网6M Pe^f i
        play.addCard(card);51Testing软件测试网6E?J?4x1n}&\7k j
        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软件测试网5b E [ [w,c
测试processTurn方法processTurn方法实现庄家游戏规则,在这一方法中包含发牌的动作,为了能够达到测试目的,需要对牌进行控制。这里不在详细的描述,代码示例如下:51Testing软件测试网+w-k4m[*`"v{#FB
public void testProcessTurn1() throws Throwable {
XJh1B TTxB Wk E ? T0        StandardDealerHand Dhand=new StandardDealerHand("Dealer");
+? U k(}/YZR.^B0        PlayerHand play=new PlayerHand("Player");
+R vt8? FG Eg Ff1@0        Dealer THIS=new Dealer(1,20);
:^{ e&L [0        THIS.setDealerHand(Dhand);
,r F g%mVVv0        THIS.assignPlayerHand( play);51Testing软件测试网?9o%nW SH
        THIS.newShoe();      51Testing软件测试网'A+Vb g"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'oeoK O0        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软件测试网 N b7gOOK"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());
b;`2se uK BD0        assertTrue(RET);
h ^$|.sd%q#a7V0  }51Testing软件测试网`L c`Kf
完成初步的测试代码后,进行覆盖率分析,对于未覆盖的代码补充测试用例。
gRw;W/j)y0剩余未测试的类,全部用来实现界面的功能,这里暂时未找合理的白盒测试方法,并且有些功能白盒测试无法实现,如验证纸牌的图片错误、界面的文字是否正确、按钮的位置、按钮的功能,对于白盒测试要么无法实现,或者测试成本过高。51Testing软件测试网1` y$F A6U@ ]Q
思考问题:·         将私有变量或方法修改成公共或保护的方法是否正确,有没有更好的方法?是否可以请求开发人员在代码中直接修改(修改设计)?

TAG: 单元测试

 

评分:0

我来说两句

Open Toolbar