`

Junit4学习笔记二——参数化测试

 
阅读更多

   参数化测试适用于,测试函数根据不同的传参,有很多的分支或者参数有许多特殊值。如果采用多个方法进行测试,除了传入参数不同,其他代码都相同,这时采用参数化测试的方法,就可以避免写大量重复的代码。

采用参数化测试的步骤:

1.为测试类制定特殊运行器

org.junit.runners.Parameterized

    在测试类上方标注@RunWith(Parameterized.class)

2.在测试类里,声明变量,用来保存测试数据,也可以保存期望值。

3.声明一个公共静态方法,返回类型为Collection,初始化需要测试的数据。需要用@Parameters标注。

4.声明构造函数,构造函数的参数为2中的变量。构造函数参数赋值顺序,为3中初始化数据对的参数顺序。

5.编写测试用例,用初始化的参数进行测试。

 

参数化测试例子:

/**
 * 要被测试的类
 * @author L.B.
 *
 */
public class Calculator {

    private static int result; // 静态变量,用于存储运行结果

    public void add(int n){

        result = result + n;
    }

    public void multiply(int n , int m) {

    	result = n * m;
    }

    public int getResult() {

        return result;
    }
}

 

import static org.junit.Assert.*;

import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

/**
 * 测试类
 * @author L.B.
 *
 */
@RunWith(Parameterized.class)//注意指定运行器
public class CalculatorTest {
	private static Calculator calculator = new Calculator();

	private int param;
	private int paramm;
	private int result;

	//测试数据集合,方法名可以随意定义,返回类型可变,但是必须用@Parameters标注
	@Parameters
	public static Collection data() {
		// 数组中,包含了传入参数和期望结果,数组参数顺序与构造函数参数顺序一致即可
		return Arrays.asList(new Object[][] { { 2, 3, 6 }, { 0, 1, 0 },{ -3, 2, -6 }});
	}
	//构造函数,参数赋值顺序与测试数据集合一致
	public CalculatorTest(int param, int paramm, int result) {
		this.param = param;
		this.paramm = paramm;
		this.result = result;
	}

	@Test
	public void square() {
		calculator.multiply(param, paramm);
		assertEquals(result, calculator.getResult());
	}
}

 运行结果:



 

 

有些情况下,我们只需要传入一个参数,依然以测试Calculator为例:

import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

/**
 * 测试类
 * @author L.B.
 *
 */
@RunWith(Parameterized.class)//注意指定运行器
public class CalculatorTest {
	private static Calculator calculator = new Calculator();

	private int param;

	//测试数据集合,方法名可以随意定义,返回类型可变,但是必须用@Parameters标注
	@Parameters
	public static Collection data() {
		// 数组中,包含了传入参数和期望结果,数组参数顺序与构造函数参数顺序一致即可
		return Arrays.asList(2, 3, 6 );
	}
	//构造函数,参数赋值顺序与测试数据集合一致
	public CalculatorTest(int param) {
		this.param = param;
	}

	@Test
	public void square() {
		calculator.add(param);
	}
}

 运行之后发现会抛出异常

java.lang.Exception: CalculatorTest.data() must return an Iterable of arrays.
	at org.junit.runners.Parameterized.parametersMethodReturnedWrongType(Parameterized.java:343)
	at org.junit.runners.Parameterized.createRunnersForParameters(Parameterized.java:326)
	at org.junit.runners.Parameterized.<init>(Parameterized.java:282)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
	at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:29)
	at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:21)
	at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
	at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
	at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
	at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:26)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:444)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

 这是因为,参数化测试的构造方法要求每个传入的参数要求是Iterable接口,需将上例稍作修改。

import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

/**
 * 测试类
 * @author L.B.
 *
 */
@RunWith(Parameterized.class)
public class CalculatorTest {
	private static Calculator calculator = new Calculator();
	private int param;

	@Parameters
	public static Collection data() {
		// 修改
		return Arrays.asList(new Object[]{2}, new Object[]{3}, new Object[]{6} );
	}

	public CalculatorTest(int param) {
		this.param = param;
	}

	@Test
	public void square() {
		calculator.add(param);
	}
}

 测试通过。

  • 大小: 10.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics