Webrat: Rails Acceptance Testing Evolved
Upcoming SlideShare
Loading in...5
×
 

Webrat: Rails Acceptance Testing Evolved

on

  • 12,834 views

Webrat slides from GoGaRuCo 2009 in San Francisco.

Webrat slides from GoGaRuCo 2009 in San Francisco.

Statistics

Views

Total Views
12,834
Views on SlideShare
12,029
Embed Views
805

Actions

Likes
20
Downloads
102
Comments
2

10 Embeds 805

http://www.brynary.com 710
http://www.slideshare.net 63
http://blog.xuite.net 23
http://74.125.155.132 2
http://www.e-presentations.us 2
http://anonymouse.org 1
http://static.slidesharecdn.com 1
http://translate.googleusercontent.com 1
http://webcache.googleusercontent.com 1
http://web.archive.org 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

12 of 2

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • Where are your specs, which use webrat, located? Mine live in spec/integration. Using the code from http://reborg.tumblr.com/post/99813407/webrat-with-rspec-no-cucumber I have it working now, the gem you mention does not (in my setup, did not give it extensive trial and error testing...)
    Are you sure you want to
    Your message goes here
    Processing…
  • How can I use webrat with RSpec as shown in slide 16? Just putting

    require 'webrat'
    Webrat.configure do |config|
    config.mode = :rails
    end

    into my spec_helper.rb does not work (method 'visit' not found).

    Any ideas?
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Webrat: Rails Acceptance Testing Evolved Webrat: Rails Acceptance Testing Evolved Presentation Transcript

    • Ruby Acceptance Testing for Web Applications Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Bryan Helmkamp Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Beer Disclaimer Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • class
RepositoryTest
<
ActionController::IntegrationTest 

test
quot;create
a
new
repositoryquot;
do 



get_via_redirect
repositories_path 



assert_response
:success 



assert_select
quot;a[href=?]quot;,
new_repository_path,
quot;Create
a
new
repoquot; 



 



get_via_redirect
new_repository_path 



assert_response
:success 



 



assert_select
quot;form[action=?][method=post]quot;,
repositories_path
do 





assert_select
quot;input[name=?][type=text]quot;,
quot;repository[name]quot; 





assert_select
quot;input[name=?][type=text]quot;,
quot;repository[description]quot; 





assert_select
quot;input[name=?][type=radio]quot;,
quot;repository[public]quot; 



end 



 



post_via_redirect
repositories_path,
:repository
=>
{ 





:name
=>
quot;rack‐testquot;,
:public
=>
quot;truequot; 



} 



assert_response
:success 



assert_select
quot;Repository
created.quot; 

end end Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • class
RepositoryTest
<
ActionController::IntegrationTest 

test
quot;create
a
new
repositoryquot;
do 



get_via_redirect
repositories_path 



assert_response
:success 



assert_select
quot;a[href=?]quot;,
new_repository_path,
quot;Create
a
new
repoquot; 



get_via_redirect
new_repository_path 



assert_response
:success 



assert_select
quot;form[action=?][method=post]quot;,
repositories_path
do 





assert_select
quot;input[name=?][type=text]quot;,
quot;repository[name]quot; 





assert_select
quot;input[name=?][type=text]quot;,
quot;repository[description]quot; 





assert_select
quot;input[name=?][type=radio]quot;,
quot;repository[public]quot; 



end
 



post_via_redirect
repositories_path,
:repository
=>
{ 





:name
=>
quot;rack‐testquot;,
:public
=>
quot;truequot; 



} 



assert_response
:success 



assert_select
quot;Repository
created.quot; 

end end Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • class
RepositoryTest
<
ActionController::IntegrationTest 

test
quot;create
a
new
repositoryquot;
do 



get_via_redirect
repositories_path 



assert_response
:success 



assert_select
quot;a[href=?]quot;,
new_repository_path,
quot;Create
a
new
repoquot; 



get_via_redirect
new_repository_path 



assert_response
:success 



assert_select
quot;form[action=?][method=post]quot;,
repositories_path
do 





assert_select
quot;input[name=?][type=text]quot;,
quot;repository[name]quot; 





assert_select
quot;input[name=?][type=text]quot;,
quot;repository[description]quot; 





assert_select
quot;input[name=?][type=radio]quot;,
quot;repository[public]quot; 



end
 



post_via_redirect
repositories_path,
:repository
=>
{ 





:name
=>
quot;rack‐testquot;,
:public
=>
quot;truequot; 



} 



assert_response
:success 



assert_select
quot;Repository
created.quot; 

end end Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • class
RepositoryTest
<
ActionController::IntegrationTest 

test
quot;create
a
new
repositoryquot;
do 



get_via_redirect
repositories_path 



assert_response
:success 



assert_select
quot;a[href=?]quot;,
new_repository_path,
quot;Create
a
new
repoquot; 



get_via_redirect
new_repository_path 



assert_response
:success 



assert_select
quot;form[action=?][method=post]quot;,
repositories_path
do 





assert_select
quot;input[name=?][type=text]quot;,
quot;repository[name]quot; 





assert_select
quot;input[name=?][type=text]quot;,
quot;repository[description]quot; 





assert_select
quot;input[name=?][type=radio]quot;,
quot;repository[public]quot; 



end
 



post_via_redirect
repositories_path,
:repository
=>
{ 





:name
=>
quot;rack‐testquot;,
:public
=>
quot;truequot; 



} 



assert_response
:success 



assert_select
quot;Repository
created.quot; 

end end Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Webrat class
RepositoryTest
<
ActionController::IntegrationTest 

test
quot;create
a
new
repositoryquot;
do 



visit
repositories_path 



click_link
quot;Create
a
new
repoquot; 



fill_in
quot;Namequot;,
:with
=>
quot;rack‐testquot; 



click_button
quot;Createquot; 



assert_contain
quot;Repository
created.quot; 

end end Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Webrat class
RepositoryTest
<
ActionController::IntegrationTest 

test
quot;create
a
new
repositoryquot;
do 



visit
repositories_path 



click_link
quot;Create
a
new
repoquot; 



fill_in
quot;Namequot;,
:with
=>
quot;rack‐testquot; 



click_button
quot;Createquot; 



assert_contain
quot;Repository
created.quot; 

end end Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Webrat class
RepositoryTest
<
ActionController::IntegrationTest 

test
quot;create
a
new
repositoryquot;
do 



visit
repositories_path 



click_link
quot;Create
a
new
repoquot; 



fill_in
quot;Namequot;,
:with
=>
quot;rack‐testquot; 



click_button
quot;Createquot; 



assert_contain
quot;Repository
created.quot; 

end end Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Webrat class
RepositoryTest
<
ActionController::IntegrationTest 

test
quot;create
a
new
repositoryquot;
do 



visit
repositories_path 



click_link
quot;Create
a
new
repoquot; 



fill_in
quot;Namequot;,
:with
=>
quot;rack‐testquot; 



click_button
quot;Createquot; 



assert_contain
quot;Repository
created.quot; 

end end Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Webrat class
RepositoryTest
<
ActionController::IntegrationTest 

test
quot;create
a
new
repositoryquot;
do 



visit
repositories_path 



click_link
quot;Create
a
new
repoquot; 



fill_in
quot;Namequot;,
:with
=>
quot;rack‐testquot; 



click_button
quot;Createquot; 



assert_contain
quot;Repository
created.quot; 

end end Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Getting started #
config/environments/test.rb config.gem
quot;webratquot;,
:version
=>
quot;>=0.4.4quot; #
test/test_helper.rb Webrat.configure
do
|config| 

config.mode
=
:rails end #
sudo
rake
gems:install
RAILS_ENV=test Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Webrat’s Core API #visit #click_link #fill_in #check
and
#uncheck #choose #select #attach_file #click_button Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Works with RSpec describe
quot;repository
managementquot;
do 

it
quot;should
create
a
repository
with
a
namequot;
do 



visit
repositories_path 



click_link
quot;Create
a
new
repoquot; 



fill_in
quot;Namequot;,
:with
=>
quot;rack‐testquot; 



click_button
quot;Createquot; 



response.should
contain(quot;Repository
created.quot;) 

end end Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Works with Shoulda class
RepositoryTest
<
ActionController::IntegrationTest 

context
quot;repository
managementquot;
do 



should
quot;create
a
repositoryquot;
do 





visit
repositories_path 





click_link
quot;Create
a
new
repoquot; 





fill_in
quot;Namequot;,
:with
=>
quot;rack‐testquot; 





click_button
quot;Createquot; 





assert_contain
quot;Repository
created.quot; 



end 

end end Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Works with Cucumber Feature:
Manage
repositories 

Scenario:
Create
repository
with
name 



When
I
create
a
repository 



Then
I
should
see
quot;Repository
created.quot; Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Works with Cucumber When
/^I
create
a
repository$/
do 

visit
repositories_path 

click_link
quot;Create
a
new
repoquot; 

fill_in
quot;Namequot;,
:with
=>
quot;rack‐testquot; 

click_button
quot;Createquot; end When
/^I
should
see
quot;([^quot;]*)quot;$/
do
|text| 

response.should
contain(text) end Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Sinatra Application Frameworks Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Matches labels to fields fill_in
quot;Namequot;,
:with
=>
quot;rack‐testquot; <label
for=quot;repository_namequot;>Name</label> <input
id=quot;repository_namequot;
name=quot;repository[name]quot;
/> Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Matches labels to fields fill_in
quot;Namequot;,
:with
=>
quot;rack‐testquot; <label
for=quot;repository_namequot;>Name</label> <input
id=quot;repository_namequot;
name=quot;repository[name]quot;
/> Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Matches labels to fields <label> 

<input
type=quot;checkboxquot;
name=quot;tosquot;
/> 

I
accept
the
Terms
of
Service </label> check
quot;I
accept
the
Terms
of
Servicequot; Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Matches labels to fields <label> 

<input
type=quot;checkboxquot;
name=quot;tosquot;
/> 

I
accept
the
Terms
of
Service </label> check
quot;I
accept
the
Terms
of
Servicequot; Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Webrat verifies web app behaviour Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Verifies HTTP status codes 

1)
Error: test_create_a_new_repository(RepositoryTest): Webrat::PageLoadError:
Page
load
was
not
successful
(Code:
500): <snip> 



webrat
(0.4.4)
lib/webrat/core/session.rb:110:in
`request_page' 



webrat
(0.4.4)
lib/webrat/core/session.rb:205:in
`visit' 



(eval):2:in
`visit' 



/test/integration/repository_test.rb:5:in
`test_create_a_new_repository' Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Verifies form fields 

1)
Error: test_create_a_new_repository(RepositoryTest): Webrat::NotFoundError:
Could
not
find
field:
quot;Namequot; 



webrat
(0.4.4)
lib/webrat/core/locators/locator.rb:14:in
`locate!' 



webrat
(0.4.4)
lib/webrat/core/locators/field_locator.rb:21:in
`field' 



webrat
(0.4.4)
lib/webrat/core/scope.rb:327:in
`locate_field' 



webrat
(0.4.4)
lib/webrat/core/scope.rb:50:in
`fill_in' 



(eval):2:in
`fill_in' 



/test/integration/repository_test.rb:8:in
`test_create_a_new_repository' Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Verify HTML content response.should
contain(quot;Hello,
world!quot;) response.should
have_selector(quot;liquot;,
:class
=>
quot;newquot;, 

:count
=>
2) response.should_not
have_xpath(quot;.//meta[@name
=
'robots']quot;) Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Verify HTML content response.should
have_selector(quot;#album
li:nth‐child(3)quot;)
do
|li|
 

li.should
have_selector(quot;imgquot;,
:src
=>
photo_path(@photo))
 

li.should
contain(quot;Vacation
Photoquot;)
 end
 Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • save_and_open_page Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Webrat adapters • Rails • Merb • Sinatra • Selenium • Mechanize Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • WWW::Mechanize require
quot;webratquot; require
quot;webrat/mechanizequot; session
=
Webrat::MechanizeSession.new session.visit
quot;http://google.com/quot; session.fill_in
quot;qquot;,
:with
=>
quot;GoGaRuCoquot; session.click_button
quot;Google
Searchquot; session.dom.search(quot;h3
aquot;).each_with_index
do
|link,
i| 

puts
quot;#{i+1})
#{link[quot;hrefquot;]}quot; end Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Selenium Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • #
test/test_helper.rb class
ActiveSupport::TestCase 

#
... 

self.use_transactional_fixtures
=
false 

#
... 

setup
do
|session| 



session.host!
quot;localhost:3001quot; 

end end 

 Webrat.configure
do
|config| 

config.mode
=
:selenium end Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • $
rake
test:integration Started ==>
Waiting
for
Selenium
RC
server
on
port
4444...
Ready! ==>
Waiting
for
Rails
application
server
on
port
3001...
Ready! .. Finished
in
23.54011
seconds. 2
tests,
2
assertions,
0
failures,
0
errors Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • $
rake
test:integration Started ==>
Waiting
for
Selenium
RC
server
on
port
4444...
Ready! ==>
Waiting
for
Rails
application
server
on
port
3001...
Ready! .. Finished
in
23.54011
seconds. 2
tests,
2
assertions,
0
failures,
0
errors Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • $
rake
test:integration Started ==>
Waiting
for
Selenium
RC
server
on
port
4444...
Ready! ==>
Waiting
for
Rails
application
server
on
port
3001...
Ready! .. Finished
in
23.54011
seconds. 2
tests,
2
assertions,
0
failures,
0
errors Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Webrat::Selenium Selenium RC Server Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • One method, two modes def
upload_photo 

webrat.simulate
do 



simulate_uploads 

end 

webrat.automate
do 



simulate_upload_via_javascript(quot;avatarquot;,
quot;foo.jpgquot;) 



response.should
contain(quot;Uploading
imagequot;) 



response.should
contain(quot;successfully
uploadedquot;) 



click_link
quot;Continuequot; 

end end Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • One method, two modes def
upload_photo 

webrat.simulate
do 



simulate_uploads 

end 

webrat.automate
do 



simulate_upload_via_javascript(quot;avatarquot;,
quot;foo.jpgquot;) 



response.should
contain(quot;Uploading
imagequot;) 



response.should
contain(quot;successfully
uploadedquot;) 



click_link
quot;Continuequot; 

end end Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • One method, two modes def
upload_photo 

webrat.simulate
do 



simulate_uploads 

end 

webrat.automate
do 



simulate_upload_via_javascript(quot;avatarquot;,
quot;foo.jpgquot;) 



response.should
contain(quot;Uploading
imagequot;) 



response.should
contain(quot;successfully
uploadedquot;) 



click_link
quot;Continuequot; 

end end Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • class
MediaTest
<
ActionController::IntegrationTest 

test
quot;drag
and
drop
mediaquot;
do 



album


=
create_album
:title
=>
quot;Vacationquot; 



photo1

=
create_photo
:album
=>
album 



photo2

=
create_photo
:album
=>
album 



 



visit
album_path(album) 



click_link
quot;Order
mediaquot; 



 



selenium.dragdrop(quot;id=#{dom_id(photo1)}quot;,
quot;+350,
0quot;) 



wait_for
do 





assert
selenium.is_ordered( 







quot;id=#{dom_id(photo1)}quot;, 







quot;id=#{dom_id(photo2)}quot;) 



end 

end end Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • class
MediaTest
<
ActionController::IntegrationTest 

test
quot;drag
and
drop
mediaquot;
do 



album


=
create_album
:title
=>
quot;Vacationquot; 



photo1

=
create_photo
:album
=>
album 



photo2

=
create_photo
:album
=>
album 



 



visit
album_path(album) 



click_link
quot;Order
mediaquot; 



 



selenium.dragdrop(quot;id=#{dom_id(photo1)}quot;,
quot;+350,
0quot;) 



wait_for
do 





assert
selenium.is_ordered( 







quot;id=#{dom_id(photo1)}quot;, 







quot;id=#{dom_id(photo2)}quot;) 



end 

end end Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • class
MediaTest
<
ActionController::IntegrationTest 

test
quot;drag
and
drop
mediaquot;
do 



album


=
create_album
:title
=>
quot;Vacationquot; 



photo1

=
create_photo
:album
=>
album 



photo2

=
create_photo
:album
=>
album 



 



visit
album_path(album) 



click_link
quot;Order
mediaquot; 



 



selenium.dragdrop(quot;id=#{dom_id(photo1)}quot;,
quot;+350,
0quot;) 



wait_for
do 





assert
selenium.is_ordered( 







quot;id=#{dom_id(photo1)}quot;, 







quot;id=#{dom_id(photo2)}quot;) 



end 

end end Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Automating a real web browser is slow Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Quick demo Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • One More Thing... Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Rack::Test require
quot;rack/testquot; class
HomepageTest
<
Test::Unit::TestCase 

include
Rack::Test::Methods 

 

def
app 



MyApp.new 

end 

 

def
test_redirect_logged_in_users_to_dashboard 



authorize
quot;bryanquot;,
quot;secretquot; 



get
quot;/quot; 



follow_redirect! 



 



assert_equal
quot;http://example.org/redirectedquot;,
last_request.url 



assert
last_response.ok? 

end end Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Rack::Test API #get(uri,
params
=
{},
env
=
{}) #post,
#put,
#delete,
and
#head #request(uri,
env
=
{}) #follow_redirect! #header(name,
value) #authorize(username,
password) #last_request #last_response Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Webrat adapters • Rails • Merb • Sinatra • Selenium • Mechanize Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Webrat adapters • Rack::Test • Selenium • Mechanize Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009
    • Thanks http://www.flickr.com/photos/tambako/2908186658/ http://www.flickr.com/photos/pkmousie/2199520904/ http://www.flickr.com/photos/audreyjm529/155024495/ http://www.flickr.com/photos/acaben/541334636/ http://www.flickr.com/photos/millermz/3267766667/ Webrat brynary.com http://bit.ly/wbrt-ggrc @brynary #webrat Sunday, April 19, 2009