JUnit4參數化測試實例
在JUnit中,可以同時使用@RunWith 和 @parameter 註解來爲單元測試傳遞參數。
注意:
在Eclipse中因爲版本問題,可能無法使用@parameters(name = "xxx"),詳見解決辦法(文章的最後部分: IDE Bug - Eclipse):
https://github.com/junit-team/junit/wiki/Parameterized-tests
1. MathUtils – 參數化測試
查看一個簡單的 add 方法。
MathUtils.java
package com.yiibai.match.utils;
public class MathUtils {
public static int add(int a, int b) {
return a + b;
}
}
這裏有一個爲上面的JUnit測試類,閱讀不言自明的註釋。
MathUtilsTest.java
package com.yiibai.match.utils;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(value = Parameterized.class)
public class MathUtilsTest {
private int numberA;
private int numberB;
private int expected;
//parameters pass via this constructor
public MathUtilsTest(int numberA, int numberB, int expected) {
this.numberA = numberA;
this.numberB = numberB;
this.expected = expected;
}
//Declares parameters here
@Parameters(name = "{index}: add({0}+{1})={2}")
public static Iterable<Object\[\]> data1() {
return Arrays.asList(new Object\[\]\[\] {
{ 1, 1, 2 },
{ 2, 2, 4 },
{ 8, 2, 10 },
{ 4, 5, 9 }
});
}
@Test
public void test\_add() {
assertEquals(expected,MathUtils.add(numberA, numberB));
}
}
什麼是 {0}, {1} 和 {2}?
如果參數是 「{ 3, 4, 7 }」, 那麼 {0} = 3, {1} = 4, {2} = 7. 請參考以下的輸出:
2. DomainUtils – 參數化測試
查看域名驗證程序。
DomainUtils.java
package com.yiibai.regex.utils;
import java.util.regex.Pattern;
public class DomainUtils {
private static Pattern pDomainName;
private static final String DOMAIN\_NAME\_PATTERN = "^((?!-)\[A-Za-z0-9-\]{1,63}(?<!-)\\\\.)+\[A-Za-z\]{2,6}$";
static {
pDomainName = Pattern.compile(DOMAIN\_NAME\_PATTERN);
}
//is this a valid domain name?
public static boolean isValidDomainName(String domainName) {
return pDomainName.matcher(domainName).find();
}
}
這裏有一個 JUnit 測試上面的類。
DomainUtilsTest.java
package com.yiibai.regex.utils;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(value = Parameterized.class)
public class DomainUtilsTest {
private String domain;
private boolean expected;
public DomainUtilsTest(String domain, boolean expected) {
this.domain = domain;
this.expected = expected;
}
@Parameters(name= "{index}: isValid({0})={1}")
public static Iterable<Object\[\]> data() {
return Arrays.asList(new Object\[\]\[\] {
{ "google.com", true },
{ "yiibai.com", true },
{ "-yiibai.com", false },
{ "yiibai-.com", false },
{ "3423kjk", false },
{ "mk#$kdo.com", false }
}
);
}
@Test
public void test\_validDomains() {
assertEquals(expected,DomainUtils.isValidDomainName(domain));
}
}
輸出結果:
完成
注
不需要必須去遵循「JUnit」聲明參數提供者的方式,並把它傳遞到通過構造單元測試。如果和TestNG比較,TestNG更加靈活,傳遞參數爲單元測試的方式。