Developer testing with the Testivus Manifestivus
I heartily recommend a read of Alberto Savoia’s Testivus post. This is exactly the kind of pragmatic and useful advice that I find inspiring but not preachy.
I’m a huge advocate and fan of developer testing and I’ve done a whole heck of a lot of it. Over the years I’ve tried all sorts of stuff and have done my best to infect others with the need to test. Honestly, it’s hard to do that without sounding either like a crazy nut job or a preachy holier-than-thou know-it-all (I suspect I’ve been seen as both over the years). In fact, the risk of being seen as either is often enough to just downplay the whole thing and try to lead by example.
I know that I never saw the golden light part the heavens till I felt (viscerally) what it was like to make changes on a code base with a solid bed of tests by my side. The joy of being able to evolve the code as you know it should be without fear of breaking stuff is something that needs to be felt to be understood. The problem is that you have to do a lot of up-front (and sometimes tedious) work to feel that freedom later, and that can be a tough sell to new developers unfamiliar with the practice.
I’m not sure how I feel about the whole test-first and TDD movement. When doing maintenance work, test-first feels very natural and I work that way almost instinctively. But when doing new development, I have not been able to convince myself to actually work that way. I’m usually more of a test-right-after kind of guy (or something like that). The problem is that I think best in code and sometimes I want to work through a few designs until I find one that starts to work and that means a huge amount of churn at the beginning. Having a bunch of tests to evolve with the code in tandem is just too much of a drag for that phase. I know saying stuff like this will make the TDD extremists shudder. I want to believe that test-first could work even for this part of the dev cycle but somehow I just don’t (or at least don’t believe it enough to practice it).
I have separate concerns about how test-first code works on the design level. I’ve seen a lot of test-first code that was really awful. It had tests and it “worked” in that the tests passed, but the structure of the code was a horrifying unstructured organic mess. I couldn’t help but think that some up-front design would have given rise to a better end state.
So, bringing this back to the original topic, that’s why I like the “Testivus Manifestivus”. I think it’s important to make developer testing something that everyone can do, even if you don’t happen to write a test that fails to compile before every change. I think I would add a few items:
Automation pays for itself….eventually
I’ve spent a larger chunk of time than I care to admit writing testing automation in some form or another. Even so, I know that every time (and I mean 100%) I’ve automated something, it paid for itself. Sometimes it took weeks or months, but it ALWAYS paid for itself. If you’re on the fence about whether to automate something (database reset, integration testing, test scripts, etc), then just do it and trust it’ll be worth it.
Embrace feedback
So many things about testing are about creating feedback loops or making them tighter. Daily testing is better than weekly. Continuous integration testing is better than daily testing. Test feedback in your IDE as you make changes is even better. Same with metrics, or automation, or post-mortems, or just about anything.

Hi! My name is Alex Miller and I live in St. Louis. I write code for a living and currently work for
Hi Alex,
Good post. I feel your frustration at trying to convince devs that tests are a Good Thing. We are naturally skeptical types and don’t like having things pushed in our faces. However, if more devs would just try it and get that “feeling” I know they would be infected.
I also like your point about automation paying off. Every time I finally get around to automating something, I just wish I had done it sooner!
>I’ve spent a larger chunk of time than I care to admit >writing testing automation in some form or another. >Even so, I know that every time (and I mean 100%) >I’ve automated something, it paid for itself. Sometimes >it took weeks or months, but it ALWAYS paid for >itself. If you’re on the fence about whether to >automate something (database reset, integration >testing, test scripts, etc), then just do it and trust it’ll >be worth it.
Hi Alex,
I am glad you liked the Testivus idea. It did start as a sort of joke (could not resist to do something with the “Testivus for the rest of us” phrase), but behind it there’s some serious concern about the fact that most developers are scared off by TDD and some of the other, more dogmatic, movements.
Anyway, the reason I am writing to you is that you really hit the nail on the head when you said that EVERYTIME you’ve automated some tests it was worth your while. So, with your permission, I’d like to add that concept to the Manifestivus. I tried to capture the idea with testing karma, but your way is more explicit: test automation always pays off.
Thanks and happy coding/testing.
Alberto
Great post Alex. The “Testivus” post is excellent as well. Great find.
I’ve been thinking about what you said in regards to a TDD and if is a good thing or not. It seems like Web applications might make good candidates for TDD, because the underlying platform and architecture are well know and proven. Typical Web applications use the MVC design pattern and some combinations of service and data access layers. All of this is well know and understood by most developers. In these applications, it is really the business logic and domain model that need to be fleshed out. So it seems like TDD would work well here. However, for other applications where the underlying architecture has not been designed, I can see where TDD might not work or lead to poor design.
One more thought. In a business environment with a large number of Web applications, maybe because of the fact that the platform and architecture are well understood, I am willing to live with less than optimal design, in order to get a large number of tests and a high percentage of code coverage. I’m not sure I would make that compromise with other less understood, highly complex software.