SlideShare a Scribd company logo
Changing Your Mindset
Getting Started With Test-Driven Development
Patrick Reagan
Director, Application Development
patrick@viget.com
Overview
  Testing Process
  Test::Unit Introduction
  Code Example: GoogleRank
  Testing Pitfalls
  Coverage Analysis
  Next Steps
Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Test-Driven Development is the
          process of testing the behavior of
                non-existent objects




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Testing Cycle

                                                  Write
                                               Failing Test


                      Refactor                                Write
                                                              Code


                                                 Verify
                                                Success

Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Why Test First?

  No untested code is written
  Start with higher code coverage
  Rapid feedback
  Build your regressions as you go


Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Anatomy of a (Test::Unit) Test Case

                                               Test case

                                               Test setup
                                               (run every test)


                                               Test




                                               Assertion




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Naming Conventions



        Method to test


                                Parameters / Input


                                                     Expected behavior
                                                        (should ...)




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Basic Assertions
         assert


         assert_equal / assert_not_equal

         assert_nil / assert_not_nil


         assert_match / assert_no_match

         assert_raise / assert_nothing_raised




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Code Example
 Class that retrieves Google results
              Retrieves only the top 10 URLs
              URL encodes provided search terms
              Makes an HTTP connection to Google
              Raises an exception when unavailable




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Start Small




 test_google_rank_should_exist(GoogleRankTest):
 Exception raised: Class: <NameError>
 Message: <"uninitialized constant GoogleRankTest::GoogleRank">

 1 tests, 0 assertions, 1 failures, 0 errors




 1 tests, 0 assertions, 0 failures, 0 errors




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Simplest Thing That Works

                                                          Class method

 test_parse_with_empty_document_should_return_empty_array(GoogleRankTest):
 NoMethodError: undefined method `parse' for GoogleRank:Class

 1 tests, 0 assertions, 0 failures, 1 errors




                                               Instance method


 test_parse_with_empty_document_should_return_empty_array(GoogleRankTest):
 NoMethodError: undefined method `parse' for GoogleRank:Class

 1 tests, 0 assertions, 0 failures, 1 errors



Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Simplest Thing That Actually Works




  2 tests, 1 assertions, 0 failures, 0 errors




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Use a Canned Data Set

                                                                Sample markup
                                                             from Google search




test_parse_with_sample_document_should_return_list_of_urls
<["http://blog.viget.com/", ..... > expected but was <[]>.

1 tests, 1 assertions, 1 failures, 0 errors




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Use a Canned Data Set




1 tests, 1 assertions, 0 failures, 0 errors




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Running Regressions
  test_parse_with_empty_document_should_return_empty_array(GoogleRankTest):
  NoMethodError: undefined method `[]' for nil:NilClass

  3 tests, 1 assertions, 0 failures, 1 errors




                                                     results.nil? == true




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Fix Regressions




 3 tests, 2 assertions, 0 failures, 0 errors




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Code Example
 Class that retrieves Google results
              Retrieves only the top 10 URLs
              URL encodes provided search terms
              Makes an HTTP connection to Google
              Raises an exception when unavailable




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Retrieve Internal State




                                      Inspect instance variable

NameError: uninitialized constant GoogleRankTest::ERB




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Retrieve Internal State




test_new_should_encode_supplied_keywords(GoogleRankTest):
ArgumentError: wrong number of arguments (1 for 0)

1 tests, 0 assertions, 0 failures, 1 errors




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Retrieve Internal State




1 tests, 1 assertions, 0 failures, 0 errors


4 tests, 3 assertions, 0 failures, 0 errors




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Refactor Test Duplication




4 tests, 3 assertions, 0 failures, 0 errors




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Testing Encoding




test_new_should_assign_url_with_base_and_encoded_keywords(GoogleRankTest):
NameError: uninitialized constant GoogleRank::BASE_URL

1 tests, 0 assertions, 0 failures, 1 errors




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Testing Encoding




1 tests, 1 assertions, 0 failures, 0 errors


5 tests, 4 assertions, 0 failures, 0 errors


Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Code Example
 Class that retrieves Google results
              Retrieves only the top 10 URLs
              URL encodes provided search terms
              Makes an HTTP connection to Google
              Raises an exception when unavailable




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
“Mock objects are simulated
       objects that mimic the behavior of
       real objects in controlled ways”
                       - Wikipedia




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Mocks and Stubs

  Remove external dependencies
  Create known state
  Focus tests on specific code paths




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Mocha to Stub Net::HTTP



                                                        Implementation will use
                                                             Net::HTTP#get




 test_retrieve_content_should_set_content(GoogleRankTest):
 NoMethodError: undefined method `retrieve_content' for #<GoogleRank:0x104053c>

 1 tests, 0 assertions, 0 failures, 1 errors



Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Mocha to Stub Net::HTTP




6 tests, 5 assertions, 0 failures, 0 errors



Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
No Network? Oops!



  $ irb --prompt simple
  >> gr = GoogleRank.new('rails')
  => #<GoogleRank:0x54c89c @encoded_keywords="rails",
       @url="http://www.google.com/search?q=rails">
  >> gr.retrieve_content
  SocketError: getaddrinfo: No address associated with nodename




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Replicate Real-Word Conditions


                                                         Expected failure




test_retrieve_content_when_connection_fails_should_set_content_to_nil(GoogleRankTest):
SocketError: SocketError

1 tests, 0 assertions, 0 failures, 1 errors




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Dealing With Failure




7 tests, 6 assertions, 0 failures, 0 errors




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Code Example
 Class that retrieves Google results
              Retrieves only the top 10 URLs
              URL encodes provided search terms
              Makes an HTTP connection to Google
              Raises an exception when unavailable




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Dealing With Even More Failure




test_retrieve_content_when_connection_fails_should_raise_exception_and_set_content_to_nil(GoogleRankTest)
<GoogleRank::ConnectionError> exception expected but none was thrown.

test_retrieve_content_with_failure_should_raise_exception(GoogleRankTest)
<GoogleRank::ConnectionError> exception expected but was
Class: <NoMethodError> Message: <"undefined method `closed?' for nil:NilClass">

7 tests, 6 assertions, 2 failures, 0 errors



  Changing Your Mindset
  Getting Started With Test-Driven Development
  September 7th, 2007
Handling Unsuccessful Requests




8 tests, 8 assertions, 0 failures, 0 errors


Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Testing Pitfalls

 Things to avoid
              Over-mocking
              Invalid mocks
              Testing library code
              “Assertion-heavy” tests
              Non-descriptive test names



Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Testing Pitfalls



                                                     Should test parsing




                                               HTTPResponse#content
                                               does not exist




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Testing Pitfalls


                                               Use secondary test
                                               to verify


                                                  Expected behavior?




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Coverage Analysis


  Shows ‘tested’ code
  Indication of when to stop
  Can present a false impression




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Coverage With RCov




                                               Exception-prone




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Next Steps?

  Rake - Rake::TestTask
  Mock expectations as tests
  Testing Macros




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Rake::TestTask Example




 $ rake -T
 rake test:all           # Run tests for all




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Expectations as Tests




                                               attr_accessor :content
                                                     called once




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Testing Macros




Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Resources
 Test::Unit
          http://ruby-doc.org/stdlib
 Mocha
          http://mocha.rubyforge.org
 RCov
          http://eigenclass.org/hiki/rcov
 Rake
          http://rake.rubyforge.org
 How to Test Validations (Expectations as Tests)
          http://relevancellc.com/2007/7/16/how-to-test-validations-part-4
 Testing Macros
          http://www.extendviget.com

Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007
Slides
                         http://www.slideshare.net/viget

                                                Blog
                                     http://blog.viget.com
                                     http://www.sneaq.net

                                               Contact
                                         patrick@viget.com



Changing Your Mindset
Getting Started With Test-Driven Development
September 7th, 2007

More Related Content

Similar to Changing Your Mindset: Getting Started with Test-Driven Development (20)

PDF
Selenium Design Patterns And Best Practices Dima Kovalenko
njamberudito
 
PDF
From 0 to 100: How we jump-started our frontend testing
Henning Muszynski
 
PDF
Unit Test in Ruby on Rails by Minitest
Hosang Jeon
 
ODP
Writing useful automated tests for the single page applications you build
Andrei Sebastian Cîmpean
 
PPTX
10 Principles of Apex Testing
Salesforce Developers
 
PPTX
10 Principles of Apex Testing
Kevin Poorman
 
ODP
Selenium testing IDE 101
Adam Culp
 
PDF
Testacular
James Ford
 
PPT
Testing in AngularJS
Peter Drinnan
 
ODP
Testing In Java
David Noble
 
ODP
Testing In Java4278
contact.bsingh
 
PDF
Hands On with Selenium and WebDriver
TechWell
 
PPTX
Unit Testing in .NET Core 7.0 with XUnit.pptx
Knoldus Inc.
 
PDF
Test Data Preparation: Tips and Tricks - SQA Days 22 - Saint Petersburg
Sargis Sargsyan
 
PDF
We Are All Testers Now: The Testing Pyramid and Front-End Development
All Things Open
 
PDF
Unit Testing and Behavior Driven Testing with AngularJS - Jesse Liberty | Fal...
FalafelSoftware
 
PDF
Agile testingoverview
Rangabashyam S
 
PDF
Agile testing overview
raianup
 
PDF
10 Principles of Apex Testing
Salesforce Developers
 
PPSX
Test analysis & design good practices@TDT Iasi 17Oct2013
Tabăra de Testare
 
Selenium Design Patterns And Best Practices Dima Kovalenko
njamberudito
 
From 0 to 100: How we jump-started our frontend testing
Henning Muszynski
 
Unit Test in Ruby on Rails by Minitest
Hosang Jeon
 
Writing useful automated tests for the single page applications you build
Andrei Sebastian Cîmpean
 
10 Principles of Apex Testing
Salesforce Developers
 
10 Principles of Apex Testing
Kevin Poorman
 
Selenium testing IDE 101
Adam Culp
 
Testacular
James Ford
 
Testing in AngularJS
Peter Drinnan
 
Testing In Java
David Noble
 
Testing In Java4278
contact.bsingh
 
Hands On with Selenium and WebDriver
TechWell
 
Unit Testing in .NET Core 7.0 with XUnit.pptx
Knoldus Inc.
 
Test Data Preparation: Tips and Tricks - SQA Days 22 - Saint Petersburg
Sargis Sargsyan
 
We Are All Testers Now: The Testing Pyramid and Front-End Development
All Things Open
 
Unit Testing and Behavior Driven Testing with AngularJS - Jesse Liberty | Fal...
FalafelSoftware
 
Agile testingoverview
Rangabashyam S
 
Agile testing overview
raianup
 
10 Principles of Apex Testing
Salesforce Developers
 
Test analysis & design good practices@TDT Iasi 17Oct2013
Tabăra de Testare
 

Recently uploaded (20)

PDF
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
PDF
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
PPTX
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
PDF
Future-Proof or Fall Behind? 10 Tech Trends You Can’t Afford to Ignore in 2025
DIGITALCONFEX
 
PDF
“Voice Interfaces on a Budget: Building Real-time Speech Recognition on Low-c...
Edge AI and Vision Alliance
 
PPTX
MuleSoft MCP Support (Model Context Protocol) and Use Case Demo
shyamraj55
 
PPTX
Seamless Tech Experiences Showcasing Cross-Platform App Design.pptx
presentifyai
 
PDF
SIZING YOUR AIR CONDITIONER---A PRACTICAL GUIDE.pdf
Muhammad Rizwan Akram
 
PPTX
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
PDF
How do you fast track Agentic automation use cases discovery?
DianaGray10
 
PPTX
Agentforce World Tour Toronto '25 - MCP with MuleSoft
Alexandra N. Martinez
 
PDF
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
PPTX
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
PPT
Ericsson LTE presentation SEMINAR 2010.ppt
npat3
 
PPTX
Future Tech Innovations 2025 – A TechLists Insight
TechLists
 
PDF
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
PDF
What’s my job again? Slides from Mark Simos talk at 2025 Tampa BSides
Mark Simos
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PDF
Staying Human in a Machine- Accelerated World
Catalin Jora
 
PDF
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
Future-Proof or Fall Behind? 10 Tech Trends You Can’t Afford to Ignore in 2025
DIGITALCONFEX
 
“Voice Interfaces on a Budget: Building Real-time Speech Recognition on Low-c...
Edge AI and Vision Alliance
 
MuleSoft MCP Support (Model Context Protocol) and Use Case Demo
shyamraj55
 
Seamless Tech Experiences Showcasing Cross-Platform App Design.pptx
presentifyai
 
SIZING YOUR AIR CONDITIONER---A PRACTICAL GUIDE.pdf
Muhammad Rizwan Akram
 
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
How do you fast track Agentic automation use cases discovery?
DianaGray10
 
Agentforce World Tour Toronto '25 - MCP with MuleSoft
Alexandra N. Martinez
 
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
Ericsson LTE presentation SEMINAR 2010.ppt
npat3
 
Future Tech Innovations 2025 – A TechLists Insight
TechLists
 
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
What’s my job again? Slides from Mark Simos talk at 2025 Tampa BSides
Mark Simos
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
Staying Human in a Machine- Accelerated World
Catalin Jora
 
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
Ad

Changing Your Mindset: Getting Started with Test-Driven Development

  • 1. Changing Your Mindset Getting Started With Test-Driven Development Patrick Reagan Director, Application Development [email protected]
  • 2. Overview  Testing Process  Test::Unit Introduction  Code Example: GoogleRank  Testing Pitfalls  Coverage Analysis  Next Steps Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 3. Test-Driven Development is the process of testing the behavior of non-existent objects Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 4. Testing Cycle Write Failing Test Refactor Write Code Verify Success Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 5. Why Test First?  No untested code is written  Start with higher code coverage  Rapid feedback  Build your regressions as you go Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 6. Anatomy of a (Test::Unit) Test Case Test case Test setup (run every test) Test Assertion Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 7. Naming Conventions Method to test Parameters / Input Expected behavior (should ...) Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 8. Basic Assertions  assert  assert_equal / assert_not_equal  assert_nil / assert_not_nil  assert_match / assert_no_match  assert_raise / assert_nothing_raised Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 9. Code Example Class that retrieves Google results  Retrieves only the top 10 URLs  URL encodes provided search terms  Makes an HTTP connection to Google  Raises an exception when unavailable Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 10. Start Small test_google_rank_should_exist(GoogleRankTest): Exception raised: Class: <NameError> Message: <"uninitialized constant GoogleRankTest::GoogleRank"> 1 tests, 0 assertions, 1 failures, 0 errors 1 tests, 0 assertions, 0 failures, 0 errors Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 11. Simplest Thing That Works Class method test_parse_with_empty_document_should_return_empty_array(GoogleRankTest): NoMethodError: undefined method `parse' for GoogleRank:Class 1 tests, 0 assertions, 0 failures, 1 errors Instance method test_parse_with_empty_document_should_return_empty_array(GoogleRankTest): NoMethodError: undefined method `parse' for GoogleRank:Class 1 tests, 0 assertions, 0 failures, 1 errors Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 12. Simplest Thing That Actually Works 2 tests, 1 assertions, 0 failures, 0 errors Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 13. Use a Canned Data Set Sample markup from Google search test_parse_with_sample_document_should_return_list_of_urls <["http://blog.viget.com/", ..... > expected but was <[]>. 1 tests, 1 assertions, 1 failures, 0 errors Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 14. Use a Canned Data Set 1 tests, 1 assertions, 0 failures, 0 errors Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 15. Running Regressions test_parse_with_empty_document_should_return_empty_array(GoogleRankTest): NoMethodError: undefined method `[]' for nil:NilClass 3 tests, 1 assertions, 0 failures, 1 errors results.nil? == true Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 16. Fix Regressions 3 tests, 2 assertions, 0 failures, 0 errors Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 17. Code Example Class that retrieves Google results  Retrieves only the top 10 URLs  URL encodes provided search terms  Makes an HTTP connection to Google  Raises an exception when unavailable Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 18. Retrieve Internal State Inspect instance variable NameError: uninitialized constant GoogleRankTest::ERB Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 19. Retrieve Internal State test_new_should_encode_supplied_keywords(GoogleRankTest): ArgumentError: wrong number of arguments (1 for 0) 1 tests, 0 assertions, 0 failures, 1 errors Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 20. Retrieve Internal State 1 tests, 1 assertions, 0 failures, 0 errors 4 tests, 3 assertions, 0 failures, 0 errors Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 21. Refactor Test Duplication 4 tests, 3 assertions, 0 failures, 0 errors Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 22. Testing Encoding test_new_should_assign_url_with_base_and_encoded_keywords(GoogleRankTest): NameError: uninitialized constant GoogleRank::BASE_URL 1 tests, 0 assertions, 0 failures, 1 errors Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 23. Testing Encoding 1 tests, 1 assertions, 0 failures, 0 errors 5 tests, 4 assertions, 0 failures, 0 errors Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 24. Code Example Class that retrieves Google results  Retrieves only the top 10 URLs  URL encodes provided search terms  Makes an HTTP connection to Google  Raises an exception when unavailable Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 25. “Mock objects are simulated objects that mimic the behavior of real objects in controlled ways” - Wikipedia Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 26. Mocks and Stubs  Remove external dependencies  Create known state  Focus tests on specific code paths Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 27. Mocha to Stub Net::HTTP Implementation will use Net::HTTP#get test_retrieve_content_should_set_content(GoogleRankTest): NoMethodError: undefined method `retrieve_content' for #<GoogleRank:0x104053c> 1 tests, 0 assertions, 0 failures, 1 errors Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 28. Mocha to Stub Net::HTTP 6 tests, 5 assertions, 0 failures, 0 errors Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 29. No Network? Oops! $ irb --prompt simple >> gr = GoogleRank.new('rails') => #<GoogleRank:0x54c89c @encoded_keywords="rails", @url="http://www.google.com/search?q=rails"> >> gr.retrieve_content SocketError: getaddrinfo: No address associated with nodename Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 30. Replicate Real-Word Conditions Expected failure test_retrieve_content_when_connection_fails_should_set_content_to_nil(GoogleRankTest): SocketError: SocketError 1 tests, 0 assertions, 0 failures, 1 errors Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 31. Dealing With Failure 7 tests, 6 assertions, 0 failures, 0 errors Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 32. Code Example Class that retrieves Google results  Retrieves only the top 10 URLs  URL encodes provided search terms  Makes an HTTP connection to Google  Raises an exception when unavailable Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 33. Dealing With Even More Failure test_retrieve_content_when_connection_fails_should_raise_exception_and_set_content_to_nil(GoogleRankTest) <GoogleRank::ConnectionError> exception expected but none was thrown. test_retrieve_content_with_failure_should_raise_exception(GoogleRankTest) <GoogleRank::ConnectionError> exception expected but was Class: <NoMethodError> Message: <"undefined method `closed?' for nil:NilClass"> 7 tests, 6 assertions, 2 failures, 0 errors Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 34. Handling Unsuccessful Requests 8 tests, 8 assertions, 0 failures, 0 errors Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 35. Testing Pitfalls Things to avoid  Over-mocking  Invalid mocks  Testing library code  “Assertion-heavy” tests  Non-descriptive test names Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 36. Testing Pitfalls Should test parsing HTTPResponse#content does not exist Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 37. Testing Pitfalls Use secondary test to verify Expected behavior? Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 38. Coverage Analysis  Shows ‘tested’ code  Indication of when to stop  Can present a false impression Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 39. Coverage With RCov Exception-prone Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 40. Next Steps?  Rake - Rake::TestTask  Mock expectations as tests  Testing Macros Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 41. Rake::TestTask Example $ rake -T rake test:all # Run tests for all Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 42. Expectations as Tests attr_accessor :content called once Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 43. Testing Macros Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 44. Resources Test::Unit  http://ruby-doc.org/stdlib Mocha  http://mocha.rubyforge.org RCov  http://eigenclass.org/hiki/rcov Rake  http://rake.rubyforge.org How to Test Validations (Expectations as Tests)  http://relevancellc.com/2007/7/16/how-to-test-validations-part-4 Testing Macros  http://www.extendviget.com Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007
  • 45. Slides http://www.slideshare.net/viget Blog http://blog.viget.com http://www.sneaq.net Contact [email protected] Changing Your Mindset Getting Started With Test-Driven Development September 7th, 2007