about 1 year ago

这个题目的目的在于练习我们的自动化测试能力,让测试引导API设计

首先我们得清楚保龄球规则,介绍文章:保龄球规则,简单讲:全中可得3倍的高分,补中可得两倍的好分,若两次投球后留下残瓶,就只能得到实际分。

看得懂下面这张保龄球记分图片,就说明你已经看懂了

在做测试的过程中,需要严格按照TDD的规则来实作,什么是TDD?

一定是先写一个不通过的单元测试,才开始实作功能
每次只新加一个单元测试,只需要刚刚好不通过即可,不要一次加多个测试情境
每次实作功能时,只需要刚刚好通过测试即可,不多也不少

题目要求:
写一个Game,有两种方法:
1、roll(prins):每次玩家掷球时都会被调用,计算被击倒的球数(针数);
2、score:游戏完成后,可以自动计算出总分。

首先安装RSpec,然后新增bowling_game.rb 和 bowling_game_spec.rb 两个页面

测试案例:

require './bowling_game'

describe "BowlingGame" do
let(:game) { game = BowlingGame.new } #let的用法比before更具可读性,可省略掉@,都是describe下的用法

def roll_many(n,pins) #如果不定义这个方法,可以直接用20.times{game.roll 0}
n.times do
game.roll(pins)
end
end

it "每一次都没打中球,分数应为零" do
roll_many(20,0)
expect(game.score).to eq(0)
end

it "每一次都打中1个球,分数应为20分" do
roll_many(20,1)
expect(game.score).to eq(20)
end

it "最开始一次补中,分数应为16分" do
game.roll(5)
game.roll(5)
game.roll(3)
roll_many(17,0)
expect(game.score).to eq(16)
end

it "最开始一次全中,分数应为24" do
game.roll(10)
game.roll(4)
game.roll(3)
roll_many(16,0) # 一次全中,相当于打了两次
expect(game.score).to eq(24)
end

it "每一次都是全中,分数应该为300分" do
roll_many(12,10)
expect(game.score).to eq(300)
end

it "每一次都是补中,分数应该为150分" do #这是五补,如果是九补就是190分,八补就是180分,以此类推
roll_many(21,5)
expect(game.score).to eq(150)
end
end

实作功能:

class BowlingGame

def initialize
@rolls = [] #初始化 @rolls 一个空数组
end

def roll(pins)
@rolls << pins #将 @rolls push 进 pins,让每一次的掷球数都附加到这个空数组末尾(此为数组方法)
end

def score
result = 0
r = 0 # 单词掷球时玩家打中的球数
10.times do #补中和全中,都必须按10次计算,因为保龄球就是为10格,都是按格记分的
if spare?(r)
result += spareScore(r)
r += 2 # 每次循环时,都是以每一格的第一次的r来计算的
elsif strike?(r)
result += strikeScore(r)
r += 1 #因为全中时,这一格就只有一次掷球,第十格除外(共三次掷球机会)
else
result += frameScore(r)
r += 2
end
end
result
end

private # 下面代码不会显示在API介面上

def spare?(r)
@rolls[r] + @rolls[r + 1] == 10 #在某一格中,第二次击球补中
end

def spareScore(r)
10 + @rolls[r + 2] #补中时的记分方法
end

def strike?(r)
@rolls[r] == 10 #在某一格中,第一次击球就全中
end

def strikeScore(r)
10 + @rolls[r + 1] + @rolls[r + 2] #全中时的记分方法
end

def frameScore(r)
@rolls[r] + @rolls[r + 1]
end
end

注明:这些代码都是被重构后的,并不是一开始就要写出这样的代码

← 资料验证 实作笔试题4 →
 
comments powered by Disqus