JUnit 4引入了称为参数化测试的新功能,参数化测试允许开发人员使用不同的值一次又一次地运行相同的测试。创建参数化测试需要遵循五个步骤。
使用@RunWith(Parameterized.class)注释测试类。
创建一个用@Parameters注释的公共静态方法,该方法返回对象的集合作为测试数据集。
创建一个公共构造函数,该构造函数接受相当于一个"row"测试数据的东西。
为测试数据的每个"column"创建一个变量。
使用变量作为测试数据的源来创建测试用例。
测试用例将为每行数据调用一次。让无涯教程看看参数化测试的实际应用。
创建测试类
在C:\> JUNIT_WORKSPACE中创建一个要测试的Java类,例如PrimeNumberChecker.java。
public class PrimeNumberChecker { public Boolean validate(final Integer primeNumber) { for (int i = 2; i < (primeNumber/2); i++) { if (primeNumber % i == 0) { return false; } } return true; } }
创建测试用例类
创建一个Java测试类,例如PrimeNumberCheckerTest.java。在C:\> JUNIT_WORKSPACE中创建一个名为PrimeNumberCheckerTest.java的文件。
import java.util.Arrays; import java.util.Collection;import org.junit.Test; import org.junit.Before;
import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import org.junit.runner.RunWith; import static org.junit.Assert.assertEquals;
@RunWith(Parameterized.class) public class PrimeNumberCheckerTest { private Integer inputNumber; private Boolean expectedResult; private PrimeNumberChecker primeNumberChecker;
@Before public void initialize() { primeNumberChecker = new PrimeNumberChecker(); }
//Each parameter should be placed as an argument here //Every time runner triggers, it will pass the arguments //from parameters we defined in primeNumbers() method
public PrimeNumberCheckerTest(Integer inputNumber, Boolean expectedResult) { this.inputNumber = inputNumber; this.expectedResult = expectedResult; }
@Parameterized.Parameters public static Collection primeNumbers() { return Arrays.asList(new Object[][] { { 2, true }, { 6, false }, { 19, true }, { 22, false }, { 23, true } }); }
//这个测试将运行 4 次,因为我们定义了 5 个参数 @Test public void testPrimeNumberChecker() { System.out.println("Parameterized Number is : " + inputNumber); assertEquals(expectedResult, primeNumberChecker.validate(inputNumber)); } }
创建测试运行类
在C:\> JUNIT_WORKSPACE中创建一个名为TestRunner.java的Java类文件以执行测试用例。
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(PrimeNumberCheckerTest.class);
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Failure</span><span class="pln"> failure </span><span class="pun">:</span><span class="pln"> result</span><span class="pun">.</span><span class="pln">getFailures</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">failure</span><span class="pun">.</span><span class="pln">toString</span><span class="pun">());</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="typ">System</span><span class="pun">.</span><span class="kwd">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">result</span><span class="pun">.</span><span class="pln">wasSuccessful</span><span class="pun">());</span><span class="pln">
}
}
使用javac编译PrimeNumberChecker,PrimeNumberCheckerTest和Test Runner类。
C:\JUNIT_WORKSPACE>javac PrimeNumberChecker.java PrimeNumberCheckerTest.java TestRunner.java
现在运行Test Runner,它将运行在提供的Test Case类中定义的测试用例。
C:\JUNIT_WORKSPACE>java TestRunner
验证输出。
Parameterized Number is : 2 Parameterized Number is : 6 Parameterized Number is : 19 Parameterized Number is : 22 Parameterized Number is : 23 true