a mensagem inicial do jogo, que está salva na variável text.
Especificações de cucumber devem testar o sistema utilizando a mesma interface
que o usuário utilizaria. O nosso jogo será um jogo de console, mas por enquanto
vamos manter o teste bem simples nesse hello world, sem uma interação real do
teste com o console. Iremos fazer esse tipo de teste de modo completo e detalhado a
partir do capítulo 5.
Com os step definitions prontos, vamos rodar o Cucumber novamente:
$ cucumber
(...)
uninitialized constant Game (NameError)
18
Casa do Código
Capítulo 2. Primeiros passos com RSpec e Cucumber
(...)
1 scenario (1 failed)
2 steps (1 failed, 1 skipped)
Perceba que o teste quebrou e que nos deu uma mensagem de erro. A mensagem
de erro do teste é o feedback que devemos usar para o próximo passo de implemen-
tação. Nesse caso a mensagem está dizendo que a classe Game ainda não foi definida.
O correto nesse momento agora seria parar um pouco os testes de Cucumber e
começar um ciclo completo de red - green - refactor com RSpec para a definição da
classe Game, mas não vamos fazer isso agora, para manter o exemplo simples. O
ciclo inteiro de BDD com Cucumber e RSpec será feito extensivamente a partir do
capítulo 5.
Por enquanto, vamos apenas definir a classe
Game dentro do arquivo
features/step_definitions/game_steps.rb mesmo. Adicione a definição
dessa classe no final desse arquivo:
# encoding: UTF-8
Quando /^começo um novo jogo$/ do
@game = Game.new
@game.start
end
Então /^vejo a seguinte mensagem na tela:$/ do |text|
expect(@game.output).to include(text)
end
class Game
end
Ao rodar o Cucumber novamente, vemos uma mensagem de erro diferente:
$ cucumber
(...)
undefined method `start' for #<Game:0x007fde41b5a938> (NoMethodError)
(...)
19
2.2. Olá Cucumber
Casa do Código
Dessa vez o teste quebrou porque o método Game#start não foi definido ainda.
Vamos implementar esse método, que vai salvar dentro do output do jogo a men-
sagem inicial. Adicione esse método à classe Game do seguinte modo:
# encoding: UTF-8
# (...)
class Game
def initialize
@output = []
end
def start
@output << "Bem vindo ao jogo da forca!"
end
end
Ao rodarmos o Cucumber, podemos ver que a mensagem de erro mudou:
$ cucumber
(...)
undefined method òutput' for #<Game:0x007fbcdb268410> (NoMethodError)
(...)
Pela mensagem de erro, podemos ver que falta implementar o método
Game#output, responsável por devolver o conteúdo da variável @output. Para
implementá-lo, basta adicionar um attr_reader :output na classe Game:
# encoding: UTF-8
# (...)
class Game
attr_reader :output
# (...)
end
Ao rodar o Cucumber agora, vemos que agora ele está no verde!
20
Casa do Código
Capítulo 2. Primeiros passos com RSpec e Cucumber
$ cucumber
(...)
1 scenario (1 passed)
2 steps (2 passed)
Figura 2.6: Spec com Cucumber no verde
Pronto, você acabou de escrever sua primeira especificação com Cucumber! A
ideia era mostrar de modo rápido como é a cara do RSpec e do Cucumber, para você
ter uma ideia do que vem pela frente.
Repare que durante os testes, o tempo inteiro nós descrevemos o comportamento
das aplicações. Esse foco no comportamento é um grande diferencial, que quando
bem usado, pode dar uma nova vida aos nossos testes.
2.3
O que é BDD?
O termo BDD (behavior-driven development) foi cunhado por Dan North por volta
de 2003 [11]. Dan North estava tendo dificuldades em ensinar TDD para seus alunos,
pois eles ficavam com dúvidas sobre por onde começar a testar, o que testar, como
nomear seus testes etc.
Ele percebeu que parte do problema em entender TDD era a palavra teste em
si, pois ela confundia o desenvolvedor sobre a real motivação por trás de TDD. A
21
2.3. O que é BDD?
Casa do Código
principal motivação do TDD não é testar o seu software, e sim especificá-lo com
exemplos de como usar o seu código e deixar isso guiar o design do mesmo.
Ao fazer TDD, o desenvolvedor está especificando o comportamento do seu soft-
ware e definindo seu design. A suíte de testes automatizados gerada através do TDD
é apenas uma boa consequência do processo. Baseado nessas ideias, Dan North
sugeriu mudar a palavra de teste para comportamento (behavior). Para concretizar
sua ideia, Dan North escreveu o JBehave, uma biblioteca de BDD em Java.
No mundo de Ruby, a ideia de BDD começou a se concretizar quando Dan North
portou o JBehave para Ruby com o nome de RBehave. Em 2005, inspirado pela
ideia de BDD, Steven Baker escreveu a primeira versão do RSpec. Tempos depois o
RBehave foi integrado ao RSpec com o nome de Story Runner. Finalmente, em 2008,
Aslak Hellesøy reescreveu o Story Runner e o chamou de Cucumber.
Apesar do BDD ter nascido apenas como um modo de rever a nomenclatura do
TDD e o modo como se enxerga essa prática, hoje BDD é mais do que isso, ele agora
é uma abordagem de desenvolvimento de software [3] que propõe que você desen-
volva seu software especificando as várias camadas de comportamento com testes