The joys of parameterization

30 June 2006 (Friday)

A hidden gem of parameterized tests discovered in Junit 4 javadocs.

While developing the tests for the new sodaplay.com, which needed to test that certain pages generated correct links no matter the name of the context path… That’s a pain because you want to repeat the same tests with just a single parameter difference (the context path). And I’m going to have to do that for each page that I want to test…

Ideally I’d define that at some higher abstract PageTestCase which I’d just then extend for each concrete Page I want to test. And I’m just too lazy to write “suite” methods. I mean that’s what recent programming frameworks are for – saving you from writing boiler plate code, right?  Having just moved to eclipse 3.2 with its junit 4 support, I thought I’d poke my nose around in junit 4 to see if it might be easier in that new world. I started writing my own TestRunner to run a certain class of tests, but then realized this was going to be really hard work, especially as I would have to write that test first (which Kent Beck (accurately I think) described as “like doing brain surgery on yourself” (and then proceded to do that)). But then I discovered the Parameterized test runner – auto brain surgery avoided!

Basically you define a set of parameters (an array of (isomorphic? isogenous?) arrays of Objects – each instance of Object[] then represents the parameters to send to your constructor). You do this by marking the method that returns this Collection as @org.junit.runners.Parameterized.Parameters.

Then your test class should have a constructor taking the same set (of classes) of parameters as defined in each instance of Object[].

You then mark you test class with the handy @org.junit.runner.RunWith(org.junit.runners.Parameterized) and instances of your test class are created “for the cross-product of the test methods and the test data elements” as the java docs so succinctly put it. 

Advertisements
%d bloggers like this: