Ao começar o jogo, é mostrada a mensagem inicial para o jogador.
Quando começo um novo jogo
Então vejo a seguinte mensagem na tela:
"""
Bem vindo ao jogo da forca!
"""
Esse é um exemplo real de especificação de software com Cucumber. A spec
tem o título da funcionalidade, uma narrativa explicando o contexto e por fim um
cenário de teste, mostrando um exemplo de como o software irá funcionar do ponto
de vista do usuário final.
Cenários em português
Diferentemente de quando escrevemos as especificações com o RS-
pec, onde misturávamos código e texto, com o Cucumber escrevemos
apenas texto para descrever os cenários. Isso remove qualquer ruído que
a linguagem de programação pudesse causar na descrição e dessa forma,
faz com que escrever em linguagem natural seja algo bem simples e di-
reto.
Durante o livro, para os cenários em cucumber, usaremos sempre o
português.
Perceba como a especificação é bem simples e clara. O cliente então lê a spec e
confirma que o entendimento está correto. Você pode agora ir em frente e desen-
volver essa funcionalidade. Uma das vantagens de utilizar o Cucumber é que você
14
Casa do Código
Capítulo 2. Primeiros passos com RSpec e Cucumber
pode usar essa mesma documentação para criar um cenário de teste de aceitação
automatizado. Vamos fazer isso.
Antes de tudo, precisamos instalar o Cucumber. Como ele também é distribuído
como uma gem, basta executar no seu console:
$ gem install cucumber
Agora crie um novo diretório chamado hello-cucumber e dentro dele crie
um outro diretório chamado features. Dentro desse diretório features, crie
um arquivo chamado features/comecar_jogo.feature e salve dentro dele o
conteúdo da especificação que fizemos há pouco. Agora você já pode rodar o Cu-
cumber.
Para fazer isso, dentro do diretório hello-cucumber, execute o comando
cucumber no seu console:
$ cucumber
Isso fará com que os cenários sejam executados e a seguinte saída apareça como
resultado:
# language: pt
Funcionalidade: Começar jogo
Para poder passar o tempo
Como jogador
Quero poder começar um novo jogo
Cenário: Começo de novo jogo com sucesso
Ao começar o jogo, é mostrada a mensagem inicial para o jogador.
Quando começo um novo jogo
Então vejo a seguinte mensagem na tela:
"""
Bem vindo ao jogo da forca!
"""
1 scenario (1 undefined)
2 steps (2 undefined)
0m0.002s
You can implement step definitions for undefined steps with these
snippets:
15
2.2. Olá Cucumber
Casa do Código
Quando /^começo um novo jogo$/ do
pending # express the regexp above with the code you wish you had
end
Então /^vejo a seguinte mensagem na tela:$/ do |string|
pending # express the regexp above with the code you wish you had
end
Vamos analisar um pouco a saída do Cucumber. Logo depois do texto da espe-
cificação em si, vemos o seguinte:
1 scenario (1 undefined)
2 steps (2 undefined)
Perceba que ele diz que temos um cenário que está indefinido e que existem dois
steps também indefinidos. Em specs de Cucumber, cada caso de teste é um cenário e
cada cenário é composto por vários steps.
No nosso caso, temos o cenário "Começo de novo jogo com sucesso que contém os steps "Quando começo um novo jogo e
"Então vejo a seguinte mensagem na tela: (...).
16
Casa do Código
Capítulo 2. Primeiros passos com RSpec e Cucumber
Figura 2.5: Estrutura de uma especificação com Cucumber
Para utilizar essa documentação como um teste automatizado, temos que definir
cada um desses steps, implementando o que o Cucumber chama de step definitions.
Basicamente é dizer ao Cucumber o que ele precisa fazer naquele passo. O legal é
que se o step ainda está indefinido, o próprio Cucumber já nos dá um snippet de
step definition, como pudemos ver no final da saída:
$ cucumber
(...)
You can implement step definitions for undefined steps with these
snippets:
Quando /^começo um novo jogo$/ do
pending # express the regexp above with the code you wish you had
end
Então /^vejo a seguinte mensagem na tela:$/ do |string|
17
2.2. Olá Cucumber
Casa do Código
pending # express the regexp above with the code you wish you had
end
Vamos agora automatizar nossa especificação. Primeiro crie um diretório dentro
do features e vamos chamá-lo de step_definitions. Dentro desse diretório
crie um arquivo chamado game_steps.rb. Nesse arquivo vamos colocar os step
definitions dos dois que temos na nossa spec. Implemente esses steps do seguinte
modo nesse 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
O que fizemos foi implementar os step definitions, definindo quais partes da API
do nosso software cada step definition vai utilizar.
Para o step de começar um novo jogo, imaginamos que poderíamos ter um
objeto
@game e que para começar um novo jogo bastaria chamar o método
game.start.
No segundo step definition, estamos verificando se o output do @game contém