Slide 1

Slide 1 text

Beyond Unit Testing Anthony Sciamanna @asciamanna anthonysciamanna.com The Real Value of Test-Driven Development November 19, 2019

Slide 2

Slide 2 text

• Passionate about Extreme Programming (XP), Lean Software Development, and Modern Agile. • Expertise in helping teams and development organizations improve how they work, the quality of their code, and their ability to deliver value to their customers. • Focusing on technical excellence, continuous improvement, and continuous learning. Anthony Sciamanna Software Engineer, Technical Agile Coach, Blogger & Organizer of the PhillyXP user group. @asciamanna anthonysciamanna.com

Slide 3

Slide 3 text

TDD Refresher @asciamanna anthonysciamanna.com Image by Industrial Logic Senior Consultant - Tim Ottinger

Slide 4

Slide 4 text

TDD Refresher @asciamanna anthonysciamanna.com

Slide 5

Slide 5 text

TDD Refresher @asciamanna anthonysciamanna.com

Slide 6

Slide 6 text

Let’s go back in time! @asciamanna anthonysciamanna.com

Slide 7

Slide 7 text

Discovered at Hunter Industries in 2011 by a team coached by Woody Zuill 1994 A Very Brief History of TDD Discovered at Hunter Industries in 2011 by a team coached by Woody Zuill Kent Beck releases the first version of the SUnit framework for Smalltalk @asciamanna anthonysciamanna.com

Slide 8

Slide 8 text

Discovered at Hunter Industries in 2011 by a team coached by Woody Zuill 1994 A Very Brief History of TDD Discovered at Hunter Industries in 2011 by a team coached by Woody Zuill 1995 @asciamanna Kent demos TDD to Ward Cunningham at OOPSLA Austin in October. Details of the C3 Project start being publicized anthonysciamanna.com Kent Beck releases the first version of the SUnit framework for Smalltalk

Slide 9

Slide 9 text

Discovered at Hunter Industries in 2011 by a team coached by Woody Zuill 1994 A Very Brief History of TDD Discovered at Hunter Industries in 2011 by a team coached by Woody Zuill 1995 @asciamanna Kent demos TDD to Ward Cunningham at OOPSLA Austin in October. Details of the C3 Project start being publicized anthonysciamanna.com 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 1997

Slide 10

Slide 10 text

Discovered at Hunter Industries in 2011 by a team coached by Woody Zuill 1994 A Very Brief History of TDD Discovered at Hunter Industries in 2011 by a team coached by Woody Zuill 1995 @asciamanna Kent demos TDD to Ward Cunningham at OOPSLA Austin in October. Details of the C3 Project start being publicized anthonysciamanna.com 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 1997 Kent releases Extreme Programming Explained 1999

Slide 11

Slide 11 text

TDD Is a Testing Practice @asciamanna anthonysciamanna.com

Slide 12

Slide 12 text

I don’t care if people write tests first or last. As long as they get written. @asciamanna “ ” - Anonymous Tech Lead anthonysciamanna.com

Slide 13

Slide 13 text

@asciamanna Ignores Design and Workflow Benefits of TDD anthonysciamanna.com

Slide 14

Slide 14 text

@asciamanna Benefits of TDD anthonysciamanna.com

Slide 15

Slide 15 text

@asciamanna Benefits of TDD Test Suite Externally Visible Artifacts anthonysciamanna.com

Slide 16

Slide 16 text

@asciamanna Benefits of TDD Test Suite Externally Visible Artifacts anthonysciamanna.com

Slide 17

Slide 17 text

@asciamanna Benefits of TDD Test Suite Externally Visible Artifacts Software Design anthonysciamanna.com

Slide 18

Slide 18 text

@asciamanna Benefits of TDD Test Suite Externally Visible Artifacts Software Design Developer Workflow anthonysciamanna.com

Slide 19

Slide 19 text

@asciamanna Benefits of TDD Test Suite Software Design Developer Workflow Externally Visible Artifacts anthonysciamanna.com

Slide 20

Slide 20 text

@asciamanna TDD Triple Balance Made Making Maker anthonysciamanna.com

Slide 21

Slide 21 text

@asciamanna Benefits of TDD Test Suite Software Design Developer Workflow Externally Visible Artifacts anthonysciamanna.com

Slide 22

Slide 22 text

Test Suite Benefits Why we prefer TDD-style tests over Test After Tests

Slide 23

Slide 23 text

Test Suite Quality Production Code Quality @asciamanna Disclaimer #1 Test suite quality influences production code quality and vice-versa anthonysciamanna.com

Slide 24

Slide 24 text

You Can’t Write Good Tests for Bad Code • Wrapping non-testable code in unit tests results in brittle, low-quality tests • Test-first practices enable writing high quality production code and high-quality tests @asciamanna anthonysciamanna.com

Slide 25

Slide 25 text

@asciamanna The TDD Quality Cycle anthonysciamanna.com 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. Tests are written first

Slide 26

Slide 26 text

Microtest A short, simple, fast, isolated*, test that probes the behavior of a single class @asciamanna *Isolated does not mean we have to mock every dependency anthonysciamanna.com

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

S O S @asciamanna anthonysciamanna.com

Slide 29

Slide 29 text

Small O S @asciamanna anthonysciamanna.com

Slide 30

Slide 30 text

Small Obvious S @asciamanna anthonysciamanna.com

Slide 31

Slide 31 text

Small Obvious Simple @asciamanna anthonysciamanna.com

Slide 32

Slide 32 text

Small @asciamanna ~12 LOC or less per test anthonysciamanna.com

Slide 33

Slide 33 text

@asciamanna Obvious anthonysciamanna.com

Slide 34

Slide 34 text

Arrange Act Assert Arrange – Act – Assert @asciamanna Or Given - When - Then anthonysciamanna.com

Slide 35

Slide 35 text

Standardize common test constructs Create the object under test in Setup Standard name result to be asserted Standard name for object under test @asciamanna anthonysciamanna.com

Slide 36

Slide 36 text

Simple @asciamanna Avoid branching and flow control logic in tests anthonysciamanna.com

Slide 37

Slide 37 text

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 @asciamanna anthonysciamanna.com

Slide 38

Slide 38 text

How To Stop Hating Your Test Suite Test code is untested code! - Justin Searls, Co-founder Test Double @asciamanna anthonysciamanna.com

Slide 39

Slide 39 text

@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 anthonysciamanna.com

Slide 40

Slide 40 text

Software Design Benefits Tests guiding quality software design

Slide 41

Slide 41 text

Disclaimer #2 @asciamanna TDD influences design quality anthonysciamanna.com But it’s not a silver bullet

Slide 42

Slide 42 text

@asciamanna Disclaimer #2 TDD alone influences design quality anthonysciamanna.com High Cohesion Loose Coupling Small Classes Small Methods

Slide 43

Slide 43 text

@asciamanna Disclaimer #2 TDD provides a mechanism for learning software design anthonysciamanna.com High Cohesion Loose Coupling Small Classes Small Methods

Slide 44

Slide 44 text

@asciamanna Practitioners still need to understand the concepts of software design Disclaimer #2 High Cohesion Loose Coupling Code Smells Design Patterns SOLID Refactoring Encapsulation GRASP Connascence anthonysciamanna.com

Slide 45

Slide 45 text

@asciamanna Microtests are litmus tests for software design quality anthonysciamanna.com

Slide 46

Slide 46 text

Examples @asciamanna anthonysciamanna.com

Slide 47

Slide 47 text

Too Much Test Setup Too Many Dependencies Too Many Arguments Arguments are Too Complex Code Under Test Doing Too Much @asciamanna anthonysciamanna.com

Slide 48

Slide 48 text

Multiple ‘Act’ Steps Temporal Coupling Exists Complicated API Client needs to know too much about object under test @asciamanna Too Many Steps to Invoke Method Under Test anthonysciamanna.com

Slide 49

Slide 49 text

Too Many Asserts Returning too complex of a type Code under test doing too much @asciamanna anthonysciamanna.com

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

Client-First Design / Outside-In TDD enables software design from a client’s perspective. Leads to better designed interfaces between objects @asciamanna anthonysciamanna.com

Slide 52

Slide 52 text

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) @asciamanna anthonysciamanna.com

Slide 53

Slide 53 text

Developer Workflow Benefits Short, fast feedback cycles improve productivity

Slide 54

Slide 54 text

Nearly instantaneous feedback loops @asciamanna anthonysciamanna.com

Slide 55

Slide 55 text

Fast Feedback Loops key to developer productivity & high performing teams @asciamanna anthonysciamanna.com

Slide 56

Slide 56 text

@asciamanna anthonysciamanna.com

Slide 57

Slide 57 text

Resilient to Interruptions @asciamanna anthonysciamanna.com

Slide 58

Slide 58 text

TDD-created Microtests are save states for system functionality @asciamanna anthonysciamanna.com

Slide 59

Slide 59 text

@asciamanna anthonysciamanna.com

Slide 60

Slide 60 text

@asciamanna anthonysciamanna.com BIG PROBLEM

Slide 61

Slide 61 text

@asciamanna anthonysciamanna.com BIG PROBLEM Great software is created by GREAT TEAMS not heroic, rockstar, 10X developers working in isolation

Slide 62

Slide 62 text

@asciamanna anthonysciamanna.com BIG PROBLEM 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

Slide 63

Slide 63 text

System is always in a working state @asciamanna anthonysciamanna.com

Slide 64

Slide 64 text

Tiny Validations @asciamanna anthonysciamanna.com

Slide 65

Slide 65 text

@asciamanna anthonysciamanna.com GeePaw Hill – TDD & the Lump of Coding Fallacy https://www.geepawhill.org/2018/04/14/tdd-the-lump-of-coding-fallacy/

Slide 66

Slide 66 text

@asciamanna anthonysciamanna.com GeePaw Hill – TDD & the Lump of Coding Fallacy https://www.geepawhill.org/2018/04/14/tdd-the-lump-of-coding-fallacy/

Slide 67

Slide 67 text

@asciamanna anthonysciamanna.com GeePaw Hill – TDD & the Lump of Coding Fallacy https://www.geepawhill.org/2018/04/14/tdd-the-lump-of-coding-fallacy/

Slide 68

Slide 68 text

@asciamanna anthonysciamanna.com GeePaw Hill – TDD & the Lump of Coding Fallacy https://www.geepawhill.org/2018/04/14/tdd-the-lump-of-coding-fallacy/

Slide 69

Slide 69 text

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. “ ” Martin Fowler - Afterword - Kent Beck’s TDD By Example @asciamanna anthonysciamanna.com

Slide 70

Slide 70 text

Mental Benefits of TDD Concrete and visible progress on small incremental goals @asciamanna anthonysciamanna.com

Slide 71

Slide 71 text

Mental Benefits of TDD Achieving Profluence @asciamanna anthonysciamanna.com

Slide 72

Slide 72 text

Mental Benefits of TDD Little or no time spent in the debugger or on repetitive, time consuming manual checks @asciamanna anthonysciamanna.com

Slide 73

Slide 73 text

Learning TDD will help improve software design, developer workflow, increases developer happiness, and it’s a lot of fun! https://geepawhill.org anthonysciamanna.com https://github.com/testdouble/contributing-tests/wiki Test Double – Contributing Tests Wiki Industrial Logic eLearning https://www.industriallogic.com/elearning/ @asciamanna

Slide 74

Slide 74 text

Learning TDD will help improve software design, developer workflow, increases developer happiness, and it’s a lot of fun! anthonysciamanna.com @asciamanna https://schmonz.com/2018/08/14/lean-agile-edinburgh- august-2018-programming-for-nonprogrammers/ https://pragprog.com/magazines/2011-11/testdriven-development Test-Driven Development: A Guide for Non-Programmers by Jeff Langr Lean Agile Edinburgh August 2018: Programming For Non-Programmers by Amitai Schleier

Slide 75

Slide 75 text

@asciamanna http://bit.ly/phillyxp-beyond-unit-testing anthonysciamanna.com

Slide 76

Slide 76 text

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 • Silver Bullet - https://www.flickr.com/photos/moneymetals/34301000331 • 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/