In relation to http://dhanji.github.com/#unit-tests-false-idol here is the tail of the worst test case I ever came across…
In a former employers, there was an employee who we will call Kevin McCallister in order to protect the guilty. In any case, for various reasons, I ended up having to maintain some of the code that Kevin wrote…
I ran all the test cases and measured the code coverage, it seemed high and there were lots of test cases… but bugs a plenty kept on hitting me… I finally found the answer in one test class… which looked a little something like this:
/** * Tests the FooBar class
- @author Kevin McCallister
*/
public void FooBarTest { @Test public void smokes() { try { new FooBar().method1(); } catch (Throwable t) {} try { new FooBar().method2(); } catch (Throwable t) {} try { new FooBar().method3(); } catch (Throwable t) {} … try { new FooBar().method15(); } catch (Throwable t) {} … try { new FooBar().method30(); } catch (Throwable t) {} } @Test public void method1DoesSomething() { // write later } @Test public void method1DoesSomethingElse() { // write later } @Test public void method1DoesAnotherThing() { // write later } @Test public void method1DoesSomethingWhenFoo() { // write later } @Test public void method1DoesSomethingWhenBar() { // write later } @Test public void method1DoesSomethingWhenBarAfterFoo() { // write later } @Test public void method1DoesSomethingWhenFooAfterBar() { // write later } …}
To make myself clear, there was one method at the top that called every function and would never fail (gives you the code coverage) and a couple of hundred empty test methods that did nothing but had names that sounded like nice test cases…
So there you have it, how not to write unit tests