SlideShare a Scribd company logo
1 of 9
Disconnecting the
                                Database with
                                ActiveRecord
                                     URUG
                                    1-27-09




Saturday, February 21, 2009
Disconnecting the DB
                              Comes with trade-offs and risks.

                                How big is your suite or how big do you
                                expect it to be?

                                Do you have acceptance or functional
                                tests that test the whole stack?

                                What is the skill level of your team and
                                experience with AR and testing?

                                How comfortable is your team with
                                stubbing?
Saturday, February 21, 2009
The Benefits
        “A unit test that takes longer than 0.10s is a slow unit test.” - Michael Feathers in
                               Working Effectively with Legacy Code

                              Project A

                                2530 examples. Runs in 5:14 minutes.

                                Average example time: 0.1241s

                              Project B (in development) with NullDB

                                692 examples. Runs in 23.38 seconds.

                                Average example time: 0.0338s


Saturday, February 21, 2009
File Organization
                                    Generally run suites separate.

                                    Additional conceptual overhead of
                                    different test files for the same
                                    object.

                                    Get the option to delay running
                                    slower (functional) tests until CI.


          Thats just one way... not the way I do it...


Saturday, February 21, 2009
NullDB
   The way I use it... I mix both types of tests in
        one file. NullDB is On by default:
          require 'nulldb_rspec'
          ActiveRecord::Base.establish_connection(:adapter => :nulldb)

          unless Object.const_defined?(:Functional)
            share_as :Functional do

                   before :all do
                     ActiveRecord::Base.establish_connection(:test)
                   end

              after :all do
                ActiveRecord::Base.establish_connection(:adapter => :nulldb)
              end
            end
          end



Saturday, February 21, 2009
NullDB
           describe PetStore, quot;#special_dogsquot; do

               it quot;should return a list of all the special dogsquot; do
                 # given
                 dogs = [Dog.create!(:name => 'Fido'),
                         Dog.create!(:name => 'Spot'),
                         Dog.create!(:name => 'Cliford')]
                         # nulldb will populate ids

                    #Since Dog.find_by_complex_sql is tested we can stub with comfort
                    Dog.stub!(:find_by_complex_sql).and_return(dogs)

               # when & then
               @pet_store.special_dogs.should == quot;Fido, Spot, and Cliffordquot;
             end
           end

         I work outside-in stubbing any methods with
         SELECTs first, and then test/implement those
                methods against the database.
Saturday, February 21, 2009
NullDB
                              Turn actual database on in example
                                 groups that need a real DB:
                                 describe Dog, quot;.find_by_complex_sqlquot; do
                                   include Functional
                                   it quot;should return ....quot; do
                                     ...
                                   end

                                   it quot;should ...quot; do
                                     ...
                                   end

                                 end




Saturday, February 21, 2009
NullDB
                       Gotchas and associations caveats...
   class Dog < AR::Base
     belongs_to :person
   end

   class Person < AR::Base
     has_many :dogs
   end

   describe Person, quot;#some_method_that_uses_dogsquot; do
     it quot;should ...quot; do
       person = create_person
       dog = create_dog(:person => person) # notice how we associate the person
       person.dogs.inpsect # odd nulldb bug... need to do a patch..
       person.dogs << dog # now we associate the other way

       person.some_method_that_uses_dogs.should ...
     end
   end

Saturday, February 21, 2009
New version of RSpec
                          will having tagging...
         describe Dog, quot;.find_by_complex_sqlquot;, :functional => true do
           it quot;should return ....quot; do
             ...
           end

              it quot;should ...quot; do
                ...
              end

         end
             You’ll be able to run just the examples you want to!
                http://rspec.lighthouseapp.com/projects/5645/tickets/682-conditional-exclusion-of-example-groups




Saturday, February 21, 2009

More Related Content

What's hot

What's hot (8)

Spock: Test Well and Prosper
Spock: Test Well and ProsperSpock: Test Well and Prosper
Spock: Test Well and Prosper
 
Everything is Permitted: Extending Built-ins
Everything is Permitted: Extending Built-insEverything is Permitted: Extending Built-ins
Everything is Permitted: Extending Built-ins
 
Guide to Node.js: Basic to Advanced
Guide to Node.js: Basic to AdvancedGuide to Node.js: Basic to Advanced
Guide to Node.js: Basic to Advanced
 
Advanced AV Foundation (CocoaConf, Aug '11)
Advanced AV Foundation (CocoaConf, Aug '11)Advanced AV Foundation (CocoaConf, Aug '11)
Advanced AV Foundation (CocoaConf, Aug '11)
 
ngCore
ngCorengCore
ngCore
 
Automatic Reference Counting
Automatic Reference CountingAutomatic Reference Counting
Automatic Reference Counting
 
Testing javascript in the frontend
Testing javascript in the frontendTesting javascript in the frontend
Testing javascript in the frontend
 
Painless JavaScript Testing with Jest
Painless JavaScript Testing with JestPainless JavaScript Testing with Jest
Painless JavaScript Testing with Jest
 

Similar to Disconnecting the Database with ActiveRecord

Joxean Koret - Database Security Paradise [Rooted CON 2011]
Joxean Koret - Database Security Paradise [Rooted CON 2011]Joxean Koret - Database Security Paradise [Rooted CON 2011]
Joxean Koret - Database Security Paradise [Rooted CON 2011]
RootedCON
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e big
Andy Peterson
 
Lunch and learn: Cucumber and Capybara
Lunch and learn: Cucumber and CapybaraLunch and learn: Cucumber and Capybara
Lunch and learn: Cucumber and Capybara
Marc Seeger
 
GeeCON 2012 hurdle run through ejb testing
GeeCON 2012 hurdle run through ejb testingGeeCON 2012 hurdle run through ejb testing
GeeCON 2012 hurdle run through ejb testing
Jakub Marchwicki
 

Similar to Disconnecting the Database with ActiveRecord (20)

Joxean Koret - Database Security Paradise [Rooted CON 2011]
Joxean Koret - Database Security Paradise [Rooted CON 2011]Joxean Koret - Database Security Paradise [Rooted CON 2011]
Joxean Koret - Database Security Paradise [Rooted CON 2011]
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e big
 
Getting testy with Perl
Getting testy with PerlGetting testy with Perl
Getting testy with Perl
 
Literate Maruku
Literate MarukuLiterate Maruku
Literate Maruku
 
Beaker: Automated, Cloud-Based Acceptance Testing - PuppetConf 2014
Beaker: Automated, Cloud-Based Acceptance Testing - PuppetConf 2014Beaker: Automated, Cloud-Based Acceptance Testing - PuppetConf 2014
Beaker: Automated, Cloud-Based Acceptance Testing - PuppetConf 2014
 
Lunch and learn: Cucumber and Capybara
Lunch and learn: Cucumber and CapybaraLunch and learn: Cucumber and Capybara
Lunch and learn: Cucumber and Capybara
 
FireWorks workflow software
FireWorks workflow softwareFireWorks workflow software
FireWorks workflow software
 
Lightning talk- testing
Lightning talk- testingLightning talk- testing
Lightning talk- testing
 
Unit Testing Lots of Perl
Unit Testing Lots of PerlUnit Testing Lots of Perl
Unit Testing Lots of Perl
 
Object Trampoline: Why having not the object you want is what you need.
Object Trampoline: Why having not the object you want is what you need.Object Trampoline: Why having not the object you want is what you need.
Object Trampoline: Why having not the object you want is what you need.
 
How to build your query engine in spark
How to build your query engine in sparkHow to build your query engine in spark
How to build your query engine in spark
 
Os Django
Os DjangoOs Django
Os Django
 
GeeCON 2012 hurdle run through ejb testing
GeeCON 2012 hurdle run through ejb testingGeeCON 2012 hurdle run through ejb testing
GeeCON 2012 hurdle run through ejb testing
 
Sbt, idea and eclipse
Sbt, idea and eclipseSbt, idea and eclipse
Sbt, idea and eclipse
 
Ansible slackbot
Ansible slackbotAnsible slackbot
Ansible slackbot
 
Database Management Assignment Help
Database Management Assignment Help Database Management Assignment Help
Database Management Assignment Help
 
The End of the world as we know it - AKA your last NullPointerException $1B b...
The End of the world as we know it - AKA your last NullPointerException $1B b...The End of the world as we know it - AKA your last NullPointerException $1B b...
The End of the world as we know it - AKA your last NullPointerException $1B b...
 
Ruby for C# Developers
Ruby for C# DevelopersRuby for C# Developers
Ruby for C# Developers
 
Test First Teaching
Test First TeachingTest First Teaching
Test First Teaching
 
Hacking with ruby2ruby
Hacking with ruby2rubyHacking with ruby2ruby
Hacking with ruby2ruby
 

More from Ben Mabey

Cucumber: Automating the Requirements Language You Already Speak
Cucumber: Automating the Requirements Language You Already SpeakCucumber: Automating the Requirements Language You Already Speak
Cucumber: Automating the Requirements Language You Already Speak
Ben Mabey
 

More from Ben Mabey (8)

PCA for the uninitiated
PCA for the uninitiatedPCA for the uninitiated
PCA for the uninitiated
 
Clojure, Plain and Simple
Clojure, Plain and SimpleClojure, Plain and Simple
Clojure, Plain and Simple
 
Github flow
Github flowGithub flow
Github flow
 
Cucumber: Automating the Requirements Language You Already Speak
Cucumber: Automating the Requirements Language You Already SpeakCucumber: Automating the Requirements Language You Already Speak
Cucumber: Automating the Requirements Language You Already Speak
 
Writing Software not Code with Cucumber
Writing Software not Code with CucumberWriting Software not Code with Cucumber
Writing Software not Code with Cucumber
 
Outside-In Development With Cucumber
Outside-In Development With CucumberOutside-In Development With Cucumber
Outside-In Development With Cucumber
 
SVD and the Netflix Dataset
SVD and the Netflix DatasetSVD and the Netflix Dataset
SVD and the Netflix Dataset
 
The WHY behind TDD/BDD and the HOW with RSpec
The WHY behind TDD/BDD and the HOW with RSpecThe WHY behind TDD/BDD and the HOW with RSpec
The WHY behind TDD/BDD and the HOW with RSpec
 

Recently uploaded

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
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)

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
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
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
 
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...
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Introduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDMIntroduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDM
 
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
 

Disconnecting the Database with ActiveRecord

  • 1. Disconnecting the Database with ActiveRecord URUG 1-27-09 Saturday, February 21, 2009
  • 2. Disconnecting the DB Comes with trade-offs and risks. How big is your suite or how big do you expect it to be? Do you have acceptance or functional tests that test the whole stack? What is the skill level of your team and experience with AR and testing? How comfortable is your team with stubbing? Saturday, February 21, 2009
  • 3. The Benefits “A unit test that takes longer than 0.10s is a slow unit test.” - Michael Feathers in Working Effectively with Legacy Code Project A 2530 examples. Runs in 5:14 minutes. Average example time: 0.1241s Project B (in development) with NullDB 692 examples. Runs in 23.38 seconds. Average example time: 0.0338s Saturday, February 21, 2009
  • 4. File Organization Generally run suites separate. Additional conceptual overhead of different test files for the same object. Get the option to delay running slower (functional) tests until CI. Thats just one way... not the way I do it... Saturday, February 21, 2009
  • 5. NullDB The way I use it... I mix both types of tests in one file. NullDB is On by default: require 'nulldb_rspec' ActiveRecord::Base.establish_connection(:adapter => :nulldb) unless Object.const_defined?(:Functional) share_as :Functional do before :all do ActiveRecord::Base.establish_connection(:test) end after :all do ActiveRecord::Base.establish_connection(:adapter => :nulldb) end end end Saturday, February 21, 2009
  • 6. NullDB describe PetStore, quot;#special_dogsquot; do it quot;should return a list of all the special dogsquot; do # given dogs = [Dog.create!(:name => 'Fido'), Dog.create!(:name => 'Spot'), Dog.create!(:name => 'Cliford')] # nulldb will populate ids #Since Dog.find_by_complex_sql is tested we can stub with comfort Dog.stub!(:find_by_complex_sql).and_return(dogs) # when & then @pet_store.special_dogs.should == quot;Fido, Spot, and Cliffordquot; end end I work outside-in stubbing any methods with SELECTs first, and then test/implement those methods against the database. Saturday, February 21, 2009
  • 7. NullDB Turn actual database on in example groups that need a real DB: describe Dog, quot;.find_by_complex_sqlquot; do include Functional it quot;should return ....quot; do ... end it quot;should ...quot; do ... end end Saturday, February 21, 2009
  • 8. NullDB Gotchas and associations caveats... class Dog < AR::Base belongs_to :person end class Person < AR::Base has_many :dogs end describe Person, quot;#some_method_that_uses_dogsquot; do it quot;should ...quot; do person = create_person dog = create_dog(:person => person) # notice how we associate the person person.dogs.inpsect # odd nulldb bug... need to do a patch.. person.dogs << dog # now we associate the other way person.some_method_that_uses_dogs.should ... end end Saturday, February 21, 2009
  • 9. New version of RSpec will having tagging... describe Dog, quot;.find_by_complex_sqlquot;, :functional => true do it quot;should return ....quot; do ... end it quot;should ...quot; do ... end end You’ll be able to run just the examples you want to! http://rspec.lighthouseapp.com/projects/5645/tickets/682-conditional-exclusion-of-example-groups Saturday, February 21, 2009

Editor's Notes