SlideShare a Scribd company logo
1 of 76
Download to read offline
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)

More Related Content

What's hot

Building Secure Twitter Apps
Building Secure Twitter AppsBuilding Secure Twitter Apps
Building Secure Twitter AppsDamon Cortesi
 
Flickr Open Api Mashup
Flickr Open Api MashupFlickr Open Api Mashup
Flickr Open Api MashupJinho Jung
 
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 @ Confooterry chay
 
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 OkayFITC
 
Poisoning Google images
Poisoning Google imagesPoisoning Google images
Poisoning Google imageslukash4
 
Web Scraping is BS
Web Scraping is BSWeb Scraping is BS
Web Scraping is BSJohn D
 
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]Chris Toohey
 
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 DevicesHasan Hosgel
 
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 ...Dawn Anderson MSc DigM
 
Mood analyzer-virtual-dev-conf
Mood analyzer-virtual-dev-confMood analyzer-virtual-dev-conf
Mood analyzer-virtual-dev-confSherry List
 
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 frameworksMarco Pagni
 
Advanced SEO for Web Developers
Advanced SEO for Web DevelopersAdvanced SEO for Web Developers
Advanced SEO for Web DevelopersNathan Buggia
 
Forum Presentation
Forum PresentationForum Presentation
Forum PresentationAngus Pratt
 
Intro to developing for @twitterapi (updated)
Intro to developing for @twitterapi (updated)Intro to developing for @twitterapi (updated)
Intro to developing for @twitterapi (updated)Raffi Krikorian
 
Semantic Searchmonkey
Semantic SearchmonkeySemantic Searchmonkey
Semantic SearchmonkeyPaul Tarjan
 
Intro to developing for @twitterapi
Intro to developing for @twitterapiIntro to developing for @twitterapi
Intro to developing for @twitterapiRaffi Krikorian
 
FoundConf 2018 Signals Speak - Alexis Sanders
FoundConf 2018 Signals Speak - Alexis SandersFoundConf 2018 Signals Speak - Alexis Sanders
FoundConf 2018 Signals Speak - Alexis SandersAlexis Sanders
 

What's hot (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
 

Similar to 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 Sinatraa_l
 
Effectively Testing Services - Burlington Ruby Conf
Effectively Testing Services - Burlington Ruby ConfEffectively Testing Services - Burlington Ruby Conf
Effectively Testing Services - Burlington Ruby Confneal_kemp
 
FamilySearch Reference Client
FamilySearch Reference ClientFamilySearch Reference Client
FamilySearch Reference ClientDallan Quass
 
GraphQL & Relay - 串起前後端世界的橋樑
GraphQL & Relay - 串起前後端世界的橋樑GraphQL & Relay - 串起前後端世界的橋樑
GraphQL & Relay - 串起前後端世界的橋樑Pokai Chang
 
Cheap frontend tricks
Cheap frontend tricksCheap frontend tricks
Cheap frontend tricksambiescent
 
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 DrupalBjörn Brala
 
[PHP 也有 Day] 垃圾留言守城記 - 用 Laravel 阻擋 SPAM 留言的奮鬥史
[PHP 也有 Day] 垃圾留言守城記 - 用 Laravel 阻擋 SPAM 留言的奮鬥史[PHP 也有 Day] 垃圾留言守城記 - 用 Laravel 阻擋 SPAM 留言的奮鬥史
[PHP 也有 Day] 垃圾留言守城記 - 用 Laravel 阻擋 SPAM 留言的奮鬥史Shengyou Fan
 
Backbone js
Backbone jsBackbone js
Backbone jsrstankov
 
Summit2011 satellites-robinf-20110605
Summit2011 satellites-robinf-20110605Summit2011 satellites-robinf-20110605
Summit2011 satellites-robinf-20110605Robin Fernandes
 
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
 
Authenticating and Securing Node.js APIs
Authenticating and Securing Node.js APIsAuthenticating and Securing Node.js APIs
Authenticating and Securing Node.js APIsJimmy Guerrero
 
External Data Access with jQuery
External Data Access with jQueryExternal Data Access with jQuery
External Data Access with jQueryDoncho Minkov
 
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, FishBrainCodemotion Tel Aviv
 
Building Your First Widget
Building Your First WidgetBuilding Your First Widget
Building Your First WidgetChris Wilcoxson
 
WIRED and the WP REST API
WIRED and the WP REST APIWIRED and the WP REST API
WIRED and the WP REST APIkvignos
 
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 2017Codemotion
 

Similar to 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
 

Recently uploaded

Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfFerryKemperman
 
Odoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 EnterpriseOdoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 Enterprisepreethippts
 
Salesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZSalesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZABSYZ Inc
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Andreas Granig
 
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Cizo Technology Services
 
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...confluent
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationBradBedford3
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...OnePlan Solutions
 
Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Rob Geurden
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024StefanoLambiase
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfMarharyta Nedzelska
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaHanief Utama
 
Post Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on IdentityPost Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on Identityteam-WIBU
 
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdfInnovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdfYashikaSharma391629
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Velvetech LLC
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringHironori Washizaki
 
Cyber security and its impact on E commerce
Cyber security and its impact on E commerceCyber security and its impact on E commerce
Cyber security and its impact on E commercemanigoyal112
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesŁukasz Chruściel
 
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Matt Ray
 
Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Mater
 

Recently uploaded (20)

Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdf
 
Odoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 EnterpriseOdoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 Enterprise
 
Salesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZSalesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZ
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024
 
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
 
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion Application
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
 
Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdf
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief Utama
 
Post Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on IdentityPost Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on Identity
 
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdfInnovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdf
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their Engineering
 
Cyber security and its impact on E commerce
Cyber security and its impact on E commerceCyber security and its impact on E commerce
Cyber security and its impact on E commerce
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New Features
 
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
 
Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)
 

Effectively Testing Services on Rails - Railsconf 2014

Editor's Notes

  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!