BDD com Rails 3
     Thiago Pradi
Thiago Pradi

• thiago.pradi@gmail.com
• twitter.com/thiagopradi
• github.com/tchandy
• www.thiagopradi.net
Thiago Pradi

• Desenvolvedor Ruby por 3 anos
• Atualmente trabalha pela Taoweb
• Bacharelando em ciência da computação
  pela FURB
• Participou do Ruby Summer of Code
Rails?!




          http://www.designshak.com/blog/ruby-on-rails
Ruby on Rails

• Full Stack Web Framework
• Escrito em Ruby
• Open Source
• Usado com sucesso por inúmeras
  empresas
Rails 3

• Modular
• Refinado por mais de 1 ano
• Bundler
• Mais rápido que o Rails 2
• Entre outras melhorias..
Vantagens do Rails

• Produtividade
• Código Limpo e Simples
• Divertido ;-)
Porém..


• Como retirar valor para o cliente de um
  um ambiente caótico?
• Com código realmente sólido?!


                                  http://www.flickr.com/photos/tracy_olson/61056391/
Métodologias
Orientadas a teste são
  a solução! (ou ao
 menos, parte dela)


             http://www.flickr.com/photos/cayusa/981372736/sizes/m/in/photostream/
TDD
• Test Driven Development
• Originada no Smalltalk
• Idealizado por Kent Beck
• Três Passos: Teste Falhando, Código para o
  teste passar, Melhorar o código.
• Foco no problema a ser resolvido
BDD

• Behavior Driven Development
• Idealizado por Dan North
• Inspirado no TDD
• Nome dos testes mais “legíveis”
• Foco no Comportamento
BDD e Requisitos

• Requisitos são comportamentos
• Linguagem Universal para testes de
  aceitação
• Conceito de estórias
Estórias

• As a ...
• I Want to ...
• so that ..
Cenários

• Given ...
• When ...
• Then ...
#language: pt
Funcionalidade: Postar novas mensagem
  Como um usuário logado no urubu
  Eu quero postar novas mensagens
  Para compartilhar minhas mensagens com meus amigos

Cenário: Postando uma nova mensagem
  Dado que eu estou logado como o usuário thiago
  Quando eu vou para a página principal
  E sigo nova mensagem
  E preencho "Mensagem" com "Olá, Usuários do Urubu!"
  E pressiono "Postar"
  Então eu devo ver "Mensagem postada com sucesso!"
BDD On Rails

• Difundido na comunidade e nas empresas
• Várias ferramentas
• Flexibilidade e facilidade com as
  ferramentas
Ferramentas


• RSpec
• Cucumber
RSpec

• Behavior Driven Development for Ruby
• Foco no comportamento do código
• DSL Simples
• Sintaxe Limpa
Exemplo
require 'spec_helper'

describe User do
  it "não deve permitir usuários com o mesmo login" do
    User.create!(:login => "thiago")
    u = User.new(:login => "thiago")
    u.save.should be_false
  end
end
Idéia


                 • Projeto “Urubu”
                 • Um twitter brasileiro.


http://www.flickr.com/photos/fcmont/5070170400/sizes/m/in/photostream/
require 'spec_helper'

describe User do
  describe ".public_messages" do
    it "deve retornar todas as mensagens públicas do
usuário" do
      user = User.create!(:login => "thiago")
      men1 = user.messages.create!(:body =>
"Pública", :private => false)
      men2 = user.messages.create!(:body =>
"Privada", :private => true)
      user.public_messages.should == [men1]
    end
  end
end
Falha
Código
class User < ActiveRecord::Base
  validates_uniqueness_of :login

  has_many :messages

  def public_messages
    self.messages.select { |m| !m.private? }
  end
end
Testes passando!
Refatore-me
class User < ActiveRecord::Base
  validates_uniqueness_of :login

  has_many :messages

  def public_messages
    self.messages.public_messages
  end
end
Refatore-me
class Message < ActiveRecord::Base
  belongs_to :user

  scope :public_messages, :conditions => {:private =>
false}
end
Teste passando!
Cucumber

• Definição de estórias no estilo BDD
• Mesma linguagem entre desenvolvedores e
  clientes
• Foco nas partes mais importantes para o
  cliente
Idéia


• Um usuário precisa postar mensagens!
#language: pt
Funcionalidade: Postar novas mensagem
  Como um usuário logado no urubu
  Eu quero postar novas mensagens
  Para compartilhar minhas mensagens com meus amigos

Cenário: Postando uma nova mensagem
  Dado que eu estou logado como o usuário thiago
  Quando eu vou para a página principal
  E sigo nova mensagem
  E preencho "Mensagem" com "Olá, Usuários do Urubu!"
  E pressiono "Postar"
  Então eu devo ver "Mensagem postada com sucesso!"
Implementação


• Cada linha do cenário equivele a uma
  “step”
• Pode ser compartilhada entre cenários
Exemplo

When /^vou para "(.+)"$/ do |url|
  visit url
end
Porém..

• Como testar realmente em um browser?
• Muitas vezes o javascript interfere no
  comportamento do sistema
• Capybara resolvendo o problema
Capybara


• Apenas mudando uma tag, conseguimos o
  teste rodando em um browser!
Conclusões


• Foco na melhoria de código
• Foco em resolver o problema do cliente
Experiências


• Trabalhos realizados
• Ruby Summer of Code - Projeto Octopus.
Algumas dicas finais

• TDD e BDD não são silver bullets
• Porém, siga o principio TAFT, “Test all the
  Fucking Time”.
• Sinta você mesmo as melhorias ao usar
  TDD/BDD
Links para as
        ferramentas
• www.cukes.info
• www.rspec.info
• http://jbehave.org/ - BDD com Java
• http://everzet.com/Behat/ - BDD com PHP
Obrigado!

Bdd rails 3

  • 1.
    BDD com Rails3 Thiago Pradi
  • 2.
    Thiago Pradi • thiago.pradi@gmail.com •twitter.com/thiagopradi • github.com/tchandy • www.thiagopradi.net
  • 3.
    Thiago Pradi • DesenvolvedorRuby por 3 anos • Atualmente trabalha pela Taoweb • Bacharelando em ciência da computação pela FURB • Participou do Ruby Summer of Code
  • 4.
    Rails?! http://www.designshak.com/blog/ruby-on-rails
  • 5.
    Ruby on Rails •Full Stack Web Framework • Escrito em Ruby • Open Source • Usado com sucesso por inúmeras empresas
  • 6.
    Rails 3 • Modular •Refinado por mais de 1 ano • Bundler • Mais rápido que o Rails 2 • Entre outras melhorias..
  • 7.
    Vantagens do Rails •Produtividade • Código Limpo e Simples • Divertido ;-)
  • 8.
    Porém.. • Como retirarvalor para o cliente de um um ambiente caótico? • Com código realmente sólido?! http://www.flickr.com/photos/tracy_olson/61056391/
  • 9.
    Métodologias Orientadas a testesão a solução! (ou ao menos, parte dela) http://www.flickr.com/photos/cayusa/981372736/sizes/m/in/photostream/
  • 10.
    TDD • Test DrivenDevelopment • Originada no Smalltalk • Idealizado por Kent Beck • Três Passos: Teste Falhando, Código para o teste passar, Melhorar o código. • Foco no problema a ser resolvido
  • 11.
    BDD • Behavior DrivenDevelopment • Idealizado por Dan North • Inspirado no TDD • Nome dos testes mais “legíveis” • Foco no Comportamento
  • 12.
    BDD e Requisitos •Requisitos são comportamentos • Linguagem Universal para testes de aceitação • Conceito de estórias
  • 13.
    Estórias • As a... • I Want to ... • so that ..
  • 14.
    Cenários • Given ... •When ... • Then ...
  • 15.
    #language: pt Funcionalidade: Postarnovas mensagem Como um usuário logado no urubu Eu quero postar novas mensagens Para compartilhar minhas mensagens com meus amigos Cenário: Postando uma nova mensagem Dado que eu estou logado como o usuário thiago Quando eu vou para a página principal E sigo nova mensagem E preencho "Mensagem" com "Olá, Usuários do Urubu!" E pressiono "Postar" Então eu devo ver "Mensagem postada com sucesso!"
  • 16.
    BDD On Rails •Difundido na comunidade e nas empresas • Várias ferramentas • Flexibilidade e facilidade com as ferramentas
  • 17.
  • 18.
    RSpec • Behavior DrivenDevelopment for Ruby • Foco no comportamento do código • DSL Simples • Sintaxe Limpa
  • 19.
    Exemplo require 'spec_helper' describe Userdo it "não deve permitir usuários com o mesmo login" do User.create!(:login => "thiago") u = User.new(:login => "thiago") u.save.should be_false end end
  • 20.
    Idéia • Projeto “Urubu” • Um twitter brasileiro. http://www.flickr.com/photos/fcmont/5070170400/sizes/m/in/photostream/
  • 21.
    require 'spec_helper' describe Userdo describe ".public_messages" do it "deve retornar todas as mensagens públicas do usuário" do user = User.create!(:login => "thiago") men1 = user.messages.create!(:body => "Pública", :private => false) men2 = user.messages.create!(:body => "Privada", :private => true) user.public_messages.should == [men1] end end end
  • 22.
  • 23.
    Código class User <ActiveRecord::Base validates_uniqueness_of :login has_many :messages def public_messages self.messages.select { |m| !m.private? } end end
  • 24.
  • 25.
    Refatore-me class User <ActiveRecord::Base validates_uniqueness_of :login has_many :messages def public_messages self.messages.public_messages end end
  • 26.
    Refatore-me class Message <ActiveRecord::Base belongs_to :user scope :public_messages, :conditions => {:private => false} end
  • 27.
  • 28.
    Cucumber • Definição deestórias no estilo BDD • Mesma linguagem entre desenvolvedores e clientes • Foco nas partes mais importantes para o cliente
  • 29.
    Idéia • Um usuárioprecisa postar mensagens!
  • 30.
    #language: pt Funcionalidade: Postarnovas mensagem Como um usuário logado no urubu Eu quero postar novas mensagens Para compartilhar minhas mensagens com meus amigos Cenário: Postando uma nova mensagem Dado que eu estou logado como o usuário thiago Quando eu vou para a página principal E sigo nova mensagem E preencho "Mensagem" com "Olá, Usuários do Urubu!" E pressiono "Postar" Então eu devo ver "Mensagem postada com sucesso!"
  • 31.
    Implementação • Cada linhado cenário equivele a uma “step” • Pode ser compartilhada entre cenários
  • 32.
    Exemplo When /^vou para"(.+)"$/ do |url| visit url end
  • 35.
    Porém.. • Como testarrealmente em um browser? • Muitas vezes o javascript interfere no comportamento do sistema • Capybara resolvendo o problema
  • 36.
    Capybara • Apenas mudandouma tag, conseguimos o teste rodando em um browser!
  • 38.
    Conclusões • Foco namelhoria de código • Foco em resolver o problema do cliente
  • 39.
    Experiências • Trabalhos realizados •Ruby Summer of Code - Projeto Octopus.
  • 40.
    Algumas dicas finais •TDD e BDD não são silver bullets • Porém, siga o principio TAFT, “Test all the Fucking Time”. • Sinta você mesmo as melhorias ao usar TDD/BDD
  • 41.
    Links para as ferramentas • www.cukes.info • www.rspec.info • http://jbehave.org/ - BDD com Java • http://everzet.com/Behat/ - BDD com PHP
  • 42.