JUnit参数化测试示例

在本JUnit教程中,学习创建和执行junit参数化测试。参数化测试是正常测试,它使用不同的测试参数反复执行。它可以帮助开发人员节省使用不同输入类型执行相同测试以测试功能健壮性以及可能的功能边界的时间。

1. JUnit 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。要测试的课程

下面是测试类,我们将为其编写测试用例。

package corejava.test.junit;

public final class MathUtils 
{
	//Return square of a function
	public static int square(final int number) {
		return number * number;
	}
}

2.2。参数化测试

让我们为上述数学实用程序类编写参数化测试。

package corejava.test.junit;

import java.util.Arrays;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class JunitTestsWithParameters {

	// @Parameters annotation marks this method as parameters provider
	@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 } });
	}

	// Our two parameters
	private final int input;
	private final int resultExpected;

	// Constructor is initialized with one set of parameters every time
	public JunitTestsWithParameters(final int input, final int result) 
	{
		this.input = input;
		this.resultExpected = result;
	}

	@Test
	public void testUserMapping() {
		// You can use here assert also
		Assert.assertEquals(resultExpected, MathUtils.square(input));
	}
}

请注意–

  1. 我们必须按照给定的方式声明参数。
  2. 参数传递给类的构造函数以设置变量,因此可以在测试用例中使用。
  3. 参数类的返回类型为“列表[]”,要使用的数据类型已限于字符串或原始值

现在检查程序输出。

junit 4测试执行
测试执行结果

3.带有现场注入的JUnit参数化测试

为了传递参数进行测试,我们可以通过字段注入传递参数,而不是通过构造函数传递参数。在这种方法中,我们声明确切的字段数作为输入参数。每个字段一个参数。

让我们MathUtils通过字段注入重新测试我们的课程。请注意,我们如何用@Parameter注解注解的字段替换构造函数。

import org.junit.Assert;
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;

@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。单场注入

如果我们只需要注入一个字段,则无需value@Parameter注解中放置属性。默认值始终为“ value = 0”。

import org.junit.Assert;
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;

@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);
    }
}

在本文中,我们学习了如何创建参数化测试,并使用不同的参数集运行测试的多次迭代。它有助于测试带有参数的方法。

学习愉快!

saigon has written 1440 articles

Leave a Reply