Swift BowlingGame TDD单元测试

让我们在本教程中说明“测试驱动开发”。著名的TDD示例之一是保龄球游戏,它的游戏规则涉及真正需要单元测试的一对逻辑。

保龄球游戏有以下四个规则,我们的单元测试就是基于此。

  1. 游戏包括十帧,每位玩家都有两次机会在每一帧中敲钉子。
  2. 备用:如果玩家在同一帧中两次尝试敲10个针,此当前帧将获得奖励分数。 奖金是下一次玩家掷出的敲击针的数量,例如,第三帧获得奖金5,导致第三帧获得罢工奖金,我在下面做一些注释,红色注释表示备用奖金。
  3. 打击:如果玩家在第一次尝试中击中10个针脚,当前帧将获得打击加成,这将增加接下来两轮的得分,例如,第五帧将获得打击加成,橙色以下表示打击加成。
  4. 在第十帧中滚动“备用”或“罢工”的玩家将获得额外的加值,以再次滚动,但在第十帧中滚动不超过三倍,因为蓝色六分以下是此奖金。

让我们开始编码,启动Xcode创建一个新项目,别忘了单击“ Include Unit Tests”复选框。

步骤0:创建一个类游戏,以处理保龄球游戏逻辑。

打开TDD_BowlingGameTests.swift,此文件是我们编写单元测试的地方,每个函数必须以“ test”为标题才能运行单元测试。 在TDD中,如果结果失败,则必须编写单元测试并在开发之前对其进行测试,然后开始修改功能,直到通过单元测试。

步骤1:一名玩家掷出20次却没有敲门,预期得分为零。

显然,保龄球游戏必须具有函数“ roll”和“ score”,才能掷出保龄球并计算得分,因此我们编写了单元测试,第一个测试条件是玩家掷出20次并不敲任何东西,预期分数将为零。

  //第29行:如果game.score()== 0为true,则通过单元测试。 
XCTAssertEqual(game.score(),0)

当然,结果失败了,让我们修改Game中的功能。 让score()返回0怎么样。

好了,首先进行单元测试是为了测试玩家掷出20个球而不敲任何针脚的情况,经过修改的功能通过单元测试后,我们应该对其进行git commit。

  git commit -am“传递20个球而不会敲任何针” 

步骤2:一名玩家掷出20个球,每滚动2个针,预期得分为40。

通过第一个测试条件后,我们可以将另一个条件写为第32〜38行,该条件将是敲2个引脚,每次滚动然后运行测试。

如您所见,我们失败了,现在我们应该修改函数,添加一个属性来存储得分会有所帮助。

好的,我们的Game类可以在修改后通过第二个条件,同时通过第一个条件,我们应该对其进行git commit。

这是编写单元测试的好处,无论您进行了什么修改,都可以对其进行测试,并确保立即没有错。

  git commit -am“传递敲击每个滚动2个针” 

第三步:编写干净的代码

正如您在测试用例中看到的那样,第25、33行创建了游戏副本的实例,第26、34行中的for-in循环也被复制,这是不好的编码风格,让我们对其进行修改并再次运行测试。

修改代码使其更整洁,并且单元测试无误通过后,我们应该对其进行git commit。

  git commit -am“优化代码” 

步骤4:玩家获得备用奖金

让我们测试一个玩家掷出1,4,5,5,6,0…的分数必须如下计算:第1帧(1 + 4),第2帧(5 + 5 + 6),第3帧(6 +0),因此总分必须为27,才能在第二帧获得备用奖金。

显然,我们遇到了失败,我们的游戏逻辑未处理备用条件,让我们对其进行了修改,因为我们需要考虑备用条件,因此由于总得分不再起作用,因此使用商店属性totalScore来计算总引脚数,我们需要的是数组以重新编码玩家滚动的每个掷骰,并处理备用条件,因此我们如下修改了Game。

大! 我们通过了备用条件的单元测试,请等待一秒钟,我们应该测试更多有关备用条件的条件,例如,掷20个球并用5个针敲击每个球,在这种情况下,玩家可以掷出一个额外的球,第21个球将不算作第10帧的备用奖金,其结果必须为150。

结果是失败,原因是我们的CalculatorSpare函数计算了第10帧的Spare红利5个引脚不正确,不应将第21卷的备用红利计算为仅仅是红利,因此我们如下修改了我们的函数。

现在我们可以对该修改进行git commit了。

  git commit -am“通过备用条件” 

步骤5:玩家获得罢工奖金

如果玩家掷出10、4、5、4,总分必须计算为第1帧(10+ 4+ 5),第2帧(4 + 5),第3帧(4 + 0),等于至32。

我们失败了,因为我们的Game类尚未处理Strike条件,请按如下所示进行修改,然后运行测试。

我们通过了测试。 一个完美的游戏,玩家每次用10个大头针击打12个球,结果必须是300分。

大!!! 我们也通过了测试,让我们做一个最终测试,像上面的得分表那样的真实游戏怎么样。

好的,还通过了,我们应该为此做一个git commit。

  git commit -am“通过罢工条件” 

最后,您的git commit将如下所示。

  87a31be(HEAD-> master,origin / master)通过了罢工条件 
d8b664e通过备用状态
89a0849优化代码
77dffbd pass敲2个滚针
6dbb91c传球20球而没有敲任何别针
bf71b4d添加game.swift
9a172b5 git初始化

感谢您的阅读,TDD是一种非常好的开发方式,尤其是在团队合作中,因为在维护其他工程师的代码甚至您自己的代码时,TDD的单元测试是强大的支持,因此,单元测试的代码覆盖率越多,您拧错螺丝的可能性就越小项目。

演示代码可在GitHub上获得:

https://github.com/bbkaf/TDD-BowlingGame