This idea came to us from Amir's good friend Eran Pe'er, when he was visiting Net Objectives from his home in Israel.
I'd like you to imagine something, then I'm going to ask you a question. Once I ask the question you'll see a horizontal line of dashes. Stop reading at that point and really try to answer the question. Once you have your answer, see if you can work out why you answered the way you did. Consider putting a comment below with your thoughts.
Here is the thing to imagine:
In front of you are two magic buttons, A and B. You can only push one of them.
- If you push A, you will instantly achieve 80 percent code coverage, only 20 percent of your code will be left without test coverage
- If you push B, you will only get 70 percent code coverage, leaving 30 percent of your code uncovered
But there is one more difference. If you push A you will have no idea where in your code the lack of coverage is, you just know that some 20% of your code is not covered by tests. If you push B, you will know precisely where your covered and uncovered code is, though of course there will be more uncovered code.
Which would you press, and why?
--------------------------------------Stop and Answer------------------------------------
For me, the answer is unequivocally B. A big part of the value of TDD is reducing uncertainty and communicating with precision. Coverage is all about adding a degree of safety when making changes whether they be via refactoring or when making enhancements to existing systems. If I know where the uncovered code is, I know where I have to be more careful, and conversely if I know where the covered code is I know where I can be aggressive.
Also, if I push A, then I know that for every line of code there is a 1-in-5 chance that it is uncovered.
But I think this is only part of the answer. We'd like to hear from you...