不要追求绝对的公平,红尘之中没有公平而言,人活一世,难得糊涂。
it is no use doing what you like, you have got to like what you do.
8. Dealer类测试
上一篇 /
下一篇 2007-02-25 10:52:33
/ 个人分类:单元测试
$Ik }BK!IGE051Testing软件测试网Gaxn}1C[第八步:Dealer类测试Dealer类中的很多方法无返回值,很多私有变量,这为测试带来一定难度,不能从返回值简单的判断测试是否成功。51Testing软件测试网sd(t\9\s:BF\为Dealer类中的方法作为一个简单的分类,大致可以分为四类方法/PS6V*D Z5N0赋值方法CP"\y)`7Z{vJ0· AssignPlayerHand51Testing软件测试网4}O`x!UfoJ· setDealerHand+BH5Q7uz4p
I2Q0· setBet4O1a&YwT6vS0· setMoneyVQ/n \L$]!qSh;Ep0· setTotal51Testing软件测试网^+d6~2v'QaC+QEhj· Dealer(构造函数),^s+poENbt`*[0取值方法51Testing软件测试网e
bHWEn6~· getBet51Testing软件测试网6GH6BR!`h.` C· getMoney.ZRum!J&}QBm0· getPlayers51Testing软件测试网0MD U;Dg· getTotal1e}#|_!y8C'e0· toString51Testing软件测试网O}5sWmo+C6Y操作方法51Testing软件测试网 p+y7ia n}Z· dealGMn#^(s:N*\#J1y0· handleTurn!}n%G*AwmQH0· processTurn\b%z'P7eD,V0· getPlayerStatus51Testing软件测试网F)i4q6ZB+My· newShoe`U
F0Rh:}~ P0· dealCard Ud ]:A{$?0对于某些方法进行测试发现,不能直接调用该方法,一定要先做一些准备工作,也就是说方法有一个执行顺序。例如:使用deal方法前一定要使用Dealer(构造函数)、AssignPlayerHand、setDealerHand这三个方法,否则无法完成deal方法的测试。这就引起了另一个问题,在进行白盒测试时一定要先了解类方法的使用规则,而规则一定要在设计文档中有说明,否则会为白盒测试带来很大的难度。51Testing软件测试网ne\M7@"v3r1?由于方法使用规则的限制,在一个测试方法中可以完成多个类方法的测试。例:deal方法是为每一位玩家发两张牌,在这之前必须做的事情是使用Dealer(构造函数)确认牌的数量和当少于多少张牌时进行洗牌,AssignPlayerHand加入玩家,setDealerHand加入庄家,然后调用deal方法发牌,在deal方法中又调用了newShoe方法(加入牌和洗牌)和dealCard方法(发牌)。在一个deal方法的测试用例中就完成了Dealer、AssignPlayerHand、setDealerHand、newShoe、dealCard五个方法的测试。;Z KYbPa@s$A{.f0测试Deal方法Deal方法无返回值,应该如何判断测试是否正确呢?Deal方法为每个玩家发两张牌,这个功能可以使用StandardBlackJackHand类的getCards方法进行测试,因为在AssignPlayerHand、setDealerHand方法中输入参数是BlackJackHand。发完牌后需要确认剩余的纸牌数量,这里有一点困难,theDeck是存放牌的变量,但它是一个私有变量,并且没有方法可以得到这个变量,最简单的方法是将私有变量改为保护变量,暂时没有想到更好的方法。咨询了开发人员后得知可以得到私有变量,但实现比较复杂,考虑到测试代码尽可能简洁的原则,暂时不采用这一方法。在本次测试中将theDeck改为为保护变量(因为还一些测试需要对theDeck的纸牌面值进行修改)~u:JP/qTd0Deal方法的测试思路是判断每个玩家手里牌的数量是否正确,和剩余纸牌的数量是否正确。代码示例如下:R,nB#h3Z0 public void testDeal1() throws Throwable {
p:sP#jq0 StandardDealerHand Dhand=new StandardDealerHand("Dealer");51Testing软件测试网*TJ0H8p^M PlayerHand play=new PlayerHand("Player"); //设置两个新玩家gkh t$l+X+n-w0 assertEquals(0,Dhand.getCards().size());//判断玩家手中牌的数量51Testing软件测试网R^6T/lj assertEquals(0,play.getCards().size() );51Testing软件测试网8N'v#rNk |!?S Dealer THIS=new Dealer(1,20);%B%[wG`k8`0 THIS.setDealerHand(Dhand);//加入玩家Kh cf8t7iE0 THIS.assignPlayerHand(play);O2]8B XC9A7KR-\P0 THIS.deal();//发牌/g7hNK kI0 assertEquals(2,Dhand.getCards().size());//判断玩家手中牌的数量51Testing软件测试网4bYn}/mt assertEquals(2,play.getCards().size());51Testing软件测试网,|Ts$h&P
v%`#i:s assertEquals(48,THIS.theDeck.remainingCards());//判断剩余牌数{r"J$Y&~j#Zc/d0 }51Testing软件测试网/z5uU
T@/|测试getPlayerStatus方法getPlayerStatus方法实现游戏结果的计算,在测试这一方法中需要使用Dealer(构造函数、setDealerHand、assignPlayerHand、BlackJackHand.addCard方法。在实现过程中发现并不需要调用Deal(发牌)方法,同样可以完成测试。如果使用Deal方法则会增加测试的复杂度。因为Deal方法为每个玩家发的牌是随机选择的,我们无法控制牌的面值,这样就无法控制测试结果,为了控制每个玩家手的牌的面值,还需要对theDeck进行修改。51Testing软件测试网(G}T7hK8x-dP测试代码示例如下:8rs\8W-]?6w
G0public void testGetPlayerStatus1() throws Throwable {"e(fP0v0gm9m0 StandardDealerHand Dhand=new StandardDealerHand("Dealer");-L0S&u/sEs+`!Q1F0 PlayerHand play=new PlayerHand("Player"); 51Testing软件测试网hz6Dv k6ih'Y Dealer THIS=new Dealer(1,20);)Gu4?z2W%J0 THIS.setDealerHand(Dhand);