SlideShare ist ein Scribd-Unternehmen logo
1 von 33
Downloaden Sie, um offline zu lesen
Efficient Rails Test-Driven
       Development

     Wolfram Arnold
    www.rubyfocus.biz

    In collaboration with:
Sarah Allen, BlazingCloud.net
       marakana.com
Class Outline

Week #1
  The economics of testing
  Testing in layers, design patterns
  Toolbox: RSpec with Rails
  RSpec & Models


Week #2
  A culture of testing: Why TDD? How to TDD?
  Testing & Data Dependencies
  Toolbox: Fixtures, Factories, Mocks & Stubs
Class Outline

Week #3
  Controller testing
  View, Helper, Routes Testing
  How much is enough? How much is too much?


Week #4
  Refactoring code & tests, custom matchers
  API Testing
  Remote data setup
  Cucumber for API testing & documentation
Class Outline

Week #5
  Integration Testing—when and how?
  Toolbox: Cucumber, Selenium & Friends
  Page Object Pattern


Week #6
  TDD—what next?
  BDD, Agile Process, XP → VDD: Value-Driven
   Development
  Advanced/Special Requests
What you can expect

Presentation, Examples
Answers to questions
A range of material from current development
  practice
Homework
Fluidity & adaptability
Fun
It works best, when...

Active participation
Try something new
Focus
Team Effort
  Pairing
  Utilizing the resources in class: TA's, participants
Discussions in public
  Class Q&A
  Mailing list
Efficient Rails Test-Driven
       Development
Why “efficient” and “testing”?

“Testing takes too much time.”
“It's more efficient to test later.”
“Testing is the responsibility of QA, not
  developers.”
“It's not practical to test X.”
   Tests break when data changes.
   Tests break when design changes.
The Role of Testing

Development without tests...
  fails to empower developers to efficiently take
    responsibility for quality of the code delivered
  makes collaboration harder
  build narrow silos of expertise
  instills fear & resistance to change
  makes documentation a chore
  stops being efficient very soon
TDD: Keeping cost of change low
Cost per change
                              without
                               TDD




                                  with
                                  TDD




                                   Time
Why?

Non-TDD
 Accumulates “technical debt” unchecked
 Removal of technical debt carries risk
    The more technical debt, the higher the risk
 Existing technical debt attracts more technical debt
    Like compound interest
    People are most likely to do what others did before them
    To break the pattern heroic discipline & coordination
      required
Testing in Layers

 Application, Browser UI           Selenium


                              RSpec Integration       Test::Unit Integration
   Application, Server
                              Cucumber, Webrat

                            RSpec           RSpec
 Views           Helpers
                            Views           Helpers

                            RSpec           RSpec     Test::Unit Functional
Controller       Routes
                           Controller       Routes

                                    RSpec             Test::Unit
         Model
                                    Model
Cost of Testing
                           Layers


 Application, Browser UI



   Application, Server



 Views           Helpers



Controller       Routes



         Model



                                    Cost
Cost of Testing
                           Relationship to data


                           most
 Application, Browser UI   removed


   Application, Server



 Views           Helpers



Controller       Routes



         Model             closest



                                                  Cost
Best ROI for Testing
                           Layers


 Application, Browser UI



   Application, Server



 Views           Helpers



Controller       Routes



         Model



                                    Impact/Line of Test Code
TDD & Design Patterns

Skinny Controller—   ➢   Designed to move logic
 Fat Model               from higher to lower
DRY                      application layers
named_scope          ➢   Following design
                         patterns makes testing
Proxy Associations       easier
Validations          ➢   Code written following
...                      TDD economics will
                         naturally converge on
                         these design patterns!
Structure of Tests

Setup
Expected value
Actual value
Verification: actual == expected?
Teardown
Good Tests are...

Compact
Responsible for testing one concern only
Fast
DRY
RSpec Verifications

should respond_to
should be_nil
   → works with any ? method (so-called “predicates”)
should be_valid
should_not be_nil; should_not be_valid
lambda {...}.should change(), {}, .from().to(), .by()
should eql, ==, equal
RSpec Structure

before, before(:each), before(:all)
after, after(:each), after(:all)
describe do...end, nested
it do... end
Let's do some coding

Demo
Models: What to test?

Validation Rules
Associations
Any custom method
Association Proxy Methods
Let's do some coding

Exercise, but wait...
Test-First Teaching

Pioneered by Sarah Allen
  Instructor writes tests
  Students write code


What about writing tests?
Behavior-First Teaching

Instructor specifies desired behavior
  in plain English
  like a user story
Students write tests
Students write code to make tests pass
Story Exercise #1

A Person object must have a first and last name.
A Person object can construct a full name from
  the first and last name.
A Person object has an optional middle name.
A Person object returns a full name including, if
  present, the middle name.
RSpec ==, eql, equal

obj.should == 5            5 == 5
obj.should eql(5)          5.eql 5
obj.should equal(5)        5.equal 5
Object Equality vs. Identity         Use ==
eql, ==      compare values          Unless you know you
                                     need something else
equal, === compare objects,
           classes

          Warning! Do not use != with RSpec.
          Use should_not instead.
RSpec should change

lambda {
  Person.create
}.should change(Person, :count).by(1)


lambda {
  @bob.addresses.create(:street => “...”)
}.should change(@bob.addresses, :count).by(1)

              nd
Warning: The 2 example is incorrect!
RSpec should change

lambda {
  # code that causes a change
}.should change(object, :method).by(difference)
or
should change(object,
  :method).from(initial).to(final)


The object typically is a class, if not, be wary of
 reload!
should change with block

lambda {
  # code that causes a change
}.should change { expression }.by(difference)
or
should change { expression }.from(initial).to(final)
better with block

lambda {
  @bob.addresses.create(:street => “...”)
}.should change {
  @bob.addresses(true).count }.by(1)
Homework

A Person should save correctly.
A Person can have many Addresses.
A Person's Address must have a street, city and
  zip.
A Person's Address can have an optional country.
If the country is left blank, it should default to
   “USA” prior to saving.
BizConf

                                Aug 4-6, 2010
                                Amelia Island, FL
                                Discount code: WOLF
Rails & Web App
Professionals, Entrepreneurs,
                                for 43% off
Consultants                     http://bizconf.org?
Small group                       coupon=WOLF
Network with Who's Who
Organized by Obie
Fernandez of Hashrocket
Highlight: David Allen

Weitere ähnliche Inhalte

Was ist angesagt?

Angular Application Testing
Angular Application TestingAngular Application Testing
Angular Application TestingTroy Miles
 
Karate - Web-Service API Testing Made Simple
Karate - Web-Service API Testing Made SimpleKarate - Web-Service API Testing Made Simple
Karate - Web-Service API Testing Made SimpleVodqaBLR
 
API Test Automation Using Karate (Anil Kumar Moka)
API Test Automation Using Karate (Anil Kumar Moka)API Test Automation Using Karate (Anil Kumar Moka)
API Test Automation Using Karate (Anil Kumar Moka)Peter Thomas
 
Karate - MoT Dallas 26-Oct-2017
Karate - MoT Dallas 26-Oct-2017Karate - MoT Dallas 26-Oct-2017
Karate - MoT Dallas 26-Oct-2017Peter Thomas
 
Real World Fun with ActiveResource
Real World Fun with ActiveResourceReal World Fun with ActiveResource
Real World Fun with ActiveResourceRob C
 
Automate right start from API
Automate right start from APIAutomate right start from API
Automate right start from APIRoman Liubun
 
Refactoring @ Mindvalley: Smells, Techniques and Patterns
Refactoring @ Mindvalley: Smells, Techniques and PatternsRefactoring @ Mindvalley: Smells, Techniques and Patterns
Refactoring @ Mindvalley: Smells, Techniques and PatternsTristan Gomez
 
Behavior Driven Development with Cucumber
Behavior Driven Development with CucumberBehavior Driven Development with Cucumber
Behavior Driven Development with CucumberAsheesh Mehdiratta
 
django Forms in a Web API World
django Forms in a Web API Worlddjango Forms in a Web API World
django Forms in a Web API WorldTareque Hossain
 
BDD style Unit Testing
BDD style Unit TestingBDD style Unit Testing
BDD style Unit TestingWen-Tien Chang
 
Using the latest Java Persistence API 2 Features - Tech Days 2010 India
Using the latest Java Persistence API 2 Features - Tech Days 2010 IndiaUsing the latest Java Persistence API 2 Features - Tech Days 2010 India
Using the latest Java Persistence API 2 Features - Tech Days 2010 IndiaArun Gupta
 
A Deep Dive into the W3C WebDriver Specification
A Deep Dive into the W3C WebDriver SpecificationA Deep Dive into the W3C WebDriver Specification
A Deep Dive into the W3C WebDriver SpecificationPeter Thomas
 
2016 - Serverless Microservices on AWS with API Gateway and Lambda
2016 - Serverless Microservices on AWS with API Gateway and Lambda2016 - Serverless Microservices on AWS with API Gateway and Lambda
2016 - Serverless Microservices on AWS with API Gateway and Lambdadevopsdaysaustin
 
Metaprogramming JavaScript
Metaprogramming  JavaScriptMetaprogramming  JavaScript
Metaprogramming JavaScriptdanwrong
 
Introduction to testing in Rails
Introduction to testing in RailsIntroduction to testing in Rails
Introduction to testing in Railsbenlcollins
 
ExpertTalks Manchester September 2018
ExpertTalks Manchester September 2018ExpertTalks Manchester September 2018
ExpertTalks Manchester September 2018Tessa Ledwith
 
Ibm_interconnect_restapi_workshop
Ibm_interconnect_restapi_workshopIbm_interconnect_restapi_workshop
Ibm_interconnect_restapi_workshopShubhra Kar
 

Was ist angesagt? (20)

Angular Application Testing
Angular Application TestingAngular Application Testing
Angular Application Testing
 
Karate - Web-Service API Testing Made Simple
Karate - Web-Service API Testing Made SimpleKarate - Web-Service API Testing Made Simple
Karate - Web-Service API Testing Made Simple
 
API Test Automation Using Karate (Anil Kumar Moka)
API Test Automation Using Karate (Anil Kumar Moka)API Test Automation Using Karate (Anil Kumar Moka)
API Test Automation Using Karate (Anil Kumar Moka)
 
Karate - MoT Dallas 26-Oct-2017
Karate - MoT Dallas 26-Oct-2017Karate - MoT Dallas 26-Oct-2017
Karate - MoT Dallas 26-Oct-2017
 
Real World Fun with ActiveResource
Real World Fun with ActiveResourceReal World Fun with ActiveResource
Real World Fun with ActiveResource
 
Automate right start from API
Automate right start from APIAutomate right start from API
Automate right start from API
 
Refactoring @ Mindvalley: Smells, Techniques and Patterns
Refactoring @ Mindvalley: Smells, Techniques and PatternsRefactoring @ Mindvalley: Smells, Techniques and Patterns
Refactoring @ Mindvalley: Smells, Techniques and Patterns
 
Behavior Driven Development with Cucumber
Behavior Driven Development with CucumberBehavior Driven Development with Cucumber
Behavior Driven Development with Cucumber
 
django Forms in a Web API World
django Forms in a Web API Worlddjango Forms in a Web API World
django Forms in a Web API World
 
BDD style Unit Testing
BDD style Unit TestingBDD style Unit Testing
BDD style Unit Testing
 
Using the latest Java Persistence API 2 Features - Tech Days 2010 India
Using the latest Java Persistence API 2 Features - Tech Days 2010 IndiaUsing the latest Java Persistence API 2 Features - Tech Days 2010 India
Using the latest Java Persistence API 2 Features - Tech Days 2010 India
 
A Deep Dive into the W3C WebDriver Specification
A Deep Dive into the W3C WebDriver SpecificationA Deep Dive into the W3C WebDriver Specification
A Deep Dive into the W3C WebDriver Specification
 
Karate DSL
Karate DSLKarate DSL
Karate DSL
 
2016 - Serverless Microservices on AWS with API Gateway and Lambda
2016 - Serverless Microservices on AWS with API Gateway and Lambda2016 - Serverless Microservices on AWS with API Gateway and Lambda
2016 - Serverless Microservices on AWS with API Gateway and Lambda
 
Metaprogramming JavaScript
Metaprogramming  JavaScriptMetaprogramming  JavaScript
Metaprogramming JavaScript
 
Refactoring
RefactoringRefactoring
Refactoring
 
Introduction to testing in Rails
Introduction to testing in RailsIntroduction to testing in Rails
Introduction to testing in Rails
 
ExpertTalks Manchester September 2018
ExpertTalks Manchester September 2018ExpertTalks Manchester September 2018
ExpertTalks Manchester September 2018
 
Ibm_interconnect_restapi_workshop
Ibm_interconnect_restapi_workshopIbm_interconnect_restapi_workshop
Ibm_interconnect_restapi_workshop
 
Cqrs api
Cqrs apiCqrs api
Cqrs api
 

Andere mochten auch

Nine at Mary Brickell Village brochure
Nine at Mary Brickell Village brochureNine at Mary Brickell Village brochure
Nine at Mary Brickell Village brochureLucas Lechuga
 
Cache Money Talk: Practical Application
Cache Money Talk: Practical ApplicationCache Money Talk: Practical Application
Cache Money Talk: Practical ApplicationWolfram Arnold
 
Paraiso Bay floor plans
Paraiso Bay floor plansParaiso Bay floor plans
Paraiso Bay floor plansLucas Lechuga
 
2009 07 21: Nested Attributes
2009 07 21: Nested Attributes2009 07 21: Nested Attributes
2009 07 21: Nested AttributesWolfram Arnold
 
Axis Brickell Floor Plans
Axis Brickell Floor PlansAxis Brickell Floor Plans
Axis Brickell Floor PlansLucas Lechuga
 
Faena House floor plans
Faena House floor plansFaena House floor plans
Faena House floor plansLucas Lechuga
 

Andere mochten auch (7)

Acts As Most Popular
Acts As Most PopularActs As Most Popular
Acts As Most Popular
 
Nine at Mary Brickell Village brochure
Nine at Mary Brickell Village brochureNine at Mary Brickell Village brochure
Nine at Mary Brickell Village brochure
 
Cache Money Talk: Practical Application
Cache Money Talk: Practical ApplicationCache Money Talk: Practical Application
Cache Money Talk: Practical Application
 
Paraiso Bay floor plans
Paraiso Bay floor plansParaiso Bay floor plans
Paraiso Bay floor plans
 
2009 07 21: Nested Attributes
2009 07 21: Nested Attributes2009 07 21: Nested Attributes
2009 07 21: Nested Attributes
 
Axis Brickell Floor Plans
Axis Brickell Floor PlansAxis Brickell Floor Plans
Axis Brickell Floor Plans
 
Faena House floor plans
Faena House floor plansFaena House floor plans
Faena House floor plans
 

Ähnlich wie 2010-07-19_rails_tdd_week1

Pragmatic Architecture in .NET
Pragmatic Architecture in .NETPragmatic Architecture in .NET
Pragmatic Architecture in .NEThousecor
 
Agile Development in .NET
Agile Development in .NETAgile Development in .NET
Agile Development in .NETdanhermes
 
The "Holy Grail" of Dev/Ops
The "Holy Grail" of Dev/OpsThe "Holy Grail" of Dev/Ops
The "Holy Grail" of Dev/OpsErik Osterman
 
Sr_Lead_QA_April_2016
Sr_Lead_QA_April_2016Sr_Lead_QA_April_2016
Sr_Lead_QA_April_2016Nick Yefimov
 
Better and Faster: A Journey Toward Clean Code and Enjoyment
Better and Faster: A Journey Toward Clean Code and EnjoymentBetter and Faster: A Journey Toward Clean Code and Enjoyment
Better and Faster: A Journey Toward Clean Code and EnjoymentChris Holland
 
CucumberSeleniumWD
CucumberSeleniumWDCucumberSeleniumWD
CucumberSeleniumWDVikas Sarin
 
AWS and Dynatrace: Moving your Cloud Strategy to the Next Level
AWS and Dynatrace: Moving your Cloud Strategy to the Next LevelAWS and Dynatrace: Moving your Cloud Strategy to the Next Level
AWS and Dynatrace: Moving your Cloud Strategy to the Next LevelDynatrace
 
Measuring Your Code
Measuring Your CodeMeasuring Your Code
Measuring Your CodeNate Abele
 
Measuring Your Code 2.0
Measuring Your Code 2.0Measuring Your Code 2.0
Measuring Your Code 2.0Nate Abele
 
Behavior Driven Development by Example
Behavior Driven Development by ExampleBehavior Driven Development by Example
Behavior Driven Development by ExampleNalin Goonawardana
 
The Next Five Years of Rails
The Next Five Years of RailsThe Next Five Years of Rails
The Next Five Years of RailsAlex Mercer
 
Cost Effective Web Application Testing
Cost Effective Web Application TestingCost Effective Web Application Testing
Cost Effective Web Application TestingHari Pudipeddi
 
Cost effective web application testing
Cost effective web application testingCost effective web application testing
Cost effective web application testingHarinath Pudipeddi
 
Cost effective web application testing
Cost effective web application testingCost effective web application testing
Cost effective web application testingHarinath Pudipeddi
 
Onion Architecture with S#arp
Onion Architecture with S#arpOnion Architecture with S#arp
Onion Architecture with S#arpGary Pedretti
 
Approaching ATDD/BDD
Approaching ATDD/BDDApproaching ATDD/BDD
Approaching ATDD/BDDDhaval Dalal
 

Ähnlich wie 2010-07-19_rails_tdd_week1 (20)

Pragmatic Architecture in .NET
Pragmatic Architecture in .NETPragmatic Architecture in .NET
Pragmatic Architecture in .NET
 
Ruby On Rails
Ruby On RailsRuby On Rails
Ruby On Rails
 
Agile Development in .NET
Agile Development in .NETAgile Development in .NET
Agile Development in .NET
 
The "Holy Grail" of Dev/Ops
The "Holy Grail" of Dev/OpsThe "Holy Grail" of Dev/Ops
The "Holy Grail" of Dev/Ops
 
Sr_Lead_QA_April_2016
Sr_Lead_QA_April_2016Sr_Lead_QA_April_2016
Sr_Lead_QA_April_2016
 
Better and Faster: A Journey Toward Clean Code and Enjoyment
Better and Faster: A Journey Toward Clean Code and EnjoymentBetter and Faster: A Journey Toward Clean Code and Enjoyment
Better and Faster: A Journey Toward Clean Code and Enjoyment
 
CucumberSeleniumWD
CucumberSeleniumWDCucumberSeleniumWD
CucumberSeleniumWD
 
AWS and Dynatrace: Moving your Cloud Strategy to the Next Level
AWS and Dynatrace: Moving your Cloud Strategy to the Next LevelAWS and Dynatrace: Moving your Cloud Strategy to the Next Level
AWS and Dynatrace: Moving your Cloud Strategy to the Next Level
 
Measuring Your Code
Measuring Your CodeMeasuring Your Code
Measuring Your Code
 
Measuring Your Code 2.0
Measuring Your Code 2.0Measuring Your Code 2.0
Measuring Your Code 2.0
 
Behavior Driven Development by Example
Behavior Driven Development by ExampleBehavior Driven Development by Example
Behavior Driven Development by Example
 
The Next Five Years of Rails
The Next Five Years of RailsThe Next Five Years of Rails
The Next Five Years of Rails
 
Cost Effective Web Application Testing
Cost Effective Web Application TestingCost Effective Web Application Testing
Cost Effective Web Application Testing
 
Cost effective web application testing
Cost effective web application testingCost effective web application testing
Cost effective web application testing
 
Cost effective web application testing
Cost effective web application testingCost effective web application testing
Cost effective web application testing
 
Resume debasish
Resume debasish Resume debasish
Resume debasish
 
Onion Architecture with S#arp
Onion Architecture with S#arpOnion Architecture with S#arp
Onion Architecture with S#arp
 
Approaching ATDD/BDD
Approaching ATDD/BDDApproaching ATDD/BDD
Approaching ATDD/BDD
 
Coding Naked
Coding NakedCoding Naked
Coding Naked
 
Shaloo Verma
Shaloo VermaShaloo Verma
Shaloo Verma
 

Kürzlich hochgeladen

Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyKhushali Kathiriya
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
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 educationjfdjdjcjdnsjd
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
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 DiscoveryTrustArc
 
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...Martijn de Jong
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...apidays
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
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 FMESafe Software
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsRoshan Dwivedi
 

Kürzlich hochgeladen (20)

Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
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
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
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
 
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...
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
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
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 

2010-07-19_rails_tdd_week1

  • 1. Efficient Rails Test-Driven Development Wolfram Arnold www.rubyfocus.biz In collaboration with: Sarah Allen, BlazingCloud.net marakana.com
  • 2. Class Outline Week #1 The economics of testing Testing in layers, design patterns Toolbox: RSpec with Rails RSpec & Models Week #2 A culture of testing: Why TDD? How to TDD? Testing & Data Dependencies Toolbox: Fixtures, Factories, Mocks & Stubs
  • 3. Class Outline Week #3 Controller testing View, Helper, Routes Testing How much is enough? How much is too much? Week #4 Refactoring code & tests, custom matchers API Testing Remote data setup Cucumber for API testing & documentation
  • 4. Class Outline Week #5 Integration Testing—when and how? Toolbox: Cucumber, Selenium & Friends Page Object Pattern Week #6 TDD—what next? BDD, Agile Process, XP → VDD: Value-Driven Development Advanced/Special Requests
  • 5. What you can expect Presentation, Examples Answers to questions A range of material from current development practice Homework Fluidity & adaptability Fun
  • 6. It works best, when... Active participation Try something new Focus Team Effort Pairing Utilizing the resources in class: TA's, participants Discussions in public Class Q&A Mailing list
  • 8. Why “efficient” and “testing”? “Testing takes too much time.” “It's more efficient to test later.” “Testing is the responsibility of QA, not developers.” “It's not practical to test X.” Tests break when data changes. Tests break when design changes.
  • 9. The Role of Testing Development without tests... fails to empower developers to efficiently take responsibility for quality of the code delivered makes collaboration harder build narrow silos of expertise instills fear & resistance to change makes documentation a chore stops being efficient very soon
  • 10. TDD: Keeping cost of change low Cost per change without TDD with TDD Time
  • 11. Why? Non-TDD Accumulates “technical debt” unchecked Removal of technical debt carries risk The more technical debt, the higher the risk Existing technical debt attracts more technical debt Like compound interest People are most likely to do what others did before them To break the pattern heroic discipline & coordination required
  • 12. Testing in Layers Application, Browser UI Selenium RSpec Integration Test::Unit Integration Application, Server Cucumber, Webrat RSpec RSpec Views Helpers Views Helpers RSpec RSpec Test::Unit Functional Controller Routes Controller Routes RSpec Test::Unit Model Model
  • 13. Cost of Testing Layers Application, Browser UI Application, Server Views Helpers Controller Routes Model Cost
  • 14. Cost of Testing Relationship to data most Application, Browser UI removed Application, Server Views Helpers Controller Routes Model closest Cost
  • 15. Best ROI for Testing Layers Application, Browser UI Application, Server Views Helpers Controller Routes Model Impact/Line of Test Code
  • 16. TDD & Design Patterns Skinny Controller— ➢ Designed to move logic Fat Model from higher to lower DRY application layers named_scope ➢ Following design patterns makes testing Proxy Associations easier Validations ➢ Code written following ... TDD economics will naturally converge on these design patterns!
  • 17. Structure of Tests Setup Expected value Actual value Verification: actual == expected? Teardown
  • 18. Good Tests are... Compact Responsible for testing one concern only Fast DRY
  • 19. RSpec Verifications should respond_to should be_nil → works with any ? method (so-called “predicates”) should be_valid should_not be_nil; should_not be_valid lambda {...}.should change(), {}, .from().to(), .by() should eql, ==, equal
  • 20. RSpec Structure before, before(:each), before(:all) after, after(:each), after(:all) describe do...end, nested it do... end
  • 21. Let's do some coding Demo
  • 22. Models: What to test? Validation Rules Associations Any custom method Association Proxy Methods
  • 23. Let's do some coding Exercise, but wait...
  • 24. Test-First Teaching Pioneered by Sarah Allen Instructor writes tests Students write code What about writing tests?
  • 25. Behavior-First Teaching Instructor specifies desired behavior in plain English like a user story Students write tests Students write code to make tests pass
  • 26. Story Exercise #1 A Person object must have a first and last name. A Person object can construct a full name from the first and last name. A Person object has an optional middle name. A Person object returns a full name including, if present, the middle name.
  • 27. RSpec ==, eql, equal obj.should == 5 5 == 5 obj.should eql(5) 5.eql 5 obj.should equal(5) 5.equal 5 Object Equality vs. Identity Use == eql, == compare values Unless you know you need something else equal, === compare objects, classes Warning! Do not use != with RSpec. Use should_not instead.
  • 28. RSpec should change lambda { Person.create }.should change(Person, :count).by(1) lambda { @bob.addresses.create(:street => “...”) }.should change(@bob.addresses, :count).by(1) nd Warning: The 2 example is incorrect!
  • 29. RSpec should change lambda { # code that causes a change }.should change(object, :method).by(difference) or should change(object, :method).from(initial).to(final) The object typically is a class, if not, be wary of reload!
  • 30. should change with block lambda { # code that causes a change }.should change { expression }.by(difference) or should change { expression }.from(initial).to(final)
  • 31. better with block lambda { @bob.addresses.create(:street => “...”) }.should change { @bob.addresses(true).count }.by(1)
  • 32. Homework A Person should save correctly. A Person can have many Addresses. A Person's Address must have a street, city and zip. A Person's Address can have an optional country. If the country is left blank, it should default to “USA” prior to saving.
  • 33. BizConf Aug 4-6, 2010 Amelia Island, FL Discount code: WOLF Rails & Web App Professionals, Entrepreneurs, for 43% off Consultants http://bizconf.org? Small group coupon=WOLF Network with Who's Who Organized by Obie Fernandez of Hashrocket Highlight: David Allen