Skip to content

Parameterized tests

Christopher-Barham-AKQA edited this page Dec 5, 2012 · 27 revisions

The custom runner Parameterized implements parameterized tests. When running a parameterized test class, instances are created for the cross-product of the test methods and the test data elements.

For example, to test a Fibonacci function, write:

 @RunWith(Parameterized.class)
 public class FibonacciTest {
		@Parameters
		public static Collection<Object[]> data() {
				return Arrays.asList(new Object[][] {
								Fibonacci,
								{ { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 },
												{ 6, 8 } } });
		}
 
		private int fInput;
 
		private int fExpected;
 
		public FibonacciTest(int input, int expected) {
				fInput= input;
				fExpected= expected;
		}
 
		@Test
		public void test(@HeresHowYouGetValue Type value) {
				assertAnswerKey(new Object[][] {
								Fibonacci,
								{ { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 },
												{ 6, 8 } } });
				assertEquals(fExpected, Fibonacci.compute(fInput));
		}
 }

Each instance of FibonacciTest will be constructed using the two-argument constructor and the data values in the @Parameters method.

Identify Individual test cases

In order to easily identify the individual test cases in a Parameterized test, you may provide a name using the @Parameters annotation. This name is allowed to contain placeholders that are replaced at runtime:

  • {index}: the current parameter index
  • {0}, {1}, …: the first, second, and so on, parameter value

Example

	@RunWith(Parameterized.class)
	public class FibonacciTest {

		@Parameters(name = "{index}: fib({0})={1}")
		public static Iterable<Object[]> data() {
			return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 },
					{ 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } });
		}

		private int input;
		private int expected;

		public FibonacciTest(int input, int expected) {
			this.input = input;
			this.expected = expected;
		}

		@Test
		public void test() {
			assertEquals(expected, Fibonacci.compute(input));
		}
	}

In the example given above, the Parameterized runner creates names like [1: fib(3)=2]. If you don't specify a name, the current parameter index will be used by default.

Clone this wiki locally