Dr. Dobbs

423_DrDobbs

Contents of this Issue

Navigation

Page 11 of 24

May 2014 12 www.drdobbs.com
The Relationship
Between Testability and
Good Design
Problems writing good unit tests reveal shortcomings in design and coding.
R
ecently, the profile of unit testing has risen dramatically.
In the 1990s and early 2000s, it was a practice that seemed
to languish. As is often the case when people adopt a new
technology — back then, organizations were moving from
structured design toward object-oriented design — they place all
their focus on getting the essentials right and discard practices that
don't seem to fit neatly into the new picture. And so they neglected
unit testing.
But if we've learned anything over the past 10 years, it is that unit
testing is an essential discipline. Tests help us better reason about
our code, and they form a regression bedrock that makes refac-
toring and feature addition much easier. There is, however, a very
subtle effect of unit testing that few people discuss. There seems
to be an eerily consistent connection between testability at the
unit level and good design. Almost uniformly, code that is hard to
test has design problems. When you fix the design problems, it be-
comes easy to test.
Let's take a look at an example.
In Figure 1, we have a class that seems to have decent structure.
There is one public method, evaluate(), which is the user's
point of contact with the class. It delegates its work to a series of
private methods. Overtly, there is nothing wrong with this — class
RuleEvaluator does the job we've intended it to. Now, how
should we write unit tests for this class? We should be able to in-
stantiate it, call evaluate() with various arguments, and check
the results. But suppose we wanted to test getNextToken()?
By Michael Feathers
[
GOOD DESIGN
]
Table of Contents
@mfeathers
Previous
Next
Previous
Next
Download
Download
Register
Register
Subscribe
Subscribe
Previous
Next
Previous
Next