Changing Your Mindset: Getting Started With Test-Driven Development

50 %
50 %
Information about Changing Your Mindset: Getting Started With Test-Driven Development

Published on September 7, 2007

Author: viget

Source: slideshare.net

Description

Patrick Reagan introduces the concept of Test-Driven development with code examples and gives some lessons learned from experience in the field.

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 Write Refactor 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: <quot;uninitialized constant GoogleRankTest::GoogleRankquot;> 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 <[quot;http://blog.viget.com/quot;, ..... > 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=quot;railsquot;, @url=quot;http://www.google.com/search?q=railsquot;> >> 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: <quot;undefined method `closed?' for nil:NilClassquot;> 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

Add a comment

Related presentations

Related pages

Getting started with test-driven development - JavaWorld

... author Thomas Hammell helps you select the right tools for getting started with test-driven development ... you know your development ... changing a ...
Read more

Changing Mindset To Grow Tall - Documents

Changing Mindset Changing Mindset To Grow Tall. ... Getting Started with Test-Driven Development. ... Changing Your Mindset: Getting Started With Test ...
Read more

Mindset | How can you change from a fixed mindset to a ...

Learn to hear your fixed mindset “voice. ... You might feel yourself getting angry at the person who is giving you feedback. “Who do they think they are?
Read more

How Changing Your Mindset Can Help Your Web Design Goals

The biggest challenge though is changing your mindset. Home; Design ... how it applies to web design & development. ... Getting Started With CSS Flexbox ...
Read more

The Right Mindset: Change Your Mindset in 6 Steps

Here are the 6 essential keys to change your mindset and by ... it’s taking what works for you by getting ... Change Your Mindset by Changing ...
Read more

Foundations of Programming: Test-Driven Development ...

... and welcome to Foundations of Programming Test Driven Development. ... see how to move to a Test First mindset, to take your testing ... You started ...
Read more

The Importance of Mindset | SkillsYouNeed

Personal Development; Caring for your Body; ... The Importance of Mindset ... he started running as fast as he could, ...
Read more

Innovate or Die - changing your mindset about cloud @ ...

Innovate or Die - changing your mindset about cloud @scottsanchez; Innovate or Die - changing your mindset about cloud @scottsanchez Nov 29, 2014 Technology
Read more

1 Getting Started - Springer

Getting Started Adapt or perish, now ... Kanban, Test Driven Development (TDD), or any ... tomer needs and changing market conditions; the more your ...
Read more