coding with confidence: adding tdd to your toolset
DESCRIPTION
Patrick talks about how a test-first strategy has been mistaken as a purely QA activity, and discusses the benefits developers can discover when taking a test-driven approach to developing their code.TRANSCRIPT
![Page 1: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/1.jpg)
Coding with ConfidenceAdding TDD to Your Toolset
![Page 2: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/2.jpg)
image: un-sharp @ flickr
![Page 3: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/3.jpg)
why test?
![Page 4: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/4.jpg)
reduce defects
![Page 5: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/5.jpg)
verify expectations
![Page 6: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/6.jpg)
why test first?
![Page 7: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/7.jpg)
“The metric I, and others I know, have used to judge unit testing is: does it find
bugs?”Bill Moorier
![Page 8: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/8.jpg)
kinda.
![Page 9: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/9.jpg)
“When you write unit tests ... you scrutinize, you
think, and often you prevent problems without even encountering a test
failure.”Michael Feathers
![Page 10: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/10.jpg)
Test-Driven Development
![Page 11: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/11.jpg)
Test-Driven Design
![Page 12: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/12.jpg)
1. Design the API
2. Make it work
3. Make it clean
![Page 13: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/13.jpg)
cohesion
coupling
![Page 14: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/14.jpg)
“As long as you don't change that component's external
interfaces, you can be comfortable that you won't cause problems that ripple through the entire system”
The Pragmatic Programmer
![Page 15: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/15.jpg)
avoid complicated solutions to simple
problems
![Page 16: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/16.jpg)
insuranceimage: buttepubliclibrary @ flickr
![Page 17: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/17.jpg)
regressions
![Page 18: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/18.jpg)
mess image: locket479 @ flickr
![Page 19: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/19.jpg)
“Consider a building with a few broken windows. If the windows are not repaired, the tendency is for vandals to break more windows”
The Atlantic Monthly (1982)
![Page 20: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/20.jpg)
fear image: troyholden @ flickr
![Page 21: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/21.jpg)
“Test-driven development is a way of
managing fear during programming”
Kent Beck
![Page 22: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/22.jpg)
documentation
image: horrgakx @ flickr
![Page 23: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/23.jpg)
1. Design the API
2. Make it work
3. Make it clean
![Page 24: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/24.jpg)
1. Design the API
2. Make it work
3. Make it clean
write a failing test
![Page 25: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/25.jpg)
1. Design the API
2. Make it work
3. Make it clean
write a failing test
make the test pass
![Page 26: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/26.jpg)
1. Design the API
2. Make it work
3. Make it clean
write a failing test
make the test pass
remove duplication
![Page 27: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/27.jpg)
1. RED
2. GREEN
3. REFACTOR
image: rooreynolds @ flickr
![Page 28: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/28.jpg)
anatomy
class FabricatedTest < Test::Unit::TestCase def setup File.touch('tempfile') end def teardown FileUtils.rm('tempfile') end def test_should_know_the_number_of_items bag = Bag.new(3) assert_equal 3, bag.item_count end end
![Page 29: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/29.jpg)
anatomy
class FabricatedTest < Test::Unit::TestCase def setup File.touch('tempfile') end def teardown FileUtils.rm('tempfile') end def test_should_know_the_number_of_items bag = Bag.new(3) assert_equal 3, bag.item_count end end
Test case
![Page 30: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/30.jpg)
anatomy
class FabricatedTest < Test::Unit::TestCase def setup File.touch('tempfile') end def teardown FileUtils.rm('tempfile') end def test_should_know_the_number_of_items bag = Bag.new(3) assert_equal 3, bag.item_count end end
Test case
Test setup(run every test)
![Page 31: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/31.jpg)
anatomy
class FabricatedTest < Test::Unit::TestCase def setup File.touch('tempfile') end def teardown FileUtils.rm('tempfile') end def test_should_know_the_number_of_items bag = Bag.new(3) assert_equal 3, bag.item_count end end
Test case
Test setup(run every test)
Test teardown(run every test)
![Page 32: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/32.jpg)
anatomy
class FabricatedTest < Test::Unit::TestCase def setup File.touch('tempfile') end def teardown FileUtils.rm('tempfile') end def test_should_know_the_number_of_items bag = Bag.new(3) assert_equal 3, bag.item_count end end
Test case
Test setup(run every test)
Test
Test teardown(run every test)
![Page 33: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/33.jpg)
anatomy
class FabricatedTest < Test::Unit::TestCase def setup File.touch('tempfile') end def teardown FileUtils.rm('tempfile') end def test_should_know_the_number_of_items bag = Bag.new(3) assert_equal 3, bag.item_count end end
Test case
Test setup(run every test)
Test
Assertion
Test teardown(run every test)
![Page 34: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/34.jpg)
image: mediageek @ flickr
![Page 35: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/35.jpg)
Pitfalls
![Page 36: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/36.jpg)
testing language features
class User attr_accessor :nameend
class UserTest < Test::Unit::TestCase def test_should_be_able_to_set_name user = User.new user.name = 'Patrick' assert_equal 'Patrick', user.name end end
![Page 37: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/37.jpg)
multiple assertions
class UserTest < Test::Unit::TestCase def test_valid user = User.new assert !user.valid? assert user.errors.on(:name) assert user.errors.on(:username) end end
![Page 38: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/38.jpg)
testing private methods
class Line def initialize(content) @content = content end private def extract(pattern) @content.match(pattern)[1] end end
class LineTest < Test::Unit::TestCase def test_extract_should_return_captured_value line = Line.new('This is content') assert_equal 'is', line.send(:extract, /(is)/) end end
![Page 39: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/39.jpg)
lack of context
class UserTest < Test::Unit::TestCase def setup @content = '{"user_name":"reagent","user_id":"12345"}' end def test_should_be_able_to_extract_the_username user = User.new(@content) assert_equal 'reagent', user.username end def test_should_be_able_to_extract_the_user_id user = User.new(@content) assert_equal '12345', user.id end end
![Page 40: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/40.jpg)
testing the happy path
class User attr_writer :name def name @name.strip endend
class UserTest < Test::Unit::TestCase def test_should_remove_whitespace_from_name user = User.new user.name = ' Patrick ' assert_equal 'Patrick', user.name end end
![Page 41: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/41.jpg)
TDD is a tool
![Page 42: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/42.jpg)
TDD is not a religion
![Page 43: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/43.jpg)
![Page 44: Coding With Confidence: Adding TDD to Your Toolset](https://reader031.vdocuments.us/reader031/viewer/2022020217/54bf77a94a7959403f8b4576/html5/thumbnails/44.jpg)
Resources• Slides / Code: http://github.com/reagent/talks
Contact• [email protected]
• http://twitter.com/reagent
Rate This Talk• http://speakerrate.com/preagan
image: nomeacuerdo @ flickrimage: nomeacuerdo @ flickr