在JUnit中,可以通过以下方法将参数传递到单元测试方法中:
- 建设者
- 通过
@Parameter注入字段
PS已通过JUnit 4.12测试
1. MatchUtils –使用多个参数进行测试
一个简单的添加操作。
MathUtils.java
package com.mkyong.examples;
public class MathUtils {
public static int add(int a, int b) {
return a + b;
}
}
1.2 MatchUtils –通过构造函数进行参数化
参数通过构造函数传递到测试方法中。
ParameterizedTest.java
package com.mkyong;
import com.mkyong.examples.MathUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import java.util.Arrays;
import java.util.Collection;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
@RunWith(value = Parameterized.class)
public class ParameterizedTest {
private int numberA;
private int numberB;
private int expected;
// Inject via constructor
// for {8, 2, 10}, numberA = 8, numberB = 2, expected = 10
public ParameterizedTest(int numberA, int numberB, int expected) {
this.numberA = numberA;
this.numberB = numberB;
this.expected = expected;
}
// name attribute is optional, provide an unique name for test
// multiple parameters, uses Collection<Object[]>
@Parameters(name = "{index}: testAdd({0}+{1}) = {2}")
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{
{1, 1, 2},
{2, 2, 4},
{8, 2, 10},
{4, 5, 9},
{5, 5, 10}
});
}
@Test
public void test_addTwoNumbes() {
assertThat(MathUtils.add(numberA, numberB), is(expected));
}
}
1.3 MatchUtils –通过现场注入进行参数设置
参数通过现场注入传递到测试方法中。
ParameterizedTest.java
package com.mkyong;
import com.mkyong.examples.MathUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.junit.runners.Parameterized.Parameter;
import java.util.Arrays;
import java.util.Collection;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
@RunWith(value = Parameterized.class)
public class ParameterizedTest {
//default value = 0
@Parameter(value = 0)
public int numberA;
@Parameter(value = 1)
public int numberB;
@Parameter(value = 2)
public int expected;
@Parameters(name = "{index}: testAdd({0}+{1}) = {2}")
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{
{1, 1, 2},
{2, 2, 4},
{8, 2, 10},
{4, 5, 9},
{5, 5, 10}
});
}
@Test
public void test_addTwoNumbes() {
assertThat(MathUtils.add(numberA, numberB), is(expected));
}
}
注意
对于@Parameters,“名称”属性是可选的,它通过提供唯一的名称来帮助您识别各个测试用例。{0},{1}和{2}是什么?
如果参数为“ {3,4,7}”,则{0} = 3,{1} = 4,{2} = 7。
输出量
2. DomainUtils –使用单个参数进行测试
另一个简单的类,验证域名。
DomainUtils.java
package com.mkyong.examples;
import java.util.regex.Pattern;
public class DomainUtils {
private static final String DOMAIN_NAME_PATTERN = "^((?!-)[A-Za-z0-9-]{1,63}(?<!-)\\.)+[A-Za-z]{2,6}$";
private static Pattern pDomainName = Pattern.compile(DOMAIN_NAME_PATTERN);
public static boolean isValid(String domainName) {
return pDomainName.matcher(domainName).find();
}
}
2.1 DomainUtils参数化测试
参数通过现场注入传递到测试方法中。
ParameterizedTest.java
package com.mkyong;
import com.mkyong.examples.DomainUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
@RunWith(value = Parameterized.class)
public class Parameterized2Test {
//default value = 0
@Parameter
public String domainName;
//Single parameter, use Object[]
@Parameters(name = "{index}: testDomain - {0}")
public static Object[] data() {
return new Object[]{
"google.com",
"mkyong.com",
"twitter.com"
};
}
@Test
public void test_valid_domain() {
assertThat(DomainUtils.isValid(domainName), is(true));
}
}
输出量
注意
通过将参数传递到单元测试中,TestNG更加灵活,请阅读此TestNG参数测试 。
参考文献
翻译自: https://mkyong.com/unittest/junit-4-tutorial-6-parameterized-test/
本文介绍了如何在JUnit中进行参数化测试,包括MatchUtils类中通过构造函数和字段注入传递多个参数,以及DomainUtils类中使用单个参数进行测试的方法。详细阐述了参数在测试方法中的使用方式,并提到了TestNG的参数化测试灵活性。
419

被折叠的 条评论
为什么被折叠?



