Date post: | 24-Dec-2014 |
Category: |
Technology |
Upload: | sergio-gil |
View: | 7,242 times |
Download: | 1 times |
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 :)