Acceptance testing with Steak and Capybara

7,820 views
7,626 views

Published on

Published in: Technology
1 Comment
11 Likes
Statistics
Notes
No Downloads
Views
Total views
7,820
On SlideShare
0
From Embeds
0
Number of Embeds
97
Actions
Shares
0
Downloads
53
Comments
1
Likes
11
Embeds 0
No embeds

No notes for slide

Acceptance testing with Steak and Capybara

  1. 1. El stack de testing de aceptación definitivo de moda el primer trimestre de 2010 RSpec · Steak · Capybara · RackTest · Culerity · ... madrid-rb Sergio Gil @madridrb @porras
  2. 2. ¿Por qué testing?
  3. 3. ¿Por qué testing? TDD
  4. 4. Testing = QA
  5. 5. TDD
  6. 6. TDD medio para otras prácticas
  7. 7. TDD medio para otras prácticas (ágiles)
  8. 8. TDD medio para otras prácticas (ágiles) que son el verdadero valor
  9. 9. The Simplest Thing That Could Possibly Work
  10. 10. Dejar que el diseño “emerja”
  11. 11. Refactorización Continua
  12. 12. Refactorización Continua Red / Green / Refactor
  13. 13. Integración Continua
  14. 14. Propiedad Colectiva del código
  15. 15. Releases Frecuentes
  16. 16. Despliegue Continuo
  17. 17. ¿Es posible Agile sin TDD?
  18. 18. ¿Por qué testing de aceptación?
  19. 19. Es el tipo de testing que más valor aporta
  20. 20. Porque empieza por el interfaz
  21. 21. Porque empieza por el interfaz y tu interfaz es tu producto*
  22. 22. Porque empieza por el interfaz y tu interfaz es tu producto* *http://gettingreal.37signals.com/ch09_Interface_First.php
  23. 23. Porque te ayuda a pensar realmente en la feature
  24. 24. Porque te ayuda a pensar realmente en la feature e implementar exclusivamente lo que hace falta
  25. 25. Porque te ayuda a pensar realmente en la feature e implementar exclusivamente lo que hace falta (= aporta valor)
  26. 26. Porque es menos frágil
  27. 27. Porque es menos frágil (= acoplado a la implementación)
  28. 28. Porque todo lo dicho sobre TDD y Agile es especialmente cierto con el testing de aceptación
  29. 29. ¿Y por qué no Cucumber?
  30. 30. <rant>
  31. 31. ¡He dicho que no me gusta el pepino!
  32. 32. Porque el texto plano no aporta nada si quienes escribimos y leemos somos desarrolladores (sólo una capa más a cambio de nada)
  33. 33. Porque el único producto del desarrollo del software susceptible de validación es el software (Manifiesto Ágil, minuto 1)
  34. 34. Porque el mantenimiento, reutilización y refactorización de features y steps acaba siendo muy complejo y trabajoso (que era lo que queríamos evitar)
  35. 35. </rant>
  36. 36. Steak “The minimalist acceptance testing on top of RSpec”
  37. 37. feature "Main page" do background do create_user :login => "wadus" end scenario "should show existing books" do create_book :title => "The Pragmatic Programmer" login_as "wadus" visit "/" page.should have_css(".book", :text => "The Pragmatic Programmer") end end
  38. 38. feature "Main page" do background do create_user :login => "wadus" end scenario "should show existing books" do create_book :title => "The Pragmatic Programmer" login_as "wadus" visit "/" page.should have_css(".book", :text => "The Pragmatic Programmer") end end
  39. 39. feature "Main page" do background do create_user :login => "wadus" end scenario "should show existing books" do create_book :title => "The Pragmatic Programmer" login_as "wadus" visit "/" page.should have_css(".book", :text => "The Pragmatic Programmer") end end
  40. 40. feature "Main page" do background do create_user :login => "wadus" end scenario "should show existing books" do create_book :title => "The Pragmatic Programmer" login_as "wadus" visit "/" page.should have_css(".book", :text => "The Pragmatic Programmer") end end
  41. 41. feature "Main page" do background do create_user :login => "wadus" end scenario "should show existing books" do create_book :title => "The Pragmatic Programmer" login_as "wadus" visit "/" page.should have_css(".book", :text => "The Pragmatic Programmer") end end
  42. 42. feature "Main page" do background do create_user :login => "wadus" end scenario "should show existing books" do create_book :title => "The Pragmatic Programmer" login_as "wadus" visit "/" page.should have_css(".book", :text => "The Pragmatic Programmer") end end
  43. 43. feature "Main page" do background do create_user :login => "wadus" end scenario "should show existing books" do create_book :title => "The Pragmatic Programmer" login_as "wadus" visit "/" page.should have_css(".book", :text => "The Pragmatic Programmer") end end
  44. 44. RSpec “The original Behaviour Driven Development framework for Ruby”
  45. 45. describe RSpec do it "should be cool" do RSpec.should be_cool end end
  46. 46. Capybara “DSL for interacting with a web application”
  47. 47. Ideal para testing de aceptación
  48. 48. Ideal para testing de aceptación Alto nivel
  49. 49. Ideal para testing de aceptación Alto nivel No se habla de modelos o métodos
  50. 50. Ideal para testing de aceptación Alto nivel No se habla de modelos o métodos Ni tampoco de acciones o peticiones
  51. 51. Ideal para testing de aceptación Alto nivel No se habla de modelos o métodos Ni tampoco de acciones o peticiones Sino de páginas, enlaces y formularios
  52. 52. Adaptadores
  53. 53. Adaptadores rack_test
  54. 54. Adaptadores rack_test selenium
  55. 55. Adaptadores rack_test selenium celerity/culerity
  56. 56. RackTest Selenium Culerity 0 37,5 75,0 112,5 150,0
  57. 57. API de Capybara visit "/wadus"
  58. 58. API de Capybara click_link "Add article"
  59. 59. API de Capybara click_link "Add article" click "Add article"
  60. 60. API de Capybara fill_in "Title", :with => "Wadus"
  61. 61. API de Capybara fill_in "Title", :with => "Wadus" choose "Option"
  62. 62. API de Capybara fill_in "Title", :with => "Wadus" choose "Option" check "Option"
  63. 63. API de Capybara fill_in "Title", :with => "Wadus" choose "Option" check "Option" uncheck "Option"
  64. 64. API de Capybara fill_in "Title", :with => "Wadus" choose "Option" check "Option" uncheck "Option" select "1980", :from => "Birth Year"
  65. 65. API de Capybara fill_in "Title", :with => "Wadus" choose "Option" check "Option" uncheck "Option" select "1980", :from => "Birth Year" click_button "Save"
  66. 66. API de Capybara fill_in "Title", :with => "Wadus" choose "Option" check "Option" uncheck "Option" select "1980", :from => "Birth Year" click_button "Save" click "Save"
  67. 67. API de Capybara within :css, ".article:first" do click_link "Edit" end
  68. 68. API de Capybara page.should have_content("Wadus")
  69. 69. API de Capybara page.should have_content("Wadus") page.should have_no_content("Wadus")
  70. 70. API de Capybara page.should have_content("Wadus") page.should have_no_content("Wadus") page.should have_css(".article", :text => "Wadus")
  71. 71. API de Capybara page.should have_content("Wadus") page.should have_no_content("Wadus") page.should have_css(".article", :text => "Wadus") page.should have_css(".article", :count => 3)
  72. 72. API de Capybara page.should have_content("Wadus") page.should have_no_content("Wadus") page.should have_css(".article", :text => "Wadus") page.should have_css(".article", :count => 3) page.should have_xpath("//*[@class='article']")
  73. 73. API de Capybara page.should have_css(".article", :text => "Wadus") do |article| article.should have_css(".author", :text => "@porras") article.should have_css(".links") do |links| links.should have_css("a", :href => "http://wadus.info") links.should have_css("a", :href => "http://bit.ly/wadus") end end
  74. 74. API de Capybara save_and_open_page
  75. 75. if Time.now < begins_at + 40.minutes && !me.thirsty? me.make :demo else me.show(the_code) && go_to(:bar) end
  76. 76. if Time.now < begins_at + 40.minutes && !me.thirsty? me.make :demo else me.show(the_code) && go_to(:bar) end def the_code visit "http://github.com/porras/madrid-rb-feb-2010" end
  77. 77. Otras herramientas
  78. 78. Spork Sin spork Con spork 0 3,75 7,50 11,25 15,00
  79. 79. WebMock request(:post, "www.example.com"). with(:body => "abc"). should have_been_made.once
  80. 80. Delorean it "should show latest created user" do time_travel_to(3.minutes.ago) { create_user :name => "John" } time_travel_to(5.minutes.ago) { create_user :name => "Chris" } get '/' response.should have_text("John") response.should_not have_text("Chris") end
  81. 81. Rakegrowl
  82. 82. ¿?
  83. 83. http://cukes.info/ http://github.com/aslakhellesoy/cucumber http://github.com/cavalle/steak http://rspec.info/ http://wiki.github.com/dchelimsky/rspec/ http://github.com/dchelimsky/rspec http://github.com/jnicklas/capybara http://github.com/brynary/rack-test http://seleniumhq.org/ http://code.google.com/p/selenium/ http://celerity.rubyforge.org/ http://htmlunit.sourceforge.net/ http://github.com/langalex/culerity http://github.com/bmabey/database_cleaner http://github.com/timcharper/spork http://github.com/bblimke/webmock http://github.com/bebanjo/delorean http://github.com/porras/rakegrowl
  84. 84. Gracias :)

×