under test
DESCRIPTION
Under Test. TDD Techniques from the Trenches May 24, 2011 Matt Thurston. Agenda. Rediscovery. Nutshell. Why get code ‘Under Test’?. Cost of Change. Change. Simple Code Change (“Hack”) versus Tough Design Change (“Right Thing”). Technical Debt. Motivator. What is Legacy Code?. - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/1.jpg)
Under Test
TDD Techniques from the TrenchesMay 24, 2011Matt Thurston
![Page 2: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/2.jpg)
Agenda
TDD
Legacy Code
TechniquesBenefits
Pitfalls
![Page 3: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/3.jpg)
TDD
Legacy Code
TechniquesBenefits
Pitfalls
![Page 4: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/4.jpg)
Rediscovery
![Page 5: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/5.jpg)
Nutshell
Failing Test
Passing Test
Re-factor
![Page 6: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/6.jpg)
Why get code ‘Under Test’?
![Page 7: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/7.jpg)
Cost of Change
![Page 8: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/8.jpg)
Change
Simple Code Change (“Hack”)versus
Tough Design Change (“Right Thing”)
![Page 9: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/9.jpg)
Technical Debt
![Page 10: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/10.jpg)
Motivator
![Page 11: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/11.jpg)
TDD
Legacy Code
TechniquesBenefits
Pitfalls
![Page 12: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/12.jpg)
What is Legacy Code?
• Inherited?• Old version?• Previous platform?• ‘C’?
![Page 13: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/13.jpg)
Legacy Code = Code Without Tests
![Page 14: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/14.jpg)
Confident Change
• Changing legacy code– What will break? – Will we find the break?
![Page 15: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/15.jpg)
Under Test
• TDD Greenfields vs Legacy Code Retrofits
![Page 16: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/16.jpg)
TDD
Legacy Code
TechniquesBenefits
Pitfalls
![Page 17: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/17.jpg)
Defining ‘Unit Test’
• Our Unit is the C++ class• Unit Tests in C++
![Page 18: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/18.jpg)
Issue #1
• TDD requires immediate feedback
![Page 19: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/19.jpg)
What should CTRL + B do?
• Build and test as much as possible within a few seconds.
![Page 20: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/20.jpg)
Deployment Fidelity
Development
Test Deployment
Production Deployment
![Page 21: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/21.jpg)
Deployment Fidelity
• Deployment Fidelity typically dictates Test Fidelity
![Page 22: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/22.jpg)
Test Fidelity
Unit Integration System
![Page 23: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/23.jpg)
Test Fidelity
Unit(Seconds)
Integration(Minutes)
System(Hours)
![Page 24: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/24.jpg)
Introduce New Fidelity?
• TDD requires immediate feedback• If necessary, introduce a new fidelity
![Page 25: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/25.jpg)
Issue #2
• ‘Random’ test failures
![Page 26: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/26.jpg)
![Page 27: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/27.jpg)
Dependency Inversion
• E.g.– Foo uses files to store configuration information– Instead, inject FooConfiguration with• Virtual bool FooConfiguration::isEnabled() = 0;
![Page 28: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/28.jpg)
Dependency Inversion
• Big Benefits:– Improves isolation– Simplifies reasoning about collaborations
![Page 29: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/29.jpg)
Issue #3
• Difficult component
![Page 30: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/30.jpg)
Difficult Components
• Lack of modularity• Lots of dependencies• Lack of coherent design• Full of bugs• Etc.
![Page 31: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/31.jpg)
Integration Test First
• Works well for Difficult Components• Provides confidence when re-factoring for unit
testability
![Page 32: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/32.jpg)
Issue #4
• Getting inherited legacy code under test
![Page 33: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/33.jpg)
Characterization Tests
Failing Test
Capture Output
Passing Test
![Page 34: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/34.jpg)
Characterization Tests
• Capture reality not expected behavior• The first test is the hardest
![Page 35: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/35.jpg)
Failing a Unit Test
• If a unit test has never failed once, how do you know it works?
![Page 36: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/36.jpg)
Mutation Testing
![Page 37: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/37.jpg)
Mutation Testing
Passing Test
Mutate
Failing Test
Un-mutate
![Page 38: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/38.jpg)
TDD
Legacy Code
TechniquesBenefits
Pitfalls
![Page 39: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/39.jpg)
Semantic Memory
Input ‘A’ Output ‘B’
![Page 40: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/40.jpg)
Tests are never wrong
• Tests encode semantics of the software– (even if the sematic is wrong)
![Page 41: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/41.jpg)
Comment on comments
• “When the code and the comments disagree, both are probably wrong.” – Norm Schryer
![Page 42: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/42.jpg)
Under Test vs. Coding Speed
![Page 43: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/43.jpg)
Dreaming of Code
![Page 44: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/44.jpg)
TDD
Legacy Code
TechniquesBenefits
Pitfalls
![Page 45: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/45.jpg)
Continuous Testing
• Share tests• Don’t let test code rot– Integrate with build / CI tool
![Page 46: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/46.jpg)
Mocks, Stubs, Fakes
• Take care with terminology overloading
![Page 47: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/47.jpg)
Mocks, Stubs, Fakes
• Take care with terminology overloading• Mock: – Object used to mock collaborator behavior in a unit test
• Stub:– Satisfies linkage from a collaborator, provides no
implementation (e.g. asserts)• Fake:– Implements a collaborator’s functionality in a synthetic
fashion
![Page 48: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/48.jpg)
Not Just the Tests
• Code coverage• Static analysis (e.g. Lint, -Wall)• Dynamic analysis (e.g. valgrind)
![Page 49: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/49.jpg)
Quality?
• TDD / Unit Testing does not imply Quality
![Page 50: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/50.jpg)
Questions? Comments?
TDD
Legacy Code
TechniquesBenefits
Pitfalls
![Page 51: Under Test](https://reader035.vdocument.in/reader035/viewer/2022062812/568163a8550346895dd4b773/html5/thumbnails/51.jpg)