不要追求绝对的公平,红尘之中没有公平而言,人活一世,难得糊涂。
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\6e8L a
M;^0为Dealer类中的方法作为一个简单的分类,大致可以分为四类方法Q3|O-l~6D-s0赋值方法
[n&?q8FS1j6Z0· AssignPlayerHand NYFk5Z0· setDealerHand51Testing软件测试网/xHWo B$ID&]?;o#i· setBet51Testing软件测试网#iG+W"O#dub· setMoney51Testing软件测试网Aw[$CjR\f?· setTotalP^D s1M0· Dealer(构造函数)l9KO"J'H,Ir5P"s0取值方法51Testing软件测试网G$c"ds0pQ· getBetzraN}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$[· handleTurn8}+h9j` h0· processTurn51Testing软件测试网.gH0c"_+^7OXp· getPlayerStatus51Testing软件测试网2_2lQj)k&b[)O|· newShoe,ae.q&n-Xo&D^/oM0· dealCardY
\5o!QT9e_0对于某些方法进行测试发现,不能直接调用该方法,一定要先做一些准备工作,也就是说方法有一个执行顺序。例如:使用deal方法前一定要使用Dealer(构造函数)、AssignPlayerHand、setDealerHand这三个方法,否则无法完成deal方法的测试。这就引起了另一个问题,在进行白盒测试时一定要先了解类方法的使用规则,而规则一定要在设计文档中有说明,否则会为白盒测试带来很大的难度。51Testing软件测试网`-MNG
C;g P由于方法使用规则的限制,在一个测试方法中可以完成多个类方法的测试。例:deal方法是为每一位玩家发两张牌,在这之前必须做的事情是使用Dealer(构造函数)确认牌的数量和当少于多少张牌时进行洗牌,AssignPlayerHand加入玩家,setDealerHand加入庄家,然后调用deal方法发牌,在deal方法中又调用了newShoe方法(加入牌和洗牌)和dealCard方法(发牌)。在一个deal方法的测试用例中就完成了Dealer、AssignPlayerHand、setDealerHand、newShoe、dealCard五个方法的测试。l)L}Q$|0测试Deal方法Deal方法无返回值,应该如何判断测试是否正确呢?Deal方法为每个玩家发两张牌,这个功能可以使用StandardBlackJackHand类的getCards方法进行测试,因为在AssignPlayerHand、setDealerHand方法中输入参数是BlackJackHand。发完牌后需要确认剩余的纸牌数量,这里有一点困难,theDeck是存放牌的变量,但它是一个私有变量,并且没有方法可以得到这个变量,最简单的方法是将私有变量改为保护变量,暂时没有想到更好的方法。咨询了开发人员后得知可以得到私有变量,但实现比较复杂,考虑到测试代码尽可能简洁的原则,暂时不采用这一方法。在本次测试中将theDeck改为为保护变量(因为还一些测试需要对theDeck的纸牌面值进行修改)51Testing软件测试网'vHrziZDeal方法的测试思路是判断每个玩家手里牌的数量是否正确,和剩余纸牌的数量是否正确。代码示例如下:A^2x1c:Cz0 public void testDeal1() throws Throwable {51Testing软件测试网!XN S T$M+f+\ StandardDealerHand Dhand=new StandardDealerHand("Dealer");51Testing软件测试网5d4K)F2P3b Io kLk(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'?
{aRyMSu)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 }@"WgvrZ0测试getPlayerStatus方法getPlayerStatus方法实现游戏结果的计算,在测试这一方法中需要使用Dealer(构造函数、setDealerHand、assignPlayerHand、BlackJackHand.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 );7hsd2uv/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"lwm 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();l0kz%X0`D0 */51Testing软件测试网Xo6siV
l;BiC&r Card card;0d:kZ P?+S0k0 card=new Card(Suit.DIAMOND ,'3');51Testing软件测试网
P R{kw-B2H:~Pp play.addCard(card);//为每个玩家加入牌51Testing软件测试网%xd.\2UHh2l4M 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
ow0 }"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"B2K H)\S,\ Dealer THIS=new Dealer(1,20);51Testing软件测试网9MGa'U T^"lWwR THIS.setDealerHand(Dhand);51Testing软件测试网;kM F zuhaG THIS.assignPlayerHand( play);51Testing软件测试网+yM#G)bxk(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&fF!MdH J
K$kE^0 card=(Card)VTemp.elementAt(0);51Testing软件测试网"H ^3C8}.s
eyo+] card.setSuit(Suit.HEART );51Testing软件测试网)\H [(S.Vf_
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 ]*TEI0O$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);,U4OcZf/n0 }51Testing软件测试网*^Ul(H@!]io(J"}a;L完成初步的测试代码后,进行覆盖率分析,对于未覆盖的代码补充测试用例。51Testing软件测试网g'C `Y}TqG/ht剩余未测试的类,全部用来实现界面的功能,这里暂时未找合理的白盒测试方法,并且有些功能白盒测试无法实现,如验证纸牌的图片错误、界面的文字是否正确、按钮的位置、按钮的功能,对于白盒测试要么无法实现,或者测试成本过高。WfP8dM?ctQr0思考问题:· 将私有变量或方法修改成公共或保护的方法是否正确,有没有更好的方法?是否可以请求开发人员在代码中直接修改(修改设计)?
相关阅读:
- 单元测试 (Spark.lee, 2006-12-13)
- 单元可测试性[转] (luoyear, 2006-12-27)
- 《实用单元测试技术》介绍 (dellfox, 2007-1-10)
- 1. 从哪里开始 (Spark.lee, 2007-2-25)
- 2. 第一次尝试 (Spark.lee, 2007-2-25)
- 3. 增加一个测试 (Spark.lee, 2007-2-25)
- 4. 一次简单的集成测试 (Spark.lee, 2007-2-25)
- 5. 集成测试 (Spark.lee, 2007-2-25)
- 6. StandardBlackJackHand类测试 (Spark.lee, 2007-2-25)
- 7. StandardDealerHand类测试 (Spark.lee, 2007-2-25)
收藏
举报
TAG:
单元测试