Behaviour-Driven Development com Ruby

2,279 views
2,190 views

Published on

Palestra sobre BDD ministrada no RS Rails 2009.

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

Published in: Technology
1 Comment
9 Likes
Statistics
Notes
  • 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
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
2,279
On SlideShare
0
From Embeds
0
Number of Embeds
132
Actions
Shares
0
Downloads
98
Comments
1
Likes
9
Embeds 0
No embeds

No notes for 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

×