Acceptance testing with Steak and Capybara

Preview:

DESCRIPTION

 

Citation preview

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

¿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 interfazy tu interfaz es tu producto*

Porque empieza por el interfazy tu interfaz es tu producto*

*http://gettingreal.37signals.com/ch09_Interface_First.php

Porque te ayuda a pensar realmente en la feature

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

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

(= aporta valor)

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 cambio de nada)

Porque el único producto del desarrollo del software susceptible de validación es el software

(Manifiesto Ágil, minuto 1)

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)

</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" do create_book :title => "The Pragmatic Programmer"

login_as "wadus" visit "/"

page.should have_css(".book", :text => "The Pragmatic Programmer") end

end

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

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

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

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

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

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

RSpec

“The original Behaviour Driven Development framework for Ruby”

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

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 peticiones

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

Adaptadores

rack_test

Adaptadores

rack_testselenium

Adaptadores

rack_testselenium

celerity/culerity

Adaptadores

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 "Option"

API de Capybara

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

API de Capybara

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

API de Capybara

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

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.should have_css(".article", :text => "Wadus")

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)

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

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") endend

API de Capybara

save_and_open_page

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

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

def the_code visit "http://github.com/porras/madrid-rb-feb-2010"end

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.once

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

Rakegrowl

¿?

http://cukes.info/http://github.com/aslakhellesoy/cucumberhttp://github.com/cavalle/steakhttp://rspec.info/http://wiki.github.com/dchelimsky/rspec/http://github.com/dchelimsky/rspechttp://github.com/jnicklas/capybarahttp://github.com/brynary/rack-testhttp://seleniumhq.org/http://code.google.com/p/selenium/http://celerity.rubyforge.org/http://htmlunit.sourceforge.net/http://github.com/langalex/culerityhttp://github.com/bmabey/database_cleanerhttp://github.com/timcharper/sporkhttp://github.com/bblimke/webmockhttp://github.com/bebanjo/deloreanhttp://github.com/porras/rakegrowl

Gracias :)

Recommended