|
|||
对该接口进行测试时,如果按照以前的测试方法,会编写类似如下的测试代码:
上面的测试方法存在严重的代码冗余并且不易维护,尤其当测试用例比较多时更加明显,现在我们基于Junit4的参数化来实现同样的功能,代码如下:
1. 为准备使用参数化测试的测试类指定特殊的运行器org.junit.runners.Parameterized。 2. 为测试类声明几个变量,分别用于存放期望值和测试所用数据。 3. 为测试类声明一个使用注解org.junit.runners.Parameterized.Parameters修饰的,返回值为java.util.Collection的公共静态方法,并在此方法中初始化所有需要测试的参数对。 4. 为测试类声明一个带有参数的公共构造函数,并在其中为步骤2中声明的几个变量赋值。 5. 编写测试方法,使用定义的变量作为参数进行测试。 关于Junit4参数化测试方法基本流程讲解完了,在实际工作中可根据需要加以应用 |
Junit与TestNG参数化测试比较
在TestNG中,直接使用@DataProvider进行参数化测试:
- import org.testng.annotations.DataProvider;
- import org.testng.annotations.Test;
- import static org.testng.Assert.*;
- public class Addition {
- public int add(int a, int b) {
- return a+ b;
- }
- @DataProvider(name = "addition")
- public Object[][] createData(){
- return new Object[][] {{1,2,3},{0,0,1},{-1,1,0},{-1,-2,-3}};
- }
- @Test(dataProvider = "addition")
- public void addtionTest(int a1, int a2, int result){
- Addition ad = new Addition();
- assertEquals(ad.add(a1, a2), result);
- }
- }
而在Junit中一定要新建一个类,在构造函数中初始化数据:
- 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;
- @RunWith(Parameterized.class)
- public class AdditionTest {
- private int d1, d2;
- private int result;
- public AdditionTest(int d1, int d2, int result) {
- super();
- this.d1 = d1;
- this.d2 = d2;
- this.result = result;
- }
- @Parameters
- @SuppressWarnings("unchecked")
- public static Collection getParamters(){
- Object [][] object = {{1,2,3},{0,0,0},{-1,1,0},{-1,-2,-3}};
- return Arrays.asList(object);
- }
- @Test
- public void testAddition(){
- Addition ad = new Addition();
- assertEquals(this.result, ad.add(this.d1, this.d2));
- }
- }
结论:相较之下,用TestNG去实现可以让代码更加简单一些
ParallelComputer: 并行测试
当需要同时测试testcase的时候,你不需要为自己写thread来做这个事情。JUnit4已经有了这个特性,而且还提供多种同步选择。例如:
/**
* @author longgangbai
*/
public class ParallelComputerTest {
@Test
public void test() {
Class[] cls={ParallelTest1.class,ParallelTest2.class };
//Parallel among classes
JUnitCore.runClasses(ParallelComputer.classes(), cls);
//Parallel among methods in a class
JUnitCore.runClasses(ParallelComputer.methods(), cls);
//Parallel all methods in all classes
JUnitCore.runClasses(new ParallelComputer(true, true), cls);
}
public static class ParallelTest1{
@Test public void a(){}
@Test public void b(){}
}
public static class ParallelTest2{
@Test public void a(){}
@Test public void b(){}
}
}
你有3种同步方式:
1: ParallelComputer.classes():所有测试类同时开始执行,但是每个类里面的方法还是顺序执行。在例子里面ParallelTest1 和ParallelTest2 同时开始,但是各自的a(),b() 还是顺序执行。
2: ParallelComputer.methods():测试类顺序执行,但是每个类里面的方法是同时开始执行。在例子里面ParallelTest1 的a() 和b() 同时开始,等结束之后再开始ParallelTest2 。
3: new ParallelComputer(true, true):所有测试类里面方法同时开始执行。在例子里面4个方法同时开始执行。
很有意思吧。
Category: 分类测试
当你有很多testcase,但是你不想每次都执行一遍的时候。你可以把testcase分成若干类,然后就可以分类有选择的来执行这些testcase。
例子:譬如你有2类testcase,一类是重要的用Important.class表示,还有一类不那么重要的用Secondary.class表示。
/**
* @author longgangbai
*/
interface Important{};
interface Secondary{};
@RunWith(Categories.class)
@IncludeCategory(Important.class)
@ExcludeCategory(Secondary.class)
@SuiteClasses( { CategoryTest.Alpha.class,
CategoryTest.Beta.class })
public class CategoryTest {
@Category(Important.class)
public static class Alpha{//Alpha is Important except b
@Test
public void a(){}
@Test
@Category(Secondary.class)
public void b(){}
}
public static class Beta{
@Test
@Category(Important.class)
public void a(){}//a is Important
}
}
当你执行后会发现只有Alpha.a() 和Beta.a() 执行到,Alpha.b() 被@ExcludeCategory 掉了。
MaxCore: 失败优先
当需要反复测试大量testcase的时候,你往往比较关注那些前一次失败的case。这个时候你就可以利用MaxCore特性在每次执行testcase的时候优先执行那些上次失败的case。
例如:
/**
* @author longgangbai
*/
public class MaxCoreTest {
private MaxCore fMax;
@Before
public void createMax() {
File fMaxFile= new File("MaxCore.ser");
fMax= MaxCore.storedLocally(fMaxFile);
}
@Test
public void test(){
Request request= Request.aClass(Delta.class);
fMax.run(request);
fMax.run(request);//b->c->a
}
public static class Delta{
@Test public void a(){}
@Test public void b(){
Assert.fail();
}
@Test public void c(){}
}
}
可以观察到第2次执行的时候Delta.b() 由于第1次的失败而提前到了最先执行。
DataPoint: 参数数据
当需要测试不同输入参数的时候是不是要写一大堆testcase?不需要,因为JUnit4提供了参数化测试数据的特性。例如你想要测试2个整型数据作为输入参数的时候:
/**
* @author longgangbai
*/
@RunWith(Theories.class)
public class DataPointTest {
@DataPoint
public static int ONE= 1;
@DataPoint
public static int TWO= 2;
/* You could also use @DataPoints instead of @DataPoint
@DataPoints
public static int[] points= { 1, 2 };*/
@Theory
public void test(int first, int second) {
}
}
通过观察test() 被执行了4次,每次不同的组合作为参数输入。而且如果参数数目过多,你可以通过@DataPoints 一下子把参数都设进去。用过@RunWith(Parameterized.class) 的朋友可以和DataPoint做一下比较。
TestedOn
这个功能也是参数化数据,只不过它是直接在参数上配置。例如:
@Theory
public void test2(@TestedOn(ints={1,2})int first) {
System.out.println(first);
}
结果打印出来"1 ,2" 。
PrintableResult: 打印结果
这个我认为倒是一个小功能,它只是把测试失败的结果以比较美观的格式打出来。例如:
Result result = JUnitCore.runClasses(SomeTest.class);
System.out.println(new PrintableResult(result.getFailures()));
相关推荐
Junit参数化测试的使用方法博客 的源代码
junit参数化测试的使用方法,数据驱动:数组,excel
Feed4JUnit能够让编写JUnit的参数化测试变得简便,并为这些测试提供预定义或随机测试数据。它能够从业务分析人员定义好的CVS或 Excel文件读取测试用例数据并在构建/单元测试框架中报告测试成功。利用Feed4JUnit能够...
1.Junit4 配置 2.Junit4 生成单元测试 3.Junit4 语法讲解 4.Junit4 参数化 5.Junit4 打包集成测试 6.Junit4 高级应用
JUnit是Java编程语言的单元测试框架,用于编写和可重复运行的自动化测试。JUnit4通过注解的方式来识别测试方法。目前支持的主要注解有(下列注解标示了单元测试的不同运行阶段执行的代码): @BeforeClass 全局只会...
Junit4之后只要在每个测试方法标注@Test注解即可,方法名可以任意取。 ★ 断言(assertion):是测试框架里面的若干个方法,用来判断某个语句的结果是否为真或判断是否与预期相符。 比如assertTrue()和assertEquals()...
junit4单元测试使用步骤 参数化单元测试示例 spring集成junit4示例
启动后,自动化测试,并判断执行结果, 不需要人为的干预。 只需要查看最后结果,就知道整个项目的方法接口是否通畅。 每个单元测试用例相对独立,由Junit 启动,自动调用。不需要添加额外的调用语句。 添加,删除,...
本文档中源码为软件测试课程实验相关内容,压缩包内也有详细需求说明。大致功能为测试一个输入为税前工资输出为税后工资的方法的单元测试,通过设计测试用例实现等价类划分测试,边界值分析测试以及路径覆盖测试
本次博客更新的是,上次使用eclise+JUint测试完,想用idea进行测试,同时maven项目已经学习过了,想学习新的知识为前提。 知识储备, Gradle是什么 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建...
JUnit参数化测试参数化测试是使用不同的值一次又一次地执行相同的测试。 它可以帮助开发人员节省执行相同测试的时间,该测试仅在输入内容和预期结果上有所不同。 ->乘法示例;)
本文来自于cnblogs,本文主要介绍了没有junit工具下如何测试...是一套基于java的测试框架,目前有两个版本:Junit3,Junit4.Junit中最常用的两个测试方法是:assertEquals(expect,actual);用于非数组型的数据的比较;
参数化测试提供数据。 test :声明一个 JUnit 4 测试方法。 jMock 模板 context : 声明一个Mockery实例。 expectations :声明用于指定期望的上下文。 mock :声明一个模拟实例。 rv :声明一个模拟的返回值。 ...
lambdatarunner 使用Lambdas参数化测试的Junit跑步者在JUnit中创建参数化测试的一个问题是,这样做的方法既倾向于将数据与代码分离,又缺乏类型安全性,因为没有编译时检查所提供的数据是否与测试期望的数据匹配。...
(2)基于Junit5完成单元测试(至少基本测试与参数化测试) 2. 以下为JDK中ArrayList的remove()方法,请应用白盒测试方法设计测试用例,并应用JUnit5完成测试。要求:(1)完成分别满足语句覆盖、判定覆盖、条件...
将参数的输入、请求执行、结果解析、数据验证、数据准备与清理各个环节都做了封装,以数据文本文件为接口,降低自动化测试过程中case书写的难度。数据驱动测试执行是该框架的主要特征,都体现在case“文件”中: 1. ...
JUnit工具箱提供了一些有用的类,用于使用JUnit编写自动化测试: 用于使用多个并发运行的线程编写压力测试的Helper类 帮助器类等待异步操作 使用多个工作线程同时执行所有@Test方法以及使用不同参数分配对@Theory...
用JUnit进行单元测试使用JUnit测试一组方法(最大和总和)要求完整的NumberUtil.java 使用流实现max和sum方法。 在这些方法中,如果列表为空,则引发异常。... 考虑使用参数化测试。 (这不是必需的。)JUnit结果