SlideShare ist ein Scribd-Unternehmen logo
1 von 76
Downloaden Sie, um offline zu lesen
Effectively
Testing Services
Neal Kemp
$ whoami
Iowa native
Now: Californian
Software Developer
Independent Consultant
What I Do
Ruby / Rails
Javascript / Angular
HTML, CSS, etc
what,why&how
of testing services
NOT
Building testable services
NOT
Test-driven development
(necessarily)
	
  
… and because I don’t want @dhh to rage
what
What is a service?
Internal “SOA”
Any time you make an HTTP
request to an endpoint in
another repository
why
Why are services important?
Build faster
Makes scaling easier
Use them on virtually every application
Increasingly prevalent
Services are critical to
modern Rails development
Why is testing services important?
You (should) test everything else
Services compose crucial features
You may encounter problems…
Internal API
Sometimes null responses
Inconsistencies
Catastrophe
Okay? But what about external APIs?
{"id": 24}	
{"code": "ANA"}
"goals":[	
{	
"per":"1",	
"ta":"CGY",	
"et":"14:11",	
"st":"Wrist Shot"	
},	
{	
"per":"2",	
"ta":"ANA",	
"et":"11:12",	
"st":"Backhand"	
}	
]	
"goals": {	
"per":"1",	
"ta":"CGY",	
"et":"14:11",	
"st":"Wrist Shot"	
}
No versioning!
Snapchat Client
Haphazard documentation
What are the requests?
Bizarre obfuscation
github.com/nneal/snapcat
how
What is different about services?
External network requests
You don’t own the code
On an airplane…
Failure is bad!
No network requests
Don’t interact with services from
test environment* **
* Includes “dummy” APIs
** Using pre-recorded responses
is okay
Assuming: Rails, rspec
Timetostub!
Built-in Stubbing
Typhoeus
Faraday
Excon
Simplify.
gem 'webmock'
ENV['RAILS_ENV'] ||= 'test'	
require File.expand_path('../../config/environment', __FILE__)	
require 'rspec/autorun'	
require 'rspec/rails’	
	
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }	
	
ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)	
	
RSpec.configure do |config|	
config.infer_base_class_for_anonymous_controllers = false	
config.order = 'random’	
end	
	
WebMock.disable_net_connect!	
spec/spec_helper.rb
module FacebookWrapper	
def self.user_id(username)	
user_data(username)['id']	
end	
	
def self.user_data(username)	
JSON.parse(	
open("https://graph.facebook.com/#{username}").read	
)	
end	
end	
lib/facebook_wrapper.rb
require 'facebook_wrapper'	
config/intializers/facebook_wrapper.rb
require 'spec_helper'	
	
describe FacebookWrapper, '.user_link' do	
it 'retrieves user link' do	
stub_request(:get, 'https://graph.facebook.com/arjun').	
to_return(	
status: 200,	
headers: {},	
body: '{	
"id": "7901103","first_name": "Arjun",	
"locale": "en_US","username": "Arjun"	
}'	
)	
	
user_id = FacebookWrapper.user_id('arjun')	
	
expect(user_id).to eq '7901103'	
end	
end	
spec/lib/facebook_wrapper_spec.rb
require 'spec_helper'	
	
describe FacebookWrapper, '.user_link' do	
it 'retrieves user link' do	
stub_request(:get, 'https://graph.facebook.com/arjun').	
to_return(	
status: 200,	
headers: {},	
body: '{	
"id": "7901103","first_name": "Arjun",	
"locale": "en_US","username": "Arjun"	
}'	
)	
	
user_id = FacebookWrapper.user_id('arjun')	
	
expect(user_id).to eq '7901103'	
end	
end	
spec/lib/facebook_wrapper_spec.rb
require 'spec_helper'	
	
describe FacebookWrapper, '.user_link' do	
it 'retrieves user link' do	
stub_request(:get, 'https://graph.facebook.com/arjun').	
to_return(	
status: 200,	
headers: {},	
body: '{	
"id": "7901103","first_name": "Arjun",	
"locale": "en_US","username": "Arjun"	
}'	
)	
	
user_id = FacebookWrapper.user_id('arjun')	
	
expect(user_id).to eq '7901103'	
end	
end	
spec/lib/facebook_wrapper_spec.rb
require 'spec_helper'	
	
describe FacebookWrapper, '.user_link' do	
it 'retrieves user link' do	
stub_request(:get, 'https://graph.facebook.com/arjun').	
to_return(	
status: 200,	
headers: {},	
body: '{	
"id": "7901103","first_name": "Arjun",	
"locale": "en_US","username": "Arjun"	
}'	
)	
	
user_id = FacebookWrapper.user_id('arjun')	
	
expect(user_id).to eq '7901103'	
end	
end	
spec/lib/facebook_wrapper_spec.rb
Even Better
No network requests
Fast!
No intermittent failure
Mock-Services
AWS
FB graph mock
OmniAuth
Etc…
gem 'fb_graph-mock'
ENV['RAILS_ENV'] ||= 'test'	
require File.expand_path('../../config/environment', __FILE__)	
require 'rspec/autorun'	
require 'rspec/rails’	
require 'fb_graph/mock' 	
	
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }	
	
ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)	
	
RSpec.configure do |config|	
config.infer_base_class_for_anonymous_controllers = false	
config.order = 'random'	
config.include FbGraph::Mock	
end	
	
WebMock.disable_net_connect!	
spec/spec_helper.rb
describe FacebookWrapper, '.user_link' do	
it 'retrieves user link' do	
mock_graph :get, 'arjun', 'users/arjun_public' do	
user_id = FacebookWrapper.user_id('arjun')	
	
expect(user_id).to eq '7901103'	
end	
end	
end	
spec/lib/facebook_wrapper_spec.rb
describe FacebookWrapper, '.user_link' do	
it 'retrieves user link' do	
mock_graph :get, 'arjun', 'users/arjun_public' do	
user_id = FacebookWrapper.user_id('arjun')	
	
expect(user_id).to eq '7901103'	
end	
end	
end	
spec/lib/facebook_wrapper_spec.rb
Even Better
Already stubbed for you
Pre-recorded responses (sometimes)
Don’t need to know API endpoints
gem 'sham_rack'
gem 'sinatra'
ENV['RAILS_ENV'] ||= 'test'	
require File.expand_path('../../config/environment', __FILE__)	
require 'rspec/autorun'	
require 'rspec/rails’	
	
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }	
	
ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)	
	
RSpec.configure do |config|	
config.infer_base_class_for_anonymous_controllers = false	
config.order = 'random’	
end	
	
WebMock.disable_net_connect!	
spec/spec_helper.rb
ShamRack.at('graph.facebook.com', 443).sinatra do	
get '/:username' do	
%Q|{	
"id": "7901103",	
"name": "Arjun Banker",	
"first_name": "Arjun",	
"last_name": "Banker",	
"link": "http://www.facebook.com/#{params[:username]}",	
"location": {	
"id": 114952118516947,	
"name": "San Francisco, California"	
},	
"gender": "male"	
}|	
end	
end	
spec/support/fake_facebook.rb
ShamRack.at('graph.facebook.com', 443).sinatra do	
get '/:username' do	
%Q|{	
"id": "7901103",	
"name": "Arjun Banker",	
"first_name": "Arjun",	
"last_name": "Banker",	
"link": "http://www.facebook.com/#{params[:username]}",	
"location": {	
"id": 114952118516947,	
"name": "San Francisco, California"	
},	
"gender": "male"	
}|	
end	
end	
spec/support/fake_facebook.rb
ShamRack.at('graph.facebook.com', 443).sinatra do	
get '/:username' do	
%Q|{	
"id": "7901103",	
"name": "Arjun Banker",	
"first_name": "Arjun",	
"last_name": "Banker",	
"link": "http://www.facebook.com/#{params[:username]}",	
"location": {	
"id": 114952118516947,	
"name": "San Francisco, California"	
},	
"gender": "male"	
}|	
end	
end	
spec/support/fake_facebook.rb
ShamRack.at('graph.facebook.com', 443).sinatra do	
get '/:username' do	
%Q|{	
"id": "7901103",	
"name": "Arjun Banker",	
"first_name": "Arjun",	
"last_name": "Banker",	
"link": "http://www.facebook.com/#{params[:username]}",	
"location": {	
"id": 114952118516947,	
"name": "San Francisco, California"	
},	
"gender": "male"	
}|	
end	
end	
spec/support/fake_facebook.rb
describe FacebookWrapper, '.user_link' do	
it 'retrieves user link' do	
user_id = FacebookWrapper.user_id('arjun')	
	
expect(user_id).to eq '7901103’	
end	
end	
spec/lib/facebook_wrapper_spec.rb
Even Better
Dynamic
Expressive
Readable
gem 'vcr'
ENV['RAILS_ENV'] ||= 'test'	
require File.expand_path('../../config/environment', __FILE__)	
require 'rspec/autorun'	
require 'rspec/rails’	
	
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }	
	
ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)	
	
RSpec.configure do |config|	
config.infer_base_class_for_anonymous_controllers = false	
config.order = 'random’	
end	
	
WebMock.disable_net_connect!	
	
VCR.configure do |c|	
c.cassette_library_dir = 'spec/fixtures/vcr_cassettes'	
c.hook_into :webmock 	
end	
spec/spec_helper.rb
describe FacebookWrapper, '.user_link' do	
it 'retrieves user link' do	
VCR.use_cassette('fb_user_arjun') do	
user_id = FacebookWrapper.user_id('arjun')	
	
expect(user_id).to eq '7901103'	
end	
end	
end	
spec/lib/facebook_wrapper_spec.rb
describe FacebookWrapper, '.user_link' do	
it 'retrieves user link' do	
VCR.use_cassette('fb_user_arjun') do	
user_id = FacebookWrapper.user_id('arjun')	
	
expect(user_id).to eq '7901103'	
end	
end	
end	
spec/lib/facebook_wrapper_spec.rb
Even Better
Record API automatically
Replay responses without network
Verify responses
Additional Build Process
Runs outside normal test mode
Rechecks cassettes for diffs
Avoids versioning issues
gem 'puffing-billy'
Puffing-Billy
Built for in-browser requests
Allowed to record and reuse (like VCR)
Be brave, venture
out of ruby
I also like…
Chrome Dev Tools
Postman
HTTPie
Charles
Additional Reading
martinfowler.com/bliki/IntegrationContractTest.html
robots.thoughtbot.com/how-to-stub-external-services-in-tests
joblivious.wordpress.com/2009/02/20/handling-intermittence-how-to-
survive-test-driven-development
railscasts.com/episodes/291-testing-with-vcr
Bringing it all together
Testing services is crucial
If in doubt, stub it out
Determine the flexibility you want
Record responses to save time
Next Up
Eliminating Inconsistent Test Failures
with Austin Putman
Thank you!
me@nealke.mp
(I like emails)
@neal_kemp
(I tweet)

Weitere ähnliche Inhalte

Was ist angesagt?

Components are the Future of the Web: It’s Going To Be Okay
Components are the Future of the Web: It’s Going To Be OkayComponents are the Future of the Web: It’s Going To Be Okay
Components are the Future of the Web: It’s Going To Be Okay
FITC
 
Advanced SEO for Web Developers
Advanced SEO for Web DevelopersAdvanced SEO for Web Developers
Advanced SEO for Web Developers
Nathan Buggia
 
Intro to developing for @twitterapi
Intro to developing for @twitterapiIntro to developing for @twitterapi
Intro to developing for @twitterapi
Raffi Krikorian
 

Was ist angesagt? (19)

Building Secure Twitter Apps
Building Secure Twitter AppsBuilding Secure Twitter Apps
Building Secure Twitter Apps
 
Flickr Open Api Mashup
Flickr Open Api MashupFlickr Open Api Mashup
Flickr Open Api Mashup
 
2019-03 PHP without PHP Architecture @ Confoo
2019-03 PHP without PHP Architecture @ Confoo2019-03 PHP without PHP Architecture @ Confoo
2019-03 PHP without PHP Architecture @ Confoo
 
Components are the Future of the Web: It’s Going To Be Okay
Components are the Future of the Web: It’s Going To Be OkayComponents are the Future of the Web: It’s Going To Be Okay
Components are the Future of the Web: It’s Going To Be Okay
 
สปริงเฟรมเวิร์ค4.1
สปริงเฟรมเวิร์ค4.1สปริงเฟรมเวิร์ค4.1
สปริงเฟรมเวิร์ค4.1
 
Poisoning Google images
Poisoning Google imagesPoisoning Google images
Poisoning Google images
 
Web Scraping is BS
Web Scraping is BSWeb Scraping is BS
Web Scraping is BS
 
10 Things You're Not Doing [IBM Lotus Notes Domino Application Development]
10 Things You're Not Doing [IBM Lotus Notes Domino Application Development]10 Things You're Not Doing [IBM Lotus Notes Domino Application Development]
10 Things You're Not Doing [IBM Lotus Notes Domino Application Development]
 
MTC 2013 Berlin - Best Practices for Multi Devices
MTC 2013 Berlin - Best Practices for Multi DevicesMTC 2013 Berlin - Best Practices for Multi Devices
MTC 2013 Berlin - Best Practices for Multi Devices
 
Technical SEO - Gone is Never Gone - Fixing Generational Cruft and Technical ...
Technical SEO - Gone is Never Gone - Fixing Generational Cruft and Technical ...Technical SEO - Gone is Never Gone - Fixing Generational Cruft and Technical ...
Technical SEO - Gone is Never Gone - Fixing Generational Cruft and Technical ...
 
Mood analyzer-virtual-dev-conf
Mood analyzer-virtual-dev-confMood analyzer-virtual-dev-conf
Mood analyzer-virtual-dev-conf
 
Fetch me if you can - Handling API data in different JS frameworks
Fetch me if you can - Handling API data in different JS frameworksFetch me if you can - Handling API data in different JS frameworks
Fetch me if you can - Handling API data in different JS frameworks
 
Advanced SEO for Web Developers
Advanced SEO for Web DevelopersAdvanced SEO for Web Developers
Advanced SEO for Web Developers
 
Forum Presentation
Forum PresentationForum Presentation
Forum Presentation
 
Intro to developing for @twitterapi (updated)
Intro to developing for @twitterapi (updated)Intro to developing for @twitterapi (updated)
Intro to developing for @twitterapi (updated)
 
Semantic Searchmonkey
Semantic SearchmonkeySemantic Searchmonkey
Semantic Searchmonkey
 
Intro to developing for @twitterapi
Intro to developing for @twitterapiIntro to developing for @twitterapi
Intro to developing for @twitterapi
 
Elegant APIs
Elegant APIsElegant APIs
Elegant APIs
 
FoundConf 2018 Signals Speak - Alexis Sanders
FoundConf 2018 Signals Speak - Alexis SandersFoundConf 2018 Signals Speak - Alexis Sanders
FoundConf 2018 Signals Speak - Alexis Sanders
 

Ähnlich wie Effectively Testing Services on Rails - Railsconf 2014

Simple Web Apps With Sinatra
Simple Web Apps With SinatraSimple Web Apps With Sinatra
Simple Web Apps With Sinatra
a_l
 
Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...
Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...
Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...
Atlassian
 
External Data Access with jQuery
External Data Access with jQueryExternal Data Access with jQuery
External Data Access with jQuery
Doncho Minkov
 

Ähnlich wie Effectively Testing Services on Rails - Railsconf 2014 (20)

Simple Web Apps With Sinatra
Simple Web Apps With SinatraSimple Web Apps With Sinatra
Simple Web Apps With Sinatra
 
Effectively Testing Services - Burlington Ruby Conf
Effectively Testing Services - Burlington Ruby ConfEffectively Testing Services - Burlington Ruby Conf
Effectively Testing Services - Burlington Ruby Conf
 
FamilySearch Reference Client
FamilySearch Reference ClientFamilySearch Reference Client
FamilySearch Reference Client
 
GraphQL & Relay - 串起前後端世界的橋樑
GraphQL & Relay - 串起前後端世界的橋樑GraphQL & Relay - 串起前後端世界的橋樑
GraphQL & Relay - 串起前後端世界的橋樑
 
JSON and the APInauts
JSON and the APInautsJSON and the APInauts
JSON and the APInauts
 
Django
DjangoDjango
Django
 
Cheap frontend tricks
Cheap frontend tricksCheap frontend tricks
Cheap frontend tricks
 
Stop the noise! - Introduction to the JSON:API specification in Drupal
Stop the noise! - Introduction to the JSON:API specification in DrupalStop the noise! - Introduction to the JSON:API specification in Drupal
Stop the noise! - Introduction to the JSON:API specification in Drupal
 
[PHP 也有 Day] 垃圾留言守城記 - 用 Laravel 阻擋 SPAM 留言的奮鬥史
[PHP 也有 Day] 垃圾留言守城記 - 用 Laravel 阻擋 SPAM 留言的奮鬥史[PHP 也有 Day] 垃圾留言守城記 - 用 Laravel 阻擋 SPAM 留言的奮鬥史
[PHP 也有 Day] 垃圾留言守城記 - 用 Laravel 阻擋 SPAM 留言的奮鬥史
 
Backbone js
Backbone jsBackbone js
Backbone js
 
Summit2011 satellites-robinf-20110605
Summit2011 satellites-robinf-20110605Summit2011 satellites-robinf-20110605
Summit2011 satellites-robinf-20110605
 
Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...
Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...
Satellite Apps around the Cloud: Integrating your infrastructure with JIRA St...
 
Ams adapters
Ams adaptersAms adapters
Ams adapters
 
Authenticating and Securing Node.js APIs
Authenticating and Securing Node.js APIsAuthenticating and Securing Node.js APIs
Authenticating and Securing Node.js APIs
 
External Data Access with jQuery
External Data Access with jQueryExternal Data Access with jQuery
External Data Access with jQuery
 
Drupal Mobile
Drupal MobileDrupal Mobile
Drupal Mobile
 
How to actually use promises - Jakob Mattsson, FishBrain
How to actually use promises - Jakob Mattsson, FishBrainHow to actually use promises - Jakob Mattsson, FishBrain
How to actually use promises - Jakob Mattsson, FishBrain
 
Building Your First Widget
Building Your First WidgetBuilding Your First Widget
Building Your First Widget
 
WIRED and the WP REST API
WIRED and the WP REST APIWIRED and the WP REST API
WIRED and the WP REST API
 
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
Full-Text Search Explained - Philipp Krenn - Codemotion Rome 2017
 

Kürzlich hochgeladen

Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Medical / Health Care (+971588192166) Mifepristone and Misoprostol tablets 200mg
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
masabamasaba
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
VictoriaMetrics
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
masabamasaba
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
masabamasaba
 

Kürzlich hochgeladen (20)

Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
 
WSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - Keynote
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
 
tonesoftg
tonesoftgtonesoftg
tonesoftg
 
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park %in ivory park+277-882-255-28 abortion pills for sale in ivory park
%in ivory park+277-882-255-28 abortion pills for sale in ivory park
 
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
 
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
 
Artyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxArtyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptx
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
 
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open SourceWSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
 
WSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go PlatformlessWSO2CON2024 - It's time to go Platformless
WSO2CON2024 - It's time to go Platformless
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 

Effectively Testing Services on Rails - Railsconf 2014

Hinweis der Redaktion

  1. Includes: things like Stripe, or an internal API, or an iPhone app calling into an API exposed by your rails app
  2. LA kings checkingchicagoblackhawks
  3. Can back with yaml
  4. Can back with yaml
  5. Can back with yaml
  6. Can back with yaml
  7. Re-writing web proxyAllowed to record and reuse (like VCR)
  8. Can back with yaml
  9. Ubiquitous PowerfulIn-browser (so easy!)
  10. Easily send requestsEasy-to-use GUI
  11. Postman without the GUICould run small scripts around it
  12. re-writing web proxyTest mobile as well as desktopGood for collecting a lot of responsesGood for testing things that aren’t specific page loads in ChromeGood when you don’t know what’s even being requested!