Você está na página 1de 25

Dito TechTalk: Behavior

Driven Development (BDD)


rSpec
Dito – Idéias & Soluções

Novembro 2008
Behavior Driven Development

Dan North’s response to TDD (Test-Driven Development)

Testar primeiro! Por que?


para programar com o teste em mente

BDD = TDD com vocabulário focado no comportamento


(behavior) e não testes.
Behavior Driven Development com rSpec

Cada característica (feature) é uma “story”

Story
As a ... [role]

I want to ... [some action]

So that ... [business value!]


Behavior Driven Development com rSpec

Scenarios
G W T – Given, When, Then

Scenario: título

Given: [um contexto]


And: opcional
When: evento
Then: resultado

Scenario: outro variante...


GWT

Given When Then


• Setup pre requisitos • Ações feitas pelo ator • Define o resultado das
• Setup estado suas ações

Exemplo: Exemplo: Exemplo:

• Given a user called Dave • When I click the ‘profile’ • Then I should see my
link profile page
• And Dave is logged in
• When I enter my new • And it should list how
password and confirmation many items I have bought

• And click the ‘Change my


password’ button
Processo

• Escrever uma “Story”

• Escrever especificações para os controllers

• Escrever os controllers

• Escrever especificações para os models

• Escrever os models

• Executar a “Story”
Instalando rSpec
Para testar apenas código Ruby sem aplicação Rails basta executar o comando:
• gem install rspec

rSpec on Rails :
Versão 1.1.4 o rSpec utiliza o Github, vamos apenas clonar seu repositório com os comandos:

cd vendor/plugins
git clone git://github.com/dchelimsky/rspec.git
cd rspec
git checkout 1.1.4
cd ..
git clone git://github.com/dchelimsky/rspec-rails.git
cd rspec-rails
git checkout 1.1.4
cd ../../../
rSpec on Rails

Para criar um diretório (spec) com


todos os arquivos necessários
para o Rails utilizar o rSpec basta
executar o generate:

• script/generate rspec
Aplicação
Aplicando rSpec no projeto pilates

Requisitos básicos:
• Uma pessoa podetervários lancamentos

• Uma pessoa deveterum nome, login, email e uma senha

Temos então:
• Um “usuário” com um “name” relacionado avários “tasks”
Modelo Usuário
Para criar o modelo usuário temos generators do próprio rSpec.
script/generate rspec_model Usuario name:string login:string email:string crypted_password:string
rake db:migrate

Junto com este model foi gerado um arquivo de teste para o


modelo, no dir: “spec/models/usuario_spec.rb”

É neste arquivo que vamos escrever as especificações.

Uma especificação pode ser escrita usando o método it, que


deve estar associado a um outro método, describe. Com eles
podemos validar um contexto.
Especificações do Usuário

O método describe Usuario usa fixtures,


com isso temos que adicionar alguns
itens ao arquivo: “spec/fixtures/usuarios.yml”
Nosso método it usa lambda que
especifica que o usuario existe, é
invalido sem um name, um login, um
email, e um crypted_password.
Também especifica que deve possuir
diversos taks.

Em um método privado create_usuario,


fazemos exatamente isso, criamos um
usuario com um name.
Fixtures
spec/fixtures/usuarios.yml
Rodando os Testes
-rakespec
Models
app/models/usuario.rb

• Adicionamos as validações precisas no modelo usuario

• Adicionamos também um relacionamento com o modelo


task que ainda não existe
Modelo Task
Vamos criar o modelo Task com rspec model
script/generate rspec_model Task titulo:string usuario:references
rake db:migrate

Requesitos do modelo Task:


• UmTaskpertenceaumUsuario
• UmTasktemdeveterumtitulo, usuario,
Especificações do Task

As especificações do task são parecidas


com a do usuario. Como por exemplo o
método describe também usa fixtures,
com isso temos que adicionar alguns
itens ao arquivo: “spec/fixtures/tasks.yml”
Estamos especificando que o task existe,
é invalido sem um titulo.
Também especifica que um task pertence
a um usuario.

Em um método privado create_task,


criamos um task com um titulo, e
relacionado a um usuario.
Fixtures
spec/fixtures/tasks.yml
Models
app/models/task.rb

• Adicionamos as validações precisas no modelo task

• Adicionamos também um relacionamento com o modelo


usuario.
Associações
Task deve estar associado a um usuario
script/generate rspec_model Task titulo:string usuario:references

Temos no banco:
Rodando os Testes

- rake spec
DEPRECATION WARNING
Proporção de Testes em relação ao código
- rake stats

• Temos 77 linhas de testes para 493 linhas de códigos, uma


proporção muito pobre de 1:0,2

• No site brasigo.com.br trabalham com uma proporção na faixa


de 3 linhas de teste para cada linha de código, ou seja 1:3
Test::Unit para rSpec

class DogTest describe Dog

def test_bark it “should bark”

assert_algo object.should be_algo

def setup before (:each) { }

def teardown after (:each) { }


Vantagens do rSpec em relação ao Test::Unit

• Linguagem de implementação das especificações é


mais natural e flui melhor.

• O relatório gerado descreve os exemplos criados com


mais clareza.

• A divisão de arquivos e diretório é muito parecida com


a divisão natural do Rails entre controllers, models,
views, e helpers.

• Existe uma integração com o AutoTest assim como o


Test::Unit.
Referências
• http://dannorth.net/introducing-bdd
• http://dannorth.net/whats-in-a-story
• http://blog.improveit.com.br/articles/2008/01/23/rspec-e-textmate

http://www.benmabey.com/2008/05/10/slides-and-code-from-my-bddrspec-presentation/

• http://www.slideshare.net/rahoulb/telling-stories-with-rspec-presentation
• http://blog.davidchelimsky.net/2008/6/16/slides-

http://www.joesniff.co.uk/ruby/telling-a-good-story-rspec-stories-from-the-trenches.html
• http://kpumuk.info/category/ruby-on-rails/

http://simplesideias.com.br/usando-o-rspec-para-testar-sua-aplicacao-rails-modelos/#com
• http://rspec.info/documentation/test_unit.html
• http://www.nabble.com/alias-:calling-:lambda-td12789662.html

Você também pode gostar