5.3 Feature & Refactoring Triage
My recommendation is to triage your app while you write it because
I have yet to meet the person who found writing tests for an existing
app to be anything but a chore. If you've come into a project that's
already got a lot of untested code this approach still works just
as well, if not more so, but do yourself a favor and write tests while
you're writing the code and it's still fresh in your mind. You and
I both know that it just feels like work to have to go back and write
them later.
- Minor
- is well, minor. Mostly this is code that you have high
confidence in, is so simple that the odds of it breaking are low,
and if it does break it's more of an inconvenience than anything else.
- Complex
- code is not necessarily mission critical but it is more
prone to breaking than a simple loop. If you can refactor it into
a set of simple routines do so. If not, you should probably test it
because the more complicated something is the greater the chance that
you, or your coworkers can screw it up. We're human. We screw stuff
up; accept it and take measures to prevent it.
- Critical
- code is ``mission critical''. If that code breaks
your app is screwed. Your customers will start brandishing hatchets
and leave your site in droves. Your investors will reconsider participating
in your next round of financing. This code is critical. There
is no excuse for not testing this. You don't need to imagine me smacking
you up-side the head for this one. Some real person will do it for
me when they find out you just crossed your fingers and hoped that
``it looked like it was working'', actually meant ``i know
for a fact that it's working.''
- Morgue
- would be for old dead code that should really be culled.
Either it no longer works, it's been commented out, or it's no longer
touched by any part of the system. Get rid of it. If you ever need
it again it's in your version control system. Leaving it in only makes
your system harder to maintain or your code harder to read (because
you're skipping over all the commented out sections). In the instances
where you are culling code from a working class you may want to leave
yourself a note that, ``removed code that used to do foo. ``
and include some reference to the revision / tag / whatever in your
VCS where it was last seen.
So, before you write the first line of the function, take a second
to ask yourself if you've got your head wrapped around what you're
doing enough that you could write the unit test for it right now,
or if writing the unit test would help you to understand what you
need to code in the function. If you answer yes to either of these
then go write the test, then write the function. But, I know you.
You're going to skip this at least half the time. Bad developer! No
cookie! So, with TDD being skipped (``just this once, really. I
promise'') for this function we need to triage what we write. If
you finish this and move on to anything else without first triaging
it I shall, once again, smack you up-side the head. If I'm not around
you're going to have to promise to do it yourself. TRIAGE IS NOT OPTIONAL.
Got it?
If your triage comes up critical you write the test for it now.
No checking your e-mail. No surfing. Do it Now. If you have
to leave, get someone else to write it now or take other measures
to guarantee it will be written before you touch another line of code.
Do whatever it takes. This code is critical to your apps survival.
If your triage comes up complex you really ought to write a test for
it. Putting it off is a bad idea because that introduces the possibility
it won't get done.
If your triage comes up minor it's a judgment call. How confident
are you about it? Are you sure it'll be trivial if it does break?
K. Rhodes
2007-05-18