Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Beyond Unit Testing - The Real Value of TDD - A...

Beyond Unit Testing - The Real Value of TDD - Agile5

Twenty-plus years after the public introduction of Test-Driven Development (TDD), in Kent Beck's Extreme Programming Explained, it remains a commonly misunderstood and underutilized practice. While there are many who espouse the benefits of TDD, misconceptions about the practice and its perceived learning curve serve to dampen its impact on the software industry.

This talk introduces the misconceptions about TDD, as being just another way to write unit tests. It disputes this belief by refocusing on the many benefits of the practice. The talk will detail the resulting sustainable, high-quality test suites that are a product of TDD. Additionally, it will describe the less visible benefits like software design feedback, and improvements to development structure and developer workflow; all of which are possible through the continued practice of TDD.

If you are a software engineer or a technical leader wanting to learn more about TDD, looking for the motivation to give the practice a try, or are looking for ways to encourage your team(s) to learn the practice, this talk is for you.

Anthony Sciamanna

June 23, 2022
Tweet

More Decks by Anthony Sciamanna

Other Decks in Technology

Transcript

  1. Beyond Unit Testing The Real Value of Test-Driven Development Anthony

    Sciamanna Senior Consultant Industrial Logic June 23, 2022
  2. Anthony Sciamanna Technical Agile & Lean Coach, Trainer, Blogger &

    Organizer of the PhillyXP user group. Website: https://anthonysciamanna.com Email: [email protected] Twitter: @asciamanna https://www.meetup.com/phillyxp/
  3. TDD Refresher Image by Industrial Logic Senior Consultant - Tim

    Ottinger @asciamanna anthonysciamanna.com Add / Update a test Make it work Make it clean
  4. A Tale of Two Hats @asciamanna anthonysciamanna.com Adding Functionality Refactoring

    Writing a failing test or making it pass Small, behavior preserving code improvements You can only wear one hat at a time! https://martinfowler.com/articles/workflowsOfRefactoring/#2hats
  5. TD Refresher A Very Brief History of TDD 1994 Kent

    Beck releases the first version of the SUnit framework for Smalltalk @asciamanna anthonysciamanna.com
  6. TD Refresher A Very Brief History of TDD 1994 1995

    Kent demos TDD to Ward Cunningham at OOPSLA Austin in October. Details of the C3 Project start being publicized Kent Beck releases the first version of the SUnit framework for Smalltalk @asciamanna anthonysciamanna.com
  7. TD Refresher A Very Brief History of TDD 1994 1995

    1997 Kent demos TDD to Ward Cunningham at OOPSLA Austin in October. Details of the C3 Project start being publicized Kent Beck releases the first version of the SUnit framework for Smalltalk On a flight from Zurich to Atlanta (OOPSLA ‘97) Erich Gamma and Kent Beck create JUnit for Java @asciamanna anthonysciamanna.com
  8. TD Refresher A Very Brief History of TDD 1994 1995

    1997 1999 Kent demos TDD to Ward Cunningham at OOPSLA Austin in October. Details of the C3 Project start being publicized Kent Beck releases the first version of the SUnit framework for Smalltalk On a flight from Zurich to Atlanta (OOPSLA ‘97) Erich Gamma and Kent Beck create JUnit for Java Kent releases Extreme Programming Explained @asciamanna anthonysciamanna.com
  9. @asciamanna anthonysciamanna.com I don’t care if people write tests first

    or last. As long as they get written. - Anonymous Tech Lead
  10. Test Suite Quality Production Code Quality Test suite quality influences

    production code quality and vice-versa @asciamanna anthonysciamanna.com
  11. You Can’t Write Good Tests for Bad Code • Wrapping

    untestable code in unit tests results in brittle, low-quality tests, that suffer from false failures • Test-first practices enable writing high quality production code and high- quality tests Markus Spiske for Tech Daily @asciamanna anthonysciamanna.com
  12. The Test Pyramid Microtests / Unit tests Integration / Acceptance

    tests E2E / UI tests As scope increases, detail should decrease Increase in: • Cost to develop and maintain • Execution time • Possibility of false negatives • Time to identify source of issue @asciamanna anthonysciamanna.com https://anthonysciamanna.com/2019/10/20/avoiding-automated-testing-pitfalls.html More integration More isolation
  13. The TDD Quality Cycle Test Suite Production Code 2. Code

    under test must be testable (loosely coupled) Refactoring Refactoring 3. Enables tests to be small, precise, fast, isolated and independent Virtuous Cycle 1. We start in the test @asciamanna anthonysciamanna.com
  14. Microtest A short, simple, fast, isolated*, test that probes the

    behavior of a single class *Isolated does not mean we have to mock every dependency anthonysciamanna.com @asciamanna
  15. Microtests Don’t Access a network Access a database Access the

    filesystem Depend on other tests Require a complex environment to run in @asciamanna anthonysciamanna.com
  16. Standardize common test constructs Create the object under test in

    Setup Standard name result to be asserted Standard name for object under test anthonysciamanna.com @asciamanna
  17. How To Stop Hating Your Test Suite Logic in tests

    confuses the story of what’s being tested. Test-scoped logic is hard to read and errors are easy to miss. - Justin Searls, Co-founder Test Double anthonysciamanna.com @asciamanna
  18. How To Stop Hating Your Test Suite Test code is

    untested code! - Justin Searls, Co-founder Test Double anthonysciamanna.com @asciamanna
  19. anthonysciamanna.com @asciamanna Test After Test First Manual testing often takes

    precedence Unit testing at end tends to be skipped to hit deadlines All code is tested as it is created or modified Feels like busy work if code is manually tested and considered “done” The test is the path to changing the system Code is not influenced by tests to be testable Code is influenced by the tests to be testable Tests don’t serve as feedback loops Tests are continuous feedback loops, supports refactoring and software design Tests don’t get refactored – created at end Tests are continuously refactored Tests are less comprehensive when added at end Tests are more comprehensive when added with each code change Coverage as a build gate often required (commonly 70% coverage) Coverage metrics unnecessary Tests implementation details Tests behavior VS.
  20. TDD Disclaimer TDD influences design quality But it’s not a

    magic wand! anthonysciamanna.com @asciamanna
  21. TDD Disclaimer TDD influences design quality High Cohesion Loose Coupling

    Small Classes Small Methods anthonysciamanna.com @asciamanna
  22. TDD Disclaimer TDD provides a mechanism for learning software design

    High Cohesion Loose Coupling Small Classes Small Methods anthonysciamanna.com @asciamanna
  23. Practitioners still need to understand the concepts of software design

    High Cohesion Loose Coupling Code Smells Design Patterns SOLID Refactoring Encapsulation GRASP Connascence anthonysciamanna.com @asciamanna TDD Disclaimer
  24. Too Much Test Setup Too Many Dependencies Too Many Arguments

    Arguments are Too Complex Code Under Test Doing Too Much anthonysciamanna.com @asciamanna
  25. Multiple ‘Act’ Steps Temporal Coupling Exists Complicated API Client needs

    to know too much about object under test Too Many Steps to Invoke Method Under Test anthonysciamanna.com @asciamanna
  26. Too Many Asserts Returning too complex of a type Code

    under test doing too much anthonysciamanna.com @asciamanna
  27. Too Many Test Cases Too much branching logic Code under

    test is doing too much anthonysciamanna.com @asciamanna
  28. Client-First Design / Outside-In TDD enables software design from a

    client’s perspective Leads to better designed interfaces between objects anthonysciamanna.com @asciamanna
  29. Refactoring into design yields a better design than Big Design

    Up Front Requirements Design Code Test Waterfall Mindset Requirements Test Code Design (Refactor) (Test-Driven) Agile Mindset Slide courtesy of Mike Rieser (@MichaelRieser) anthonysciamanna.com @asciamanna JIT (re)design design design design design
  30. BIG PROBLEM @asciamanna anthonysciamanna.com Great software is created by GREAT

    TEAMS not heroic, rockstar, 10X developers working in isolation
  31. BIG PROBLEM @asciamanna anthonysciamanna.com Software development is a communication game

    Communication is the professional developer’s first order of business. Perhaps you thought that ‘getting it working’ was the first order of business for a professional developer. I hope by now, however, this book has disabused you of that idea. - Robert Martin, Clean Code
  32. Mental Benefits of TDD One of the hardest things to

    communicate about Test-Driven Development is the mental state it puts you in…On the original C3 project…progress was steady and unhurried; because it was unhurried it seemed slow, but looking back on how much we got done, it was clear that despite the unhurried feeling progress was really fast. “ ” anthonysciamanna.com @asciamanna
  33. Mental Benefits of TDD Concrete and visible progress on small

    incremental goals @asciamanna anthonysciamanna.com
  34. Mental Benefits of TDD Little or no time spent in

    the debugger or on repetitive, time consuming manual checks anthonysciamanna.com @asciamanna
  35. Learning TDD will help improve software design, developer workflow, increases

    developer happiness, and it’s a lot of fun! https://geepawhill.org https://github.com/testdouble/contributing-tests/wiki Test Double – Contributing Tests Wiki Industrial Logic eLearning https://www.industriallogic.com/elearning/ anthonysciamanna.com @asciamanna
  36. Attributes • Pygmy Marmoset - https://www.flickr.com/photos/gopak/39889008421 • SOS - https://www.flickr.com/photos/itupictures/16654290295

    • Darts - https://www.flickr.com/photos/mike-burns/374198933 • Quote - Nick Youngson CC BY-SA 3.0 • Magician - Photo by Pierrick VAN-TROOST on Unsplash • Litmus test - https://commons.wikimedia.org/wiki/File:Blue_and_red_litmus_paper.JPG • Self-operating napkin - https://upload.wikimedia.org/wikipedia/commons/8/88/Self- operating_napkin_%28Rube_Goldberg_cartoon_with_caption%29.jpg • Glass Cockpit - https://upload.wikimedia.org/wikipedia/commons/9/9f/C-5M_Cockpit.jpg • Public Domain, https://commons.wikimedia.org/w/index.php?curid=2466026 • Stack of Papers - https://upload.wikimedia.org/wikipedia/commons/b/b6/FileStack_retouched.jpg • El Diablo - https://en.wikipedia.org/wiki/Fire_Ball#/media/File:El_Diablo_Roller_Coaster.jpg • Creative Commons license: https://creativecommons.org/licenses/by/2.0/