SlideShare a Scribd company logo
1 of 51
Download to read offline
Testing Legacy
Rails Applications




                  Evan ‘rabble’ Henshaw-Plath
                       Yahoo! Brickhouse
               anarchogeek.com - testingrails.com
            presentation slides - slideshare.net/rabble
Do We Have
   Legacy Already?

Yes, thousands of rails apps have been
built and deployed over the last three
years. Many of us included few or no
tests. The test-less apps still need
debugging, which should be done with
tests.
Testing == Health Food?



 “We started the tests, but
haven’t been updating them”
                         “Who has time for tests?”

“Testing means writing
 twice as much code.”
Testing == Debugging
no, really, it is
Starting
Don’t
do
it
all
at
once
Get Rake Working



brickhouse:~/code/legacy_testing rabble$ rake
(in /Users/rabble/code/legacy_testing)
/opt/local/bin/ruby -Ilib:test quot;/opt/local/lib/ruby/gems/1.8/gems/rake-0.7.2/lib/rake/rake_test_loader.rbquot;
/opt/local/bin/ruby -Ilib:test quot;/opt/local/lib/ruby/gems/1.8/gems/rake-0.7.2/lib/rake/rake_test_loader.rbquot;
#42000Unknown database 'legacy_testing_development'
/opt/local/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/vendor/mysql.rb:523:in `read'
/opt/local/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/vendor/mysql.rb:153:in `real_connect'
/opt/local/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/
mysql_adapter.rb:389:in `connect'
/opt/local/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/
mysql_adapter.rb:152:in `initialize'
Create your test db




mysqladmin -uroot create railsapp_test
Use Migrations

brickhouse:~/code/legacy_testing rabble$ rake db:migrate
(in /Users/rabble/code/legacy_testing)
== CreateArticles: migrating ====================
-- create_table(:articles)
   -> 0.2749s
== CreateArticles: migrated (0.2764s) =============
Try Rake Again

brickhouse:~/code/legacy_testing rabble$ rake
(in /Users/rabble/code/legacy_testing)
/opt/local/bin/ruby -Ilib:test quot;/opt/local/lib/ruby/gems/1.8/gems/rake-0.7.2/lib/rake/rake_test_loader.rbquot; quot;test/unit/
article_test.rbquot;
Loaded suite /opt/local/lib/ruby/gems/1.8/gems/rake-0.7.2/lib/rake/rake_test_loader
Started
.
Finished in 0.316844 seconds.

1 tests, 1 assertions, 0 failures, 0 errors
/opt/local/bin/ruby -Ilib:test quot;/opt/local/lib/ruby/gems/1.8/gems/rake-0.7.2/lib/rake/rake_test_loader.rbquot; quot;test/
functional/blog_controller_test.rbquot;
Loaded suite /opt/local/lib/ruby/gems/1.8/gems/rake-0.7.2/lib/rake/rake_test_loader
Started
.
Finished in 0.243161 seconds.

1 tests, 1 assertions, 0 failures, 0 errors
/opt/local/bin/ruby -Ilib:test quot;/opt/local/lib/ruby/gems/1.8/gems/rake-0.7.2/lib/rake/rake_test_loader.rbquot;
Scaffolding is Broken
Ok
  now
 we’re
 ready
 to get
started
One Step At A Time
find a bug - write a test
refractor a method
    write a test
Treat Each
 Method
 As Box
Test One Thing




  At A Time
What Goes In?




What Comes Out?
Running Tests




      rake & directly
Running Tests
with rake


rake   test               #   Test all units and functionals
rake   test:functionals   #   Run the functional tests in test/functional
rake   test:integration   #   Run the integration tests in test/integration
rake   test:plugins       #   Run the plugin tests in vendor/plugins/**/test
rake   test:recent        #   Test recent changes
rake   test:uncommitted   #   Test changes since last checkin (svn only)
rake   test:units         #   Run the unit tests in test/unit
running tests directly
Test::Unit automatic runner.
Usage: blog_controller_test.rb [options] [-- untouched arguments]

run them all
ruby article_controller_test.rb

give it a test name
ruby article_controller_test.rb -n test_show

try regular expressions
ruby article_controller_test.rb -n /show/

get help: ruby --help
An Example
def User.find_popular(n=20)
 sql = quot;select u.*, count(j.user_id) as popularity
        from users u, talks_users j
        where u.id = j.user_id group by j.user_id
        order by popularity desc limit #{n}quot;
 return User.find_by_sql(sql)
end
An Example
 def User.find_popular(n=20)
  sql = quot;select u.*, count(j.user_id) as popularity
         from users u, talks_users j
         where u.id = j.user_id group by j.user_id
         order by popularity desc limit #{n}quot;
  return User.find_by_sql(sql)
 end

 def test_popular
  assert_nothing_raised { users = User.find_popular(2) }
  assert_equal 2, users.size, quot;find_popular should return two usersquot;
  assert users.first.popularity > users.last.popularity, quot;should sort popular usersquot;
 end

$ ruby ./test/unit/user_test -n test_popular
brickhouse:~/code/icalico/trunk/test/unit rabble$ ruby user_test.rb -n /popular/
Loaded suite user_test
Started
.
Finished in 0.290563 seconds.
Refactor
 def self.find_popular(n=20)
  return conference.attendees.find(:all,
    :select => quot;users.*, count(talks_users.user_id) as popularityquot;,
    :joins => quot;LEFT JOIN talks_users on users.id = talks_users.user_idquot;,
    :group => quot;talks_users.user_idquot;,
    :order => 'popularity',
    :limit => n
  )
end

$ ruby ./test/unit/user_test -n test_popular
brickhouse:~/code/icalico/trunk/test/unit rabble$ ruby user_test.rb -n /popular/
Loaded suite user_test
Started
F
Finished in 0.290563 seconds.
  1) Failure:
test_popular(UserTest) [user_test.rb:10]:
Exception raised:
Class: <NoMethodError>
Message: <quot;You have a nil object when you didn't expect it!nThe error occured
while evaluating nil.attendeesquot;>
---Backtrace---
/Users/rabble/code/icalico/trunk/config/../app/models/user.rb:35:in `find_popular'
user_test.rb:10:in `test_popular'
user_test.rb:10:in `test_popular'
---------------
Refactor
 def self.find_popular(n=20)
  return self.find(:all,
    :select => quot;users.*, count(talks_users.user_id) as popularityquot;,
    :conditions => [quot;users.conference_id = ? quot;, conference.id],
    :joins => quot;LEFT JOIN talks_users on users.id = talks_users.user_idquot;,
    :group => quot;talks_users.user_idquot;,
    :order => 'popularity',
    :limit => n )
end

$ ruby ./test/unit/user_test -n test_popular
brickhouse:~/code/icalico/trunk/test/unit rabble$ ruby user_test.rb -n /popular/
Loaded suite user_test
Started
.
Finished in 0.290563 seconds.
build test from logs

 ./log/development.log
 Processing ArticlesController#show
  (for 0.0.0.0 at 2006-07-20 11:28:23) [GET]
  Session ID:
  Parameters: {quot;actionquot;=>quot;showquot;, quot;idquot;=>quot;2quot;, quot;controllerquot;=>quot;articlesquot;}
  Article Load (0.002371) SELECT * FROM articles LIMIT 1
 Rendering within layouts/articles
 Rendering articles/show
  Article Columns (0.007194) SHOW FIELDS FROM articles
 Completed in 0.10423 (9 reqs/sec) |
 Rendering: 0.08501 (81%) |
 DB: 0.01022 (9%) |
 200 OK [http://test.host/articles/show/1]
the functional test
./test/functional/article_controller_test.rb
 require File.dirname(__FILE__) + '/../test_helper'
 require 'articles_controller'

 # Re-raise errors caught by the controller.
 class ArticlesController
  def rescue_action(e)
      raise e
    end
 end

 class ArticlesControllerTest &lt; Test::Unit::TestCase
  def setup
    @controller = ArticlesController.new
    @request = ActionController::TestRequest.new
    @response = ActionController::TestResponse.new
  end

  # Replace this with your real tests.
  def test_truth
   assert true
  end
 end
get the params

./log/development.log
Processing ArticlesController#show
 (for 0.0.0.0 at 2006-07-20 11:28:23) [GET]
 Session ID:
 Parameters: {quot;actionquot;=>quot;showquot;, quot;idquot;=>quot;2quot;, quot;controllerquot;=>quot;articlesquot;}
 Article Load (0.002371) SELECT * FROM articles LIMIT 1
Rendering within layouts/articles
Rendering articles/show
 Article Columns (0.007194) SHOW FIELDS FROM articles
Completed in 0.10423 (9 reqs/sec) |
Rendering: 0.08501 (81%) |
DB: 0.01022 (9%) |
200 OK [http://test.host/articles/show/1]
what to test?
1. Assert that the page action
rendered and returned successful
HTTP response code, i.e. 200.
2. Assert that the correct
template was rendered.
3. Assert that action assigns a
value to the @article variable.
4. Assert that the right @article
object was loaded.
writing the test
./test/functional/article_controller_test.rb

 def test_show
  get :show, {quot;actionquot;=>quot;showquot;, quot;idquot;=>quot;2quot;, quot;controllerquot;=>quot;articlesquot;}

  #confirm that the http response was a 200 (i.e. success)
  assert_response :success

  #confirm that the correct template was used for this action
  assert_template 'articles/show'

  #confirm that the variable @article was assigned a value
  assert assigns( :article )

  #confirm that the @article object loaded has the id we want
  assert_equal 2, assigns( :article ).id
 end
running the test

 rabble:~/code/tblog/test/functional evan$ ruby 
articles_controller_test.rb -n test_show
Loaded suite articles_controller_test
Started
F
Finished in 0.625045 seconds.

1) Failure: test_show(ArticlesControllerTest)

 [articles_controller_test.rb:27]:
 <2> expected but was <1>.

1 tests, 4 assertions, 1 failures, 0 errors
fix the bug

The old code
app/controller/articles_controller.rb:

 def show
  @article = Article.find(:first)
 end

The fix is easy, we update it so the Article.find method

app/controller/articles_controller.rb:

 def show
  @article = Article.find(params[:id])
 end
running the test

rabble:~/code/tblog/test/functional evan$ ruby 
articles_controller_test.rb -n test_show
Loaded suite articles_controller_test
Started
.
Finished in 0.426828 seconds.

1 tests, 3 assertions, 0 failures, 0 errors
test coverage
rake stats

brickhouse:~/code/icalico/trunk rabble$ rake stats
(in /Users/rabble/code/icalico/trunk)
+----------------------+-------+-------+---------+---------+-----+-------+
| Name                  | Lines |  LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Helpers               |   107 |   81 |       0|        9|     0|     7|
| Controllers           |   517 |  390 |      10 |      52 |    5|     5|
| Components            |     0|      0|       0|        0|     0|     0|
|   Functional tests    |   416 |  299 |      18 |      58 |    3|     3|
| Models                |   344 |  250 |       8|       37 |    4|     4|
|   Unit tests          |   217 |  159 |       9|       25 |    2|     4|
| Libraries             |   257 |  162 |       4|       32 |    8|     3|
|   Integration tests |       0|      0|       0|        0|     0|     0|
+----------------------+-------+-------+---------+---------+-----+-------+
| Total                 | 1858 | 1341 |       49 |     213 |    4|     4|
+----------------------+-------+-------+---------+---------+-----+-------+
  Code LOC: 883      Test LOC: 458    Code to Test Ratio: 1:0.5
rcov test coverage
rcov test coverage


what
needs to
be tested?
rcov test coverage


what gets
executed
when you
run tests
rcov test coverage
summary
rcov test coverage
per file reports
Heckle


more later
on this
autotest




 because sometimes our
tests can run themselves
autotest
Continuous Integration
You can go deeper
Fixtures
Ugliness

ar_fixtures
use mocks
fixture senarios
zentest
focus on the bugs
Flickr Photos
•http://flickr.com/photos/maguisso/247357791/
•http://flickr.com/photos/jurvetson/482054617/
•http://flickr.com/photos/candiedwomanire/352027/
•http://flickr.com/photos/mr_fabulous/481255392/
•http://flickr.com/photos/dharmasphere/125138024/
•http://flickr.com/photos/misshaley/450106803/
•http://flickr.com/photos/19684903@N00/317182464/
•http://flickr.com/photos/planeta/349424552/
•http://flickr.com/photos/izarbeltza/411729344/
•http://flickr.com/photos/mikedefiant/447379072/
•http://flickr.com/photos/fofurasfelinas/74553343/
•http://flickr.com/photos/thomashawk/422057690/
•http://flickr.com/photos/cesarcabrera/396501977/
•http://flickr.com/photos/thearchigeek/418967228/
•http://flickr.com/photos/thomashawk/476897084/
•http://flickr.com/photos/gini/123489837/
•http://flickr.com/photos/neilw/233087821/
•http://flickr.com/photos/good_day/450356635/
•http://flickr.com/photos/ronwired/424730482/
•http://flickr.com/photos/monster/148765721/
•http://flickr.com/photos/monkeyc/200815386/
•http://flickr.com/photos/charlesfred/243202440
•http://flickr.com/photos/dramaqueennorma/191063346/
•http://flickr.com/photos/incognita_mod/433543605/
•http://flickr.com/photos/filicudi/272592045/
•http://flickr.com/photos/martinlabar/163107859/
•http://flickr.com/photos/gaspi/6281982/
•http://flickr.com/photos/iboy_daniel/98784857/
•http://flickr.com/photos/silvia31163/199478324/
•http://flickr.com/photos/tjt195/68790873/
•http://flickr.com/photos/nidriel/103210579/
•http://flickr.com/photos/charlietakesphotos/25951293/
•http://flickr.com/photos/leia/29147578/
•http://flickr.com/photos/90361640@N00/282104656/
Get Your
Feet Wet


                                Next:
Evan ‘rabble’ Henshaw-Plath
Yahoo! Brickhouse
anarchogeek.com
                                Heckle
testingrails.com
slides: slideshare.net/rabble

More Related Content

What's hot

Unit Testing RPG with JUnit
Unit Testing RPG with JUnitUnit Testing RPG with JUnit
Unit Testing RPG with JUnit
Greg.Helton
 
20111018 boost and gtest
20111018 boost and gtest20111018 boost and gtest
20111018 boost and gtest
Will Shen
 

What's hot (20)

TDD, BDD and mocks
TDD, BDD and mocksTDD, BDD and mocks
TDD, BDD and mocks
 
JAVASCRIPT Test Driven Development & Jasmine
JAVASCRIPT Test Driven Development & JasmineJAVASCRIPT Test Driven Development & Jasmine
JAVASCRIPT Test Driven Development & Jasmine
 
AngularJS Unit Test
AngularJS Unit TestAngularJS Unit Test
AngularJS Unit Test
 
iOS Unit Testing
iOS Unit TestingiOS Unit Testing
iOS Unit Testing
 
Intro to Unit Testing in AngularJS
Intro to Unit Testing in AngularJSIntro to Unit Testing in AngularJS
Intro to Unit Testing in AngularJS
 
Unit testing of java script and angularjs application using Karma Jasmine Fra...
Unit testing of java script and angularjs application using Karma Jasmine Fra...Unit testing of java script and angularjs application using Karma Jasmine Fra...
Unit testing of java script and angularjs application using Karma Jasmine Fra...
 
How to test models using php unit testing framework?
How to test models using php unit testing framework?How to test models using php unit testing framework?
How to test models using php unit testing framework?
 
Testing in-python-and-pytest-framework
Testing in-python-and-pytest-frameworkTesting in-python-and-pytest-framework
Testing in-python-and-pytest-framework
 
Unit Testing and Coverage for AngularJS
Unit Testing and Coverage for AngularJSUnit Testing and Coverage for AngularJS
Unit Testing and Coverage for AngularJS
 
Interpreter RPG to Java
Interpreter RPG to JavaInterpreter RPG to Java
Interpreter RPG to Java
 
RPG Program for Unit Testing RPG
RPG Program for Unit Testing RPG RPG Program for Unit Testing RPG
RPG Program for Unit Testing RPG
 
Unit Testing in iOS
Unit Testing in iOSUnit Testing in iOS
Unit Testing in iOS
 
AngularJS Unit Testing w/Karma and Jasmine
AngularJS Unit Testing w/Karma and JasmineAngularJS Unit Testing w/Karma and Jasmine
AngularJS Unit Testing w/Karma and Jasmine
 
Unit Testing RPG with JUnit
Unit Testing RPG with JUnitUnit Testing RPG with JUnit
Unit Testing RPG with JUnit
 
Unit Test Your Database
Unit Test Your DatabaseUnit Test Your Database
Unit Test Your Database
 
The Art of Unit Testing - Towards a Testable Design
The Art of Unit Testing - Towards a Testable DesignThe Art of Unit Testing - Towards a Testable Design
The Art of Unit Testing - Towards a Testable Design
 
20111018 boost and gtest
20111018 boost and gtest20111018 boost and gtest
20111018 boost and gtest
 
Applying TDD to Legacy Code
Applying TDD to Legacy CodeApplying TDD to Legacy Code
Applying TDD to Legacy Code
 
Cursus phpunit
Cursus phpunitCursus phpunit
Cursus phpunit
 
Angular testing
Angular testingAngular testing
Angular testing
 

Similar to Testing Legacy Rails Apps

Intro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran MizrahiIntro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran Mizrahi
Ran Mizrahi
 
Background Jobs - Com BackgrounDRb
Background Jobs - Com BackgrounDRbBackground Jobs - Com BackgrounDRb
Background Jobs - Com BackgrounDRb
Juan Maiz
 
Tdd for BT E2E test community
Tdd for BT E2E test communityTdd for BT E2E test community
Tdd for BT E2E test community
Kerry Buckley
 

Similar to Testing Legacy Rails Apps (20)

How To Test Everything
How To Test EverythingHow To Test Everything
How To Test Everything
 
Javascript tdd byandreapaciolla
Javascript tdd byandreapaciollaJavascript tdd byandreapaciolla
Javascript tdd byandreapaciolla
 
Rails Testing
Rails TestingRails Testing
Rails Testing
 
Intro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran MizrahiIntro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran Mizrahi
 
Rspec
RspecRspec
Rspec
 
2011-02-03 LA RubyConf Rails3 TDD Workshop
2011-02-03 LA RubyConf Rails3 TDD Workshop2011-02-03 LA RubyConf Rails3 TDD Workshop
2011-02-03 LA RubyConf Rails3 TDD Workshop
 
Test Drive Development in Ruby On Rails
Test Drive Development in Ruby On RailsTest Drive Development in Ruby On Rails
Test Drive Development in Ruby On Rails
 
Fundamental Concepts of React JS for Beginners.pdf
Fundamental Concepts of React JS for Beginners.pdfFundamental Concepts of React JS for Beginners.pdf
Fundamental Concepts of React JS for Beginners.pdf
 
Angular Optimization Web Performance Meetup
Angular Optimization Web Performance MeetupAngular Optimization Web Performance Meetup
Angular Optimization Web Performance Meetup
 
Background Jobs - Com BackgrounDRb
Background Jobs - Com BackgrounDRbBackground Jobs - Com BackgrounDRb
Background Jobs - Com BackgrounDRb
 
[xp2013] Narrow Down What to Test
[xp2013] Narrow Down What to Test[xp2013] Narrow Down What to Test
[xp2013] Narrow Down What to Test
 
How to perform debounce in react
How to perform debounce in reactHow to perform debounce in react
How to perform debounce in react
 
Ruby on rails integration testing with minitest and capybara
Ruby on rails integration testing with minitest and capybaraRuby on rails integration testing with minitest and capybara
Ruby on rails integration testing with minitest and capybara
 
AngularJs Crash Course
AngularJs Crash CourseAngularJs Crash Course
AngularJs Crash Course
 
Ruby/Rails
Ruby/RailsRuby/Rails
Ruby/Rails
 
Speedy TDD with Rails
Speedy TDD with RailsSpeedy TDD with Rails
Speedy TDD with Rails
 
Rtt preso
Rtt presoRtt preso
Rtt preso
 
Tdd for BT E2E test community
Tdd for BT E2E test communityTdd for BT E2E test community
Tdd for BT E2E test community
 
[Srijan Wednesday Webinar] Rails 5: What's in It for Me?
[Srijan Wednesday Webinar] Rails 5: What's in It for Me?[Srijan Wednesday Webinar] Rails 5: What's in It for Me?
[Srijan Wednesday Webinar] Rails 5: What's in It for Me?
 
Ruby on Rails - Introduction
Ruby on Rails - IntroductionRuby on Rails - Introduction
Ruby on Rails - Introduction
 

More from Rabble .

Desde Software Libre Hacia Datos Abiertos
Desde Software Libre Hacia Datos AbiertosDesde Software Libre Hacia Datos Abiertos
Desde Software Libre Hacia Datos Abiertos
Rabble .
 

More from Rabble . (14)

CoDesign CMS.362/CMS.862 MIT Evolution of Product Design
CoDesign CMS.362/CMS.862 MIT Evolution of Product DesignCoDesign CMS.362/CMS.862 MIT Evolution of Product Design
CoDesign CMS.362/CMS.862 MIT Evolution of Product Design
 
Building a Hacker Culture in Uruguay - OSCON 2011
Building a Hacker Culture in Uruguay - OSCON 2011Building a Hacker Culture in Uruguay - OSCON 2011
Building a Hacker Culture in Uruguay - OSCON 2011
 
La Historia Secreta de Twitter & El Modelo de los Lean Startups
La Historia Secreta de Twitter & El Modelo de los  Lean StartupsLa Historia Secreta de Twitter & El Modelo de los  Lean Startups
La Historia Secreta de Twitter & El Modelo de los Lean Startups
 
Ruby Culture
Ruby CultureRuby Culture
Ruby Culture
 
Finding the Middle Way of Testing
Finding the Middle Way of TestingFinding the Middle Way of Testing
Finding the Middle Way of Testing
 
Hacking Frequent Flyer Programs
Hacking Frequent Flyer ProgramsHacking Frequent Flyer Programs
Hacking Frequent Flyer Programs
 
Desde Software Libre Hacia Datos Abiertos
Desde Software Libre Hacia Datos AbiertosDesde Software Libre Hacia Datos Abiertos
Desde Software Libre Hacia Datos Abiertos
 
Sobre Hombros de Gigantes: Desarrollo de tecnología y la historia secreto de...
Sobre Hombros de Gigantes: Desarrollo de tecnología y  la historia secreto de...Sobre Hombros de Gigantes: Desarrollo de tecnología y  la historia secreto de...
Sobre Hombros de Gigantes: Desarrollo de tecnología y la historia secreto de...
 
Beyond Testing: Specs and Behavior Driven Development
Beyond Testing: Specs and Behavior  Driven DevelopmentBeyond Testing: Specs and Behavior  Driven Development
Beyond Testing: Specs and Behavior Driven Development
 
Beyond REST? Building Data Services with XMPP PubSub
Beyond REST? Building Data Services with XMPP PubSubBeyond REST? Building Data Services with XMPP PubSub
Beyond REST? Building Data Services with XMPP PubSub
 
Liberating Location - Fire Eagle - Ecomm 2008
Liberating Location - Fire Eagle - Ecomm 2008Liberating Location - Fire Eagle - Ecomm 2008
Liberating Location - Fire Eagle - Ecomm 2008
 
Introduction to Active Record at MySQL Conference 2007
Introduction to Active Record at MySQL Conference 2007Introduction to Active Record at MySQL Conference 2007
Introduction to Active Record at MySQL Conference 2007
 
Introduction to Active Record - Silicon Valley Ruby Conference 2007
Introduction to Active Record - Silicon Valley Ruby Conference 2007Introduction to Active Record - Silicon Valley Ruby Conference 2007
Introduction to Active Record - Silicon Valley Ruby Conference 2007
 
Phone Communities and Activism Showcase
Phone Communities and Activism ShowcasePhone Communities and Activism Showcase
Phone Communities and Activism Showcase
 

Recently uploaded

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Recently uploaded (20)

Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot ModelNavi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 

Testing Legacy Rails Apps