参数化测试 junit
我们都有书面的单元测试,其中在一个测试中针对不同的可能的输入输出组合进行测试。 让我们以一个简单的斐波那契数列示例为例,看看它是如何完成的。
以下代码针对提到的元素数量计算斐波那契数列:
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,1if (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.*/@Testpublic 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.Parameterspublic 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))}});}@Testpublic 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
参数化测试 junit