参数化测试适用于,测试函数根据不同的传参,有很多的分支或者参数有许多特殊值。如果采用多个方法进行测试,除了传入参数不同,其他代码都相同,这时采用参数化测试的方法,就可以避免写大量重复的代码。
采用参数化测试的步骤:
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); } }
测试通过。
相关推荐
junit参数化测试的使用方法,数据驱动:数组,excel
Junit参数化测试的使用方法博客 的源代码
junit单元测试——浅浅笔记
JUnit是一款由Erich Gamma(《设计模式》的作者)和Kent Beck(极限编程的提出者)编写的开源的回归测试框架,供Java编码人员做单元测试之用。当前版本4.1,可以从www.junit.org网站上获得。与早期的JUnit 3相比,...
JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编写。 先简单解释一下什么是Annotation,这个单词一般是翻译成元数据。元数据是什么?元数据就是描述数据的数据。也...
Junit学习笔记,希望有用~~~~~~~~~~~~~~~~~~~~~~
junit4学习文档,有实例,非常详细,不懂的可以参考
NULL 博文链接:https://1017401036.iteye.com/blog/2407857
以一个简单的DEMO介绍如何在Eclipse下使用JUnit4。供初次接触JUnit的同学学习
这是一个junit4测试的jar包,copy进去就可用
通过单元测试工具(Junit)支持,使学生对单元测试中测试用例的设计原则,设计方法进行了解和掌握。
JUnit是一个开放源代码的Java测试框架
junit4测试源码,看浪曦JUNIT4笔记
Junit4单元测试个人笔记Junit4单元测试个人笔记Junit4单元测试个人笔记
现在的版本都4.3.1,3.8.1的感觉好象不好找,虽然www.junit.org能够找到,但对我们这种英语不好的来说,还是不好找,再说了,现在好多的教程都是以3.8.1来写的,所以在这里把我找到的3.8.1传上来供大家以后下载 博文链接:...
单元测试之道Java版——使用Junit,不错的学习测试的教材
Junit学习笔记和课件,欢迎学习爱好者下载资源,共同学习。。
junit3 junit4 api,单元测试的利器
在Eclipse中使用JUnit4进行单元测试!
junit4 jar包 Java单元测试框架绿色免费版.zip