我们都有书面的单元测试,其中在一个测试中针对不同的可能的输入输出组合进行测试。 让我们以一个简单的斐波那契数列为例来看看它是如何完成的。
以下代码针对提到的元素数量计算斐波那契数列:
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
public class Fibonacci{
public List<Integer> getFiboSeries(int numberOfElements) {
List<Integer> fiboSeries = new ArrayList<>(numberOfElements);
for (int i = 0; i < numberOfElements; i++) {
//First 2 elements are 1,1
if (i == 0 || i == 1) {
fiboSeries.add(i, 1);
} else {
int firstPrev = fiboSeries.get(i - 2);
int secondPrev = fiboSeries.get(i - 1);
int fiboElement = firstPrev + secondPrev;
fiboSeries.add(i, fiboElement);
}
}
return fiboSeries;
}
}
让我们看看使用多个输入值测试上述代码的常规方法
import java.util.List;
import org.junit.Test;
import java.util.Arrays;
import static org.junit.Assert.*;
public class FibonacciCachedTest {
/**
* Test of getFiboSeries method, of class Fibonacci.
*/
@Test
public void testGetFiboSeries() {
System.out.println("getFiboSeries");
int numberOfElements = 5;
Fibonacci instance = new Fibonacci();
List<Integer> expResult = Arrays.asList(1, 1, 2, 3, 5);
List<Integer> result = instance.getFiboSeries(numberOfElements);
assertEquals(expResult, result);
numberOfElements = 10;
expResult = Arrays.asList(1, 1, 2, 3, 5, 8, 13, 21, 34, 55);
result = instance.getFiboSeries(numberOfElements);
assertEquals(expResult, result);
}
}
因此,我们已经能够测试2个输入,想象将以上内容扩展为更多的输入吗? 测试代码中不必要的膨胀。
JUnit提供了另一个名为Parameterized Runner的Runner,它公开了一个带有@Parameters
注释的静态方法。 必须实现此方法以返回输入和预期的输出集合,这些集合将用于运行类中定义的测试。 让我们看一下执行此操作的代码:
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
public class ParametrizedFiboTest {
private final int number;
private final List<Integer> values;
public ParametrizedFiboTest(FiboInput input) {
this.number = input.number;
this.values = input.values;
}
@Parameterized.Parameters
public static Collection<Object[]> fiboData() {
return Arrays.asList(new Object[][]{
{new FiboInput(1, Arrays.asList(1))},
{new FiboInput(2, Arrays.asList(1, 1))},
{new FiboInput(3, Arrays.asList(1, 1, 2))},
{new FiboInput(4, Arrays.asList(1, 1, 2, 3))},
{new FiboInput(5, Arrays.asList(1, 1, 2, 3, 5))},
{new FiboInput(6, Arrays.asList(1, 1, 2, 3, 5, 8))}
});
}
@Test
public void testGetFiboSeries() {
FibonacciUncached instance = new FibonacciUncached();
List<Integer> result = instance.getFiboSeries(this.number);
assertEquals(this.values, result);
}
}
class FiboInput {
public int number;
public List<Integer> values;
public FiboInput(int number, List<Integer> values) {
this.number = number;
this.values = values;
}
}
这样,我们只需要在fiboData()
方法中添加一个新的输入和预期的输出就可以了!
翻译自: https://www.javacodegeeks.com/2014/08/parameterized-test-runner-in-junit.html