El stack de testing de
aceptación definitivo de moda
 el primer trimestre de 2010
  RSpec · Steak · Capybara · RackTest · C...
¿Por qué testing?
¿Por qué testing?
         TDD
Testing = QA
TDD
TDD
medio para otras prácticas
TDD
medio para otras prácticas
         (ágiles)
TDD
medio para otras prácticas
          (ágiles)
 que son el verdadero valor
The Simplest Thing That Could Possibly Work
Dejar que el diseño “emerja”
Refactorización Continua
Refactorización Continua


  Red / Green / Refactor
Integración Continua
Propiedad Colectiva del código
Releases Frecuentes
Despliegue Continuo
¿Es posible Agile
   sin TDD?
¿Por qué testing de
   aceptación?
Es el tipo de testing que más valor aporta
Porque empieza por el interfaz
Porque empieza por el interfaz
 y tu interfaz es tu producto*
Porque empieza por el interfaz
 y tu interfaz es tu producto*




                   *http://gettingreal.37signals.com/ch0...
Porque te ayuda a pensar realmente en la feature
Porque te ayuda a pensar realmente en la feature
  e implementar exclusivamente lo que hace falta
Porque te ayuda a pensar realmente en la feature
  e implementar exclusivamente lo que hace falta
                 (= apor...
Porque es menos frágil
Porque es menos frágil
(= acoplado a la implementación)
Porque todo lo dicho sobre TDD
 y Agile es especialmente cierto
  con el testing de aceptación
¿Y por qué no
 Cucumber?
<rant>
¡He dicho
que no me gusta el
      pepino!
Porque el texto plano no aporta nada si quienes
  escribimos y leemos somos desarrolladores
     (sólo una capa más a camb...
Porque el único producto del desarrollo del
software susceptible de validación es el software


                          ...
Porque el mantenimiento, reutilización y refactorización
de features y steps acaba siendo muy complejo y trabajoso
       ...
</rant>
Steak
 “The minimalist acceptance testing on top of RSpec”
feature "Main page" do

  background do
    create_user :login => "wadus"
  end

  scenario "should show existing books" d...
feature "Main page" do

  background do
    create_user :login => "wadus"
  end

  scenario "should show existing books" d...
feature "Main page" do

  background do
    create_user :login => "wadus"
  end

  scenario "should show existing books" d...
feature "Main page" do

  background do
    create_user :login => "wadus"
  end

  scenario "should show existing books" d...
feature "Main page" do

  background do
    create_user :login => "wadus"
  end

  scenario "should show existing books" d...
feature "Main page" do

  background do
    create_user :login => "wadus"
  end

  scenario "should show existing books" d...
feature "Main page" do

  background do
    create_user :login => "wadus"
  end

  scenario "should show existing books" d...
RSpec
    “The original Behaviour Driven
   Development framework for Ruby”
describe RSpec do
  it "should be cool" do
    RSpec.should be_cool
  end
end
Capybara
  “DSL for interacting with a web application”
Ideal para testing de aceptación
Ideal para testing de aceptación


           Alto nivel
Ideal para testing de aceptación


            Alto nivel


No se habla de modelos o métodos
Ideal para testing de aceptación


             Alto nivel


No se habla de modelos o métodos


Ni tampoco de acciones o p...
Ideal para testing de aceptación


                Alto nivel


   No se habla de modelos o métodos


   Ni tampoco de acc...
Adaptadores
Adaptadores




 rack_test
Adaptadores




 rack_test
 selenium
Adaptadores




   rack_test
    selenium
celerity/culerity
RackTest




Selenium




Culerity



           0   37,5   75,0   112,5   150,0
API de Capybara




                  visit "/wadus"
API de Capybara




        click_link "Add article"
API de Capybara




        click_link "Add article"
        click "Add article"
API de Capybara



      fill_in "Title", :with => "Wadus"
API de Capybara



      fill_in "Title", :with => "Wadus"
      choose "Option"
API de Capybara



      fill_in "Title", :with => "Wadus"
      choose "Option"
      check "Option"
API de Capybara



      fill_in "Title", :with => "Wadus"
      choose "Option"
      check "Option"
      uncheck "Optio...
API de Capybara



      fill_in "Title", :with => "Wadus"
      choose "Option"
      check "Option"
      uncheck "Optio...
API de Capybara



      fill_in "Title", :with => "Wadus"
      choose "Option"
      check "Option"
      uncheck "Optio...
API de Capybara



      fill_in "Title", :with => "Wadus"
      choose "Option"
      check "Option"
      uncheck "Optio...
API de Capybara




  within :css, ".article:first" do
    click_link "Edit"
  end
API de Capybara




       page.should have_content("Wadus")
API de Capybara




       page.should have_content("Wadus")
       page.should have_no_content("Wadus")
API de Capybara




       page.should have_content("Wadus")
       page.should have_no_content("Wadus")
       page.shoul...
API de Capybara




       page.should   have_content("Wadus")
       page.should   have_no_content("Wadus")
       page.s...
API de Capybara




       page.should   have_content("Wadus")
       page.should   have_no_content("Wadus")
       page.s...
API de Capybara




  page.should have_css(".article", :text => "Wadus") do |article|
    article.should have_css(".author...
API de Capybara




             save_and_open_page
if Time.now < begins_at + 40.minutes && !me.thirsty?
  me.make :demo
else
  me.show(the_code) && go_to(:bar)
end
if Time.now < begins_at + 40.minutes && !me.thirsty?
  me.make :demo
else
  me.show(the_code) && go_to(:bar)
end




def t...
Otras herramientas
Spork

     Sin spork


    Con spork


                 0   3,75   7,50   11,25 15,00
WebMock

 request(:post, "www.example.com").
                 with(:body => "abc").
                 should have_been_made...
Delorean

it "should show latest created user" do
  time_travel_to(3.minutes.ago) { create_user :name => "John" }
  time_t...
Rakegrowl
¿?
http://cukes.info/
http://github.com/aslakhellesoy/cucumber
http://github.com/cavalle/steak
http://rspec.info/
http://wiki...
Gracias :)
Acceptance testing with Steak and Capybara
Acceptance testing with Steak and Capybara
Upcoming SlideShare
Loading in...5
×

Acceptance testing with Steak and Capybara

7,394

Published on

Published in: Technology
1 Comment
11 Likes
Statistics
Notes
No Downloads
Views
Total Views
7,394
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
52
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 :)
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×