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

Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo DiehlFuture Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Peter Udo Diehl
 

Recently uploaded (20)

Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo DiehlFuture Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
Future Visions: Predictions to Guide and Time Tech Innovation, Peter Udo Diehl
 
Portal Kombat : extension du réseau de propagande russe
Portal Kombat : extension du réseau de propagande russePortal Kombat : extension du réseau de propagande russe
Portal Kombat : extension du réseau de propagande russe
 
Oauth 2.0 Introduction and Flows with MuleSoft
Oauth 2.0 Introduction and Flows with MuleSoftOauth 2.0 Introduction and Flows with MuleSoft
Oauth 2.0 Introduction and Flows with MuleSoft
 
FDO for Camera, Sensor and Networking Device – Commercial Solutions from VinC...
FDO for Camera, Sensor and Networking Device – Commercial Solutions from VinC...FDO for Camera, Sensor and Networking Device – Commercial Solutions from VinC...
FDO for Camera, Sensor and Networking Device – Commercial Solutions from VinC...
 
A Business-Centric Approach to Design System Strategy
A Business-Centric Approach to Design System StrategyA Business-Centric Approach to Design System Strategy
A Business-Centric Approach to Design System Strategy
 
Speed Wins: From Kafka to APIs in Minutes
Speed Wins: From Kafka to APIs in MinutesSpeed Wins: From Kafka to APIs in Minutes
Speed Wins: From Kafka to APIs in Minutes
 
Intro in Product Management - Коротко про професію продакт менеджера
Intro in Product Management - Коротко про професію продакт менеджераIntro in Product Management - Коротко про професію продакт менеджера
Intro in Product Management - Коротко про професію продакт менеджера
 
AI revolution and Salesforce, Jiří Karpíšek
AI revolution and Salesforce, Jiří KarpíšekAI revolution and Salesforce, Jiří Karpíšek
AI revolution and Salesforce, Jiří Karpíšek
 
Salesforce Adoption – Metrics, Methods, and Motivation, Antone Kom
Salesforce Adoption – Metrics, Methods, and Motivation, Antone KomSalesforce Adoption – Metrics, Methods, and Motivation, Antone Kom
Salesforce Adoption – Metrics, Methods, and Motivation, Antone Kom
 
Using IESVE for Room Loads Analysis - UK & Ireland
Using IESVE for Room Loads Analysis - UK & IrelandUsing IESVE for Room Loads Analysis - UK & Ireland
Using IESVE for Room Loads Analysis - UK & Ireland
 
Powerful Start- the Key to Project Success, Barbara Laskowska
Powerful Start- the Key to Project Success, Barbara LaskowskaPowerful Start- the Key to Project Success, Barbara Laskowska
Powerful Start- the Key to Project Success, Barbara Laskowska
 
Extensible Python: Robustness through Addition - PyCon 2024
Extensible Python: Robustness through Addition - PyCon 2024Extensible Python: Robustness through Addition - PyCon 2024
Extensible Python: Robustness through Addition - PyCon 2024
 
What's New in Teams Calling, Meetings and Devices April 2024
What's New in Teams Calling, Meetings and Devices April 2024What's New in Teams Calling, Meetings and Devices April 2024
What's New in Teams Calling, Meetings and Devices April 2024
 
Measures in SQL (a talk at SF Distributed Systems meetup, 2024-05-22)
Measures in SQL (a talk at SF Distributed Systems meetup, 2024-05-22)Measures in SQL (a talk at SF Distributed Systems meetup, 2024-05-22)
Measures in SQL (a talk at SF Distributed Systems meetup, 2024-05-22)
 
Designing for Hardware Accessibility at Comcast
Designing for Hardware Accessibility at ComcastDesigning for Hardware Accessibility at Comcast
Designing for Hardware Accessibility at Comcast
 
Easier, Faster, and More Powerful – Notes Document Properties Reimagined
Easier, Faster, and More Powerful – Notes Document Properties ReimaginedEasier, Faster, and More Powerful – Notes Document Properties Reimagined
Easier, Faster, and More Powerful – Notes Document Properties Reimagined
 
Optimizing NoSQL Performance Through Observability
Optimizing NoSQL Performance Through ObservabilityOptimizing NoSQL Performance Through Observability
Optimizing NoSQL Performance Through Observability
 
Overview of Hyperledger Foundation
Overview of Hyperledger FoundationOverview of Hyperledger Foundation
Overview of Hyperledger Foundation
 
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
Behind the Scenes From the Manager's Chair: Decoding the Secrets of Successfu...
 
TopCryptoSupers 12thReport OrionX May2024
TopCryptoSupers 12thReport OrionX May2024TopCryptoSupers 12thReport OrionX May2024
TopCryptoSupers 12thReport OrionX May2024
 

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