不要追求绝对的公平,红尘之中没有公平而言,人活一世,难得糊涂。                                           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软件测试网HS^w\0b6I

ki(w Rh%m Un+e S6m0
第八步:Dealer测试Dealer类中的很多方法无返回值,很多私有变量,这为测试带来一定难度,不能从返回值简单的判断测试是否成功。
7a.L us"l"zwR0Dealer类中的方法作为一个简单的分类,大致可以分为四类方法51Testing软件测试网{(|RsS.G?@
赋值方法51Testing软件测试网6y E ?6s)P3qM
·         AssignPlayerHand
Sd2V9i8fD0·         setDealerHand51Testing软件测试网7]i1FK9h+o/E
·         setBet
8wh&v.oi0·         setMoney
@0l kgx6l0·         setTotal
I'swlfH%La0·         Dealer(构造函数)51Testing软件测试网v0T\Q4gaL$T&C
取值方法51Testing软件测试网5D(]#k#f G6A1P'Q
·         getBet
Od1l/s Z%Z*~0·         getMoney
Q l A2n)HG$?0·         getPlayers51Testing软件测试网$lL2vN&Z-g"t9c8c|
·         getTotal
$j;b,s&jLD_P'a8e0·         toString51Testing软件测试网N&Nu GzgO+Z4x E ?
操作方法
,j6[ Nl#a+j q!k&W"F1j0·         deal51Testing软件测试网8a2bZ*f ~;{)Q
·         handleTurn
'^U,M,hP[0·         processTurn51Testing软件测试网g7vq?v.KZ
·         getPlayerStatus
-a6uxsP%a0K0·         newShoe
7IF-\jb"]rX`0·         dealCard
HKV4vvZ[2j0对于某些方法进行测试发现,不能直接调用该方法,一定要先做一些准备工作,也就是说方法有一个执行顺序。例如:使用deal方法前一定要使用Dealer(构造函数)、AssignPlayerHandsetDealerHand这三个方法,否则无法完成deal方法的测试。这就引起了另一个问题,在进行白盒测试时一定要先了解类方法的使用规则,而规则一定要在设计文档中有说明,否则会为白盒测试带来很大的难度。51Testing软件测试网 B0laC$c%z
由于方法使用规则的限制,在一个测试方法中可以完成多个类方法的测试。例:deal方法是为每一位玩家发两张牌,在这之前必须做的事情是使用Dealer(构造函数)确认牌的数量和当少于多少张牌时进行洗牌,AssignPlayerHand加入玩家,setDealerHand加入庄家,然后调用deal方法发牌,在deal方法中又调用了newShoe方法(加入牌和洗牌)和dealCard方法(发牌)。在一个deal方法的测试用例中就完成了DealerAssignPlayerHandsetDealerHandnewShoedealCard五个方法的测试。
Pvg9JQ7Ua*k0测试Deal方法Deal方法无返回值,应该如何判断测试是否正确呢?Deal方法为每个玩家发两张牌,这个功能可以使用StandardBlackJackHand类的getCards方法进行测试,因为在AssignPlayerHandsetDealerHand方法中输入参数是BlackJackHand。发完牌后需要确认剩余的纸牌数量,这里有一点困难,theDeck是存放牌的变量,但它是一个私有变量,并且没有方法可以得到这个变量,最简单的方法是将私有变量改为保护变量,暂时没有想到更好的方法。咨询了开发人员后得知可以得到私有变量,但实现比较复杂,考虑到测试代码尽可能简洁的原则,暂时不采用这一方法。在本次测试中将theDeck改为为保护变量(因为还一些测试需要对theDeck的纸牌面值进行修改)51Testing软件测试网 mM bm4Y#I^
Deal方法的测试思路是判断每个玩家手里牌的数量是否正确,和剩余纸牌的数量是否正确。代码示例如下:
rA-OQ${7F0  public void testDeal1() throws Throwable {51Testing软件测试网0I,g&R7k2n)SD7g"VOO
        StandardDealerHand Dhand=new StandardDealerHand("Dealer");
iE6pii] r0        PlayerHand play=new PlayerHand("Player"); //设置两个新玩家
,d)M,Q;C%mM2XE0        assertEquals(0,Dhand.getCards().size());//判断玩家手中牌的数量
0_%`8kP7N_ p#s&Z6}0        assertEquals(0,play.getCards().size() );51Testing软件测试网6[)JKj9L.WR|
        Dealer THIS=new Dealer(1,20);
y3L#ozD(e~ KHG0        THIS.setDealerHand(Dhand);//加入玩家
#`R.fV g:KE3l0        THIS.assignPlayerHand(play);51Testing软件测试网p"BKV!n
        THIS.deal();//发牌
9Qj4h4po-Xj6L0        assertEquals(2,Dhand.getCards().size());//判断玩家手中牌的数量51Testing软件测试网7x/mU'h-X o6E|
        assertEquals(2,play.getCards().size());51Testing软件测试网fM8zXw:f!`2]
        assertEquals(48,THIS.theDeck.remainingCards());//判断剩余牌数
2N)sRnu%NqUw0  }51Testing软件测试网#v Po&v1l+|(F q
测试getPlayerStatus方法getPlayerStatus方法实现游戏结果的计算,在测试这一方法中需要使用Dealer(构造函数、setDealerHandassignPlayerHandBlackJackHand.addCard方法。在实现过程中发现并不需要调用Deal(发牌)方法,同样可以完成测试。如果使用Deal方法则会增加测试的复杂度。因为Deal方法为每个玩家发的牌是随机选择的,我们无法控制牌的面值,这样就无法控制测试结果,为了控制每个玩家手的牌的面值,还需要对theDeck进行修改。
[0ht@%UH's*\.c)~0测试代码示例如下:
S{{8I`5}.hcV0public void testGetPlayerStatus1() throws Throwable {
S9`%}!z l"a7Gm0        StandardDealerHand Dhand=new StandardDealerHand("Dealer");51Testing软件测试网l&X8TRS,m5}5p.Q)I
        PlayerHand play=new PlayerHand("Player");        51Testing软件测试网M:z G Z HDQ-u
        Dealer THIS=new Dealer(1,20);
g%\,{'],o.d VC0        THIS.setDealerHand(Dhand);
*z8e Z? dn2F-q0        THIS.assignPlayerHand(play);51Testing软件测试网bu g3v)pLb\8yq
/*注释的代码是使用了deal方法进行测试,代码较多,不易阅读理解51Testing软件测试网] O;F3_A _2W
        THIS.newShoe();      51Testing软件测试网7|2G)u9uM&VQS5F
        Deck DTemp=THIS.theDeck;
{FiW,s$L(K0        Vector VTemp= DTemp.getCards();
9LDd)l7w8JI%R0        Card card;
#]8e!rUK-HJ%f u0        card=(Card)VTemp.elementAt(0);51Testing软件测试网Y!D4l+lIm.u2g.aK
        card.setSuit(Suit.HEART );
5nFj8i0YNG jt VB0        card.setType('2');               51Testing软件测试网0b~.D ?3n$F M:QC
        card=(Card)VTemp.elementAt(1);
hG1D6n5V$M0        card.setSuit(Suit.HEART );51Testing软件测试网A H3\,bN
        card.setType('2');51Testing软件测试网4_ bx T J,iR
        card=(Card)VTemp.elementAt(2);51Testing软件测试网n0m{"R t3S4v4{
        card.setSuit(Suit.HEART );
sbFR)W X(Y0        card.setType('2');51Testing软件测试网D_hD:VC+ZO
        card=(Card)VTemp.elementAt(3);51Testing软件测试网D#?z2x&_+ho
        card.setSuit(Suit.HEART );
IEH#DdOAO0        card.setType('2');
g!O$A `|$m?s)[.a!e0        THIS.deal();
%k!M5O@ |;Ij-rH8C0        */51Testing软件测试网3M Jy:_ Y\ jS{!\
        Card card;
5U e"n$n-{ fGBT1BR b0        card=new Card(Suit.DIAMOND ,'3');51Testing软件测试网}[v4i8n%l
        play.addCard(card);//为每个玩家加入牌
"["i-OiR0} ^ Ln0        play.addCard(card);51Testing软件测试网N[+E(jD
        Dhand.addCard(card);
zp!H8y\0        Dhand.addCard(card);         
8r5d3e,j-W0        assertSame(Status.PUSH,THIS.getPlayerStatus(play));51Testing软件测试网p9x9Z I4q
  }51Testing软件测试网i^8jG$D~,t[m
测试processTurn方法processTurn方法实现庄家游戏规则,在这一方法中包含发牌的动作,为了能够达到测试目的,需要对牌进行控制。这里不在详细的描述,代码示例如下:51Testing软件测试网1x~*c3gh_
public void testProcessTurn1() throws Throwable {51Testing软件测试网/?K Y7q"r k!Y~Sa/A
        StandardDealerHand Dhand=new StandardDealerHand("Dealer");
T%s;Mk6kt)Lj-V0        PlayerHand play=new PlayerHand("Player");51Testing软件测试网.U(Qp[tN$y
        Dealer THIS=new Dealer(1,20);51Testing软件测试网R ~)?Z,|!yNx
        THIS.setDealerHand(Dhand);
j6yR$Z&t.F N/@ X0        THIS.assignPlayerHand( play);51Testing软件测试网O1o lF's&]7g8Fc
        THIS.newShoe();      
9e/`Ll uU9LbG(T T0        Deck DTemp=THIS.theDeck;
$W J9j1VQ"E'V0        Vector VTemp= DTemp.getCards();51Testing软件测试网+viY^+_5Bj
        Card card;
1O IuV7m sWB$y0        card=(Card)VTemp.elementAt(0);
s*K6Et;|eF0        card.setSuit(Suit.HEART );
w/sK}Ol5hJh@+T3t0        card.setType('T');               
/x$`j(M\aiW.b0        card=(Card)VTemp.elementAt(1);51Testing软件测试网,Nw:D,kT$k5n9H
        card.setSuit(Suit.HEART );51Testing软件测试网ku:s ^^9A7i;Pn~I
        card.setType('T');
"H3^x!MZj$TD!`0        card=(Card)VTemp.elementAt(2);51Testing软件测试网9r;r3c;~Dr9e"oT
        card.setSuit(Suit.HEART );51Testing软件测试网k(bwX7_2]"S
        card.setType('2');
#ZHJ[{0        card=(Card)VTemp.elementAt(3);
'Pxi!fY)GQ0        card.setSuit(Suit.HEART );
t:\ y0`_)MN0        card.setType('2');
:pg/yopT/a&c0        boolean RET=THIS.processTurn(Dhand);51Testing软件测试网cl*c.g5E#e/i@
        assertEquals(20,Dhand.highCount());
Nak7fdmw(K4b0        assertTrue(RET);51Testing软件测试网w'C6R&E0O#L
  }
_M/O0E8q7H6w+a0完成初步的测试代码后,进行覆盖率分析,对于未覆盖的代码补充测试用例。51Testing软件测试网7P~\ ]1EB&G
剩余未测试的类,全部用来实现界面的功能,这里暂时未找合理的白盒测试方法,并且有些功能白盒测试无法实现,如验证纸牌的图片错误、界面的文字是否正确、按钮的位置、按钮的功能,对于白盒测试要么无法实现,或者测试成本过高。
0MmO(}j0思考问题:·         将私有变量或方法修改成公共或保护的方法是否正确,有没有更好的方法?是否可以请求开发人员在代码中直接修改(修改设计)?

TAG: 单元测试

 

评分:0

我来说两句

Open Toolbar