Slide 1

Slide 1 text

El stack de testing de aceptación definitivo de moda el primer trimestre de 2010 RSpec · Steak · Capybara · RackTest · Culerity · ... madrid-rb @madridrb Sergio Gil @porras

Slide 2

Slide 2 text

¿Por qué testing?

Slide 3

Slide 3 text

¿Por qué testing? TDD

Slide 4

Slide 4 text

Testing = QA

Slide 5

Slide 5 text

TDD

Slide 6

Slide 6 text

TDD medio para otras prácticas

Slide 7

Slide 7 text

TDD medio para otras prácticas (ágiles)

Slide 8

Slide 8 text

TDD medio para otras prácticas (ágiles) que son el verdadero valor

Slide 9

Slide 9 text

The Simplest Thing That Could Possibly Work

Slide 10

Slide 10 text

Dejar que el diseño “emerja”

Slide 11

Slide 11 text

Refactorización Continua

Slide 12

Slide 12 text

Refactorización Continua Red / Green / Refactor

Slide 13

Slide 13 text

Integración Continua

Slide 14

Slide 14 text

Propiedad Colectiva del código

Slide 15

Slide 15 text

Releases Frecuentes

Slide 16

Slide 16 text

Despliegue Continuo

Slide 17

Slide 17 text

¿Es posible Agile sin TDD?

Slide 18

Slide 18 text

¿Por qué testing de aceptación?

Slide 19

Slide 19 text

Es el tipo de testing que más valor aporta

Slide 20

Slide 20 text

Porque empieza por el interfaz

Slide 21

Slide 21 text

Porque empieza por el interfaz y tu interfaz es tu producto*

Slide 22

Slide 22 text

Porque empieza por el interfaz y tu interfaz es tu producto* *http://gettingreal.37signals.com/ch09_Interface_First.php

Slide 23

Slide 23 text

Porque te ayuda a pensar realmente en la feature

Slide 24

Slide 24 text

Porque te ayuda a pensar realmente en la feature e implementar exclusivamente lo que hace falta

Slide 25

Slide 25 text

Porque te ayuda a pensar realmente en la feature e implementar exclusivamente lo que hace falta (= aporta valor)

Slide 26

Slide 26 text

Porque es menos frágil

Slide 27

Slide 27 text

Porque es menos frágil (= acoplado a la implementación)

Slide 28

Slide 28 text

Porque todo lo dicho sobre TDD y Agile es especialmente cierto con el testing de aceptación

Slide 29

Slide 29 text

¿Y por qué no Cucumber?

Slide 30

Slide 30 text

Slide 31

Slide 31 text

¡He dicho que no me gusta el pepino!

Slide 32

Slide 32 text

Porque el texto plano no aporta nada si quienes escribimos y leemos somos desarrolladores (sólo una capa más a cambio de nada)

Slide 33

Slide 33 text

Porque el único producto del desarrollo del software susceptible de validación es el software (Manifiesto Ágil, minuto 1)

Slide 34

Slide 34 text

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)

Slide 35

Slide 35 text

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

Steak “The minimalist acceptance testing on top of RSpec”

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

RSpec “The original Behaviour Driven Development framework for Ruby”

Slide 46

Slide 46 text

describe RSpec do it "should be cool" do RSpec.should be_cool end end

Slide 47

Slide 47 text

Capybara “DSL for interacting with a web application”

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

Ideal para testing de aceptación

Slide 50

Slide 50 text

Ideal para testing de aceptación Alto nivel

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

Ideal para testing de aceptación Alto nivel No se habla de modelos o métodos Ni tampoco de acciones o peticiones

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

Adaptadores

Slide 55

Slide 55 text

rack_test Adaptadores

Slide 56

Slide 56 text

rack_test selenium Adaptadores

Slide 57

Slide 57 text

rack_test selenium celerity/culerity Adaptadores

Slide 58

Slide 58 text

RackTest Selenium Culerity 0 37,5 75,0 112,5 150,0

Slide 59

Slide 59 text

API de Capybara visit "/wadus"

Slide 60

Slide 60 text

API de Capybara click_link "Add article"

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

API de Capybara fill_in "Title", :with => "Wadus" choose "Option" check "Option" uncheck "Option" select "1980", :from => "Birth Year"

Slide 67

Slide 67 text

API de Capybara fill_in "Title", :with => "Wadus" choose "Option" check "Option" uncheck "Option" select "1980", :from => "Birth Year" click_button "Save"

Slide 68

Slide 68 text

API de Capybara fill_in "Title", :with => "Wadus" choose "Option" check "Option" uncheck "Option" select "1980", :from => "Birth Year" click_button "Save" click "Save"

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

API de Capybara page.should have_content("Wadus") page.should have_no_content("Wadus") page.should have_css(".article", :text => "Wadus")

Slide 73

Slide 73 text

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)

Slide 74

Slide 74 text

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']")

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

API de Capybara save_and_open_page

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

Otras herramientas

Slide 80

Slide 80 text

Spork Sin spork Con spork 0 3,25 6,50 9,75 13,00

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

Rakegrowl

Slide 84

Slide 84 text

¿?

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

Gracias :)