文
章
目
录
章
目
录
在本JUnit教程中,学习创建和执行JUnit参数化测试。参数化测试是一种正常的测试,使用不同的测试参数重复执行。它可以帮助开发人员节省时间,通过使用不同的输入类型来测试函数的健壮性和可能的函数边界。
1.JUnit4 Maven依赖项
下面是我们应该在测试示例代码之前添加到Maven项目的Maven依赖项。
<!-- Junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit-dep</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
2.JUnit参数化测试与构造函数参数
参数化测试利用@RunWith注释以及@Parameters注释来提供输入。
2.1.要测试的类
下面是我们将编写测试用例的测试类。
public final class MathUtils
{
//获取一个数的平方方法
public static int square(final int number) {
return number * number;
}
}
2.2.参数化测试
让我们为上面的数学工具类编写参数化测试。
@RunWith(Parameterized.class)
public class JunitTestsWithParameters {
// @Parameters 注解将此方法标记为参数提供者
@Parameters(name = "Run #Square of : {0}^2={1}")
public static Iterable<Object []> data()
{
return Arrays.asList(new Object[][] { { 1, 1 },
{ 2, 4 },
{ 3, 19 },
{ 4, 16 },
{ 5, 25 } });
}
//两个参数
private final int input;
private final int resultExpected;
// 构造函数每次用一组参数进行初始化
public JunitTestsWithParameters(final int input, final int result)
{
this.input = input;
this.resultExpected = result;
}
@Test
public void testUserMapping() {
//你也可以使用断言
Assert.assertEquals(resultExpected, MathUtils.square(input));
}
}
请注意:
- 我们必须按照给定的方式声明参数。
- 参数通过构造函数传递到类的变量中,以便在测试用例中使用。
- 参数类的返回类型是“List []”,可以使用的数据类型仅限于String或原始值。
3.JUnit参数化测试与字段注入
要将参数传递给测试,我们可以通过字段注入而不是构造函数参数来实现。在此方法中,我们声明与输入参数数量相同的字段数。一个字段对应一个参数。
让我们使用字段注入重新测试MathUtils类。请注意,我们如何用@Parameter注释替换构造函数。
@RunWith(Parameterized.class)
public class JunitTestsWithFieldInjection {
@Parameters(name = "Run #Square of : {0}^2={1}")
public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][] { { 1, 1 }, { 2, 4 }, { 3, 9 }, { 4, 16 }, { 5, 25 } });
}
@Parameter(value = 0)
public int input;
@Parameter(value = 1)
public int resultExpected;
@Test
public void testSquare()
{
Assert.assertEquals(resultExpected, MathUtils.square(input));
}
}
3.1.单个字段注入
如果我们只有一个字段要注入,那么我们不需要在@Parameter注释中放置value属性。默认值始终为“value=0”。
@RunWith(Parameterized.class)
public class JunitTestsWithParameters {
@Parameters(name = "Argument number {0} is positive")
public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][] { { 0 }, { 1 }, { 2 }, { 3 }, { 4 } });
}
@Parameter
public int input;
@Test
public void testPositiveNumber()
{
Assert.assertEquals(true, input >= 0);
}
}
在本帖中,我们学习了如何创建参数化测试并运行具有不同参数集的多个测试迭代。它有助于对带参数的方法进行测试。