Behaviour-Driven
Developement com Ruby
Técnicas, ferramentas e experiências.


Jony dos Santos Kostetzer
Agenda
Definições
Por que escrever testes?
TDD e BDD
BDD
RSpec - explicações e live coding
Cucumber - explicações e live co...
Desenvolvimento orientado
por testes

Em linhas gerais: Testar antes. Codificar depois.
“Como eu gostaria que minha aplicaç...
O Ciclo TDD
red-green-refactor



                     Red




        Refactor           Green
Vantagens

1. Testando primeiro, você sabe exatamente o que seu
   sofware precisa fazer.
2. Foco: Escrever o código mais ...
Vantagens


5. Identificar o mais cedo possível problemas de
   regressão.
6. Segurança e refactoring sem medo.
7. Satisfaç...
MANUTENABILIDADE!
Manutenabilidade?

Quão fácil é modificar o software.
Testes são fundamentais neste quesito - considerar o
futuro.
Codigo s...
Bons programadores
conseguem resolver um
problema proposto de alguma
forma.
Programadores excepcionais os
resolvem de forma sustentável.
BDD - Behaviour-Driven
Development
TDD + Novo Vocabulário + Novo ponto de vista
Ferramenta de design.
Nova abordagem: Foco...
Testes em Ruby
Diversos frameworks.
Melhor x pior: Apenas escolha o que melhor lhe convir!
  test/unit
  miniunit
  Should...
RSpec

DSL (Domain-Specific Language) para descrever
comportamento de objetos.
Expressividade
Legibilidade
Similar a estar ...
BDD - Novo vocabulário
     test/unit      rspec

                                 should /
    Asserções    Expectativas
...
Terminologias
         test/unit                      rspec
   class SomeClassTest <         describe SomeClass
     Test:...
Grupo de exemplos
(Example group)

describe Client do ... end
describe “A bank transaction” do ... end
describe Document, ...
Exemplos de código (code
examples)

it “should require a valid username” do ... end
it “should not charge a user when he h...
Expectativas (Expectations)

 “ “.should be_blank

 user.birthday.should == Date.today

 client.active?.should be_false

 ...
Integrando
example groups + code examples
Integrando
example groups + code examples
Integrando
example groups + code examples + contexts
Code examples
Matchers pré-existentes
Igualdade
  ===, ==, eql, equal
Texto
  should match(/regex/), =~
Array
  should include, length.s...
Matchers

o.should be_closed -> o.closed?.should be_true

o.should be_an_instance_of(String) -> o.instance_of?(String).sho...
Before/After
 Antes de cada exemplo:
   before(:each)
   after(:each)
 Antes de cada grupo de exemplos:
   before(:all)
  ...
Outros idiomas


lambda { #codigo }.should change(algo) - (by, from, to)
lambda { #codigo }.should raise_error
lambda { #c...
Live coding
         RSpec
http://github.com/jonysk/rsrails_rspec
Cucumber
Ferramenta para descrever comportamento a partir da
camada superior
  No Rails: das views para os models. Substit...
E por que não começar nos
models? (Inside-out)


Construir o que você precisa ao invés do que você
acha que precisa.
Desco...
Relação Cucumber e RSpec
Cucumber: descrever o comportamento da aplicação.
  “Make sure you’re writing the right code”
RSp...
Instalação
 RSpec

    gem install rspec rspec-rails

 Para utilizar com Rails:

    Dentro do projeto: script/generate rs...
Cucumber features
Título / Narrativa / Cenários
Exemplo de feature
Internacionalização!
Implementando dos passos
Cucumber + webrat
Simulação de um browser
Comandos de integração intuitivos:
  fill_in “campo”, :with => “valor”
  visit “/...
Matchers principais

 should contain(‘text’)
 should have_selector(‘#menu ul li.selected”, :content
 => “Dashboard”)
   CS...
Implementando dos passos
Live coding
      Cucumber
http://github.com/jonysk/rsrails_cucumber
Webrat + Selenium
gem install selenium-client
Habilitando Selenium no env.rb:
 Webrat.configure do |config|
   config.mode = ...
Outros tópicos


Integração continua (Integrity, CruiseControl.rb)
Ferramentas: autotest, rcov, heckle, etc
Macros: muito ...
Obrigado!
twitter: @jonysk
   jonysk.net
jony@jonysk.net
Próximos SlideShares
Carregando em…5
×

Behaviour-Driven Development com Ruby

2.315 visualizações

Publicada em

Palestra sobre BDD ministrada no RS Rails 2009.

* Os slides de "Live coding" foram alterados contendo o link para o repositório no GitHub.

Publicada em: Tecnologia
1 comentário
9 gostaram
Estatísticas
Notas
  • Buddy, Is it possible for you to make PPT for BDD in English. It will quite help for me and other's to understand.
    Thanks
    R@hul
    Email Id : rahulpatil_scs@yahoo.co.in
       Responder 
    Tem certeza que deseja  Sim  Não
    Insira sua mensagem aqui
Sem downloads
Visualizações
Visualizações totais
2.315
No SlideShare
0
A partir de incorporações
0
Número de incorporações
133
Ações
Compartilhamentos
0
Downloads
98
Comentários
1
Gostaram
9
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Behaviour-Driven Development com Ruby

  1. 1. Behaviour-Driven Developement com Ruby Técnicas, ferramentas e experiências. Jony dos Santos Kostetzer
  2. 2. Agenda Definições Por que escrever testes? TDD e BDD BDD RSpec - explicações e live coding Cucumber - explicações e live coding
  3. 3. Desenvolvimento orientado por testes Em linhas gerais: Testar antes. Codificar depois. “Como eu gostaria que minha aplicação se comportasse?” Origem: eXtremme Programming
  4. 4. O Ciclo TDD red-green-refactor Red Refactor Green
  5. 5. Vantagens 1. Testando primeiro, você sabe exatamente o que seu sofware precisa fazer. 2. Foco: Escrever o código mais simples que resolve o problema. 3. Saber quando parar: Teste define quando se atinge o “suficiente”. 4. Código mais limpo e organizado.
  6. 6. Vantagens 5. Identificar o mais cedo possível problemas de regressão. 6. Segurança e refactoring sem medo. 7. Satisfação!
  7. 7. MANUTENABILIDADE!
  8. 8. Manutenabilidade? Quão fácil é modificar o software. Testes são fundamentais neste quesito - considerar o futuro. Codigo sem testes = código legado. Funciona? Sorte! Além de tudo: seu código, sua carreira!
  9. 9. Bons programadores conseguem resolver um problema proposto de alguma forma.
  10. 10. Programadores excepcionais os resolvem de forma sustentável.
  11. 11. BDD - Behaviour-Driven Development TDD + Novo Vocabulário + Novo ponto de vista Ferramenta de design. Nova abordagem: Foco em especificações de comportamento e não nos testes de verificação. Testes são o meio. Ou seja, especificar comportamento utilizando testes. Escrever software que importa! Documentação executável Clareza do código - comportamento
  12. 12. Testes em Ruby Diversos frameworks. Melhor x pior: Apenas escolha o que melhor lhe convir! test/unit miniunit Shoulda Micronaut test-spec RSpec Cucumber
  13. 13. RSpec DSL (Domain-Specific Language) para descrever comportamento de objetos. Expressividade Legibilidade Similar a estar falando com um cliente.
  14. 14. BDD - Novo vocabulário test/unit rspec should / Asserções Expectativas should_not Método de Exemplo de it() teste código Caso de Grupo de describe() teste exemplos
  15. 15. Terminologias test/unit rspec class SomeClassTest < describe SomeClass Test::Unit::TestCase it "should do something def test_something descriptive" def setup before(:each) def teardown after(:each) assert_equal 4, array.length array.length.should == 4
  16. 16. Grupo de exemplos (Example group) describe Client do ... end describe “A bank transaction” do ... end describe Document, “being shared” do ... end
  17. 17. Exemplos de código (code examples) it “should require a valid username” do ... end it “should not charge a user when he has sufficient credits for the payment” do ... end it “should not retrieve expired documents” do ... end
  18. 18. Expectativas (Expectations) “ “.should be_blank user.birthday.should == Date.today client.active?.should be_false client.should_not be_active message.should match(/on Sunday/) team.should have(11).players
  19. 19. Integrando example groups + code examples
  20. 20. Integrando example groups + code examples
  21. 21. Integrando example groups + code examples + contexts
  22. 22. Code examples
  23. 23. Matchers pré-existentes Igualdade ===, ==, eql, equal Texto should match(/regex/), =~ Array should include, length.should, have(3).items
  24. 24. Matchers o.should be_closed -> o.closed?.should be_true o.should be_an_instance_of(String) -> o.instance_of?(String).should be_true o.should have_key(:id) -> o.has_key?(:id).should be_true o.should have(5).characters -> o.characteres.length.should == 5 o.should have_at_least(12).rooms -> o.rooms.length.should >= 12 o.should be <= 7
  25. 25. Before/After Antes de cada exemplo: before(:each) after(:each) Antes de cada grupo de exemplos: before(:all) after(:all)
  26. 26. Outros idiomas lambda { #codigo }.should change(algo) - (by, from, to) lambda { #codigo }.should raise_error lambda { #codigo }.should throw_symbol
  27. 27. Live coding RSpec http://github.com/jonysk/rsrails_rspec
  28. 28. Cucumber Ferramenta para descrever comportamento a partir da camada superior No Rails: das views para os models. Substituem os Testes de Integração Foco na interface e depois camadas inferiores (Outside-in) O que o usuário espera? - Colaboração entre stakeholders e desenvolvedores para especificar. Testes de aceitação
  29. 29. E por que não começar nos models? (Inside-out) Construir o que você precisa ao invés do que você acha que precisa. Descoberta gradual do que precisa ser implementado em baixo nível.
  30. 30. Relação Cucumber e RSpec Cucumber: descrever o comportamento da aplicação. “Make sure you’re writing the right code” RSpec: descrever o comportamento dos objetos “Make sure you’re writing the code right” Red-green-refactor permanece: Inicia no ciclo externo (Cucumber) Termina no ciclo interno (RSpec)
  31. 31. Instalação RSpec gem install rspec rspec-rails Para utilizar com Rails: Dentro do projeto: script/generate rspec Cucumber + webrat gem install cucumber webrat Para utilizar com Rails: Dentro do projeto: script/generate cucumber
  32. 32. Cucumber features Título / Narrativa / Cenários
  33. 33. Exemplo de feature
  34. 34. Internacionalização!
  35. 35. Implementando dos passos
  36. 36. Cucumber + webrat Simulação de um browser Comandos de integração intuitivos: fill_in “campo”, :with => “valor” visit “/pagina” check “campo” click_button “campo”
  37. 37. Matchers principais should contain(‘text’) should have_selector(‘#menu ul li.selected”, :content => “Dashboard”) CSS3 should have_xpath(‘//node[@prop=”value”]’)
  38. 38. Implementando dos passos
  39. 39. Live coding Cucumber http://github.com/jonysk/rsrails_cucumber
  40. 40. Webrat + Selenium gem install selenium-client Habilitando Selenium no env.rb: Webrat.configure do |config| config.mode = :selenium end Desabilitar fixtures transacionais: # Cucumber::Rails.use_transactional_fixtures
  41. 41. Outros tópicos Integração continua (Integrity, CruiseControl.rb) Ferramentas: autotest, rcov, heckle, etc Macros: muito atenção.
  42. 42. Obrigado! twitter: @jonysk jonysk.net jony@jonysk.net

×