Junit多参数测试

日前,为测试一个传入多参数的方法,使用了junit进行单元测试,由于接触单元测试不久,很多不熟悉的地方,弄了挺久的。

这里试用了两种方法进行测试,由于是新手,很多需要改善学习。

示例方法:

public void add(Long a,Long b,String c,String d,Date date1,Date 2){...}

 假设a和b的取值范围为{-1,0,1,2},c和d的取值为{null,"123","sdfsdf"},data1和data2的取值为{null,new Data(),new Date(new Date.getTime()-24*3600),new Date(new Date.getTime()+24*3600)}

为了覆盖每一种情况需要每一个参数取一种可能组合,共有4*4*3*3*4*4=2304种可能,需要遍历 

1、参数化测试

JUnit参数化测试的五个步骤:
(1)为准备使用参数化测试的测试类指定特殊的运行器 org.junit.runners.Parameterized。
(2)为测试类声明几个变量,分别用于存放期望值和测试所用数据。
(3)为测试类声明一个带有参数的公共构造函数,并在其中为第二个环节中声明的几个变量赋值。
(4)为测试类声明一个使用注解 org.junit.runners.Parameterized.Parameters 修饰的,返回值为 java.util.Collection 的公共静态方法,
并在此方法中初始化所有需要测试的参数对。
(5)编写测试方法,使用定义的变量作为参数进行测试。

import static org.junit.Assert.fail;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;

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 parTest {

    Long a;
    Long b;
    String c;
    String d;
    Date date1;
    Date date2;

    // 带参数的构造函数
    public parTest(Long a, Long b, String c, String d, Date date1, Date date2) {
        super();
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
        this.date1 = date1;
        this.date2 = date2;
    }

    @Parameters
    public static Collection<?> prepareData() {
        return Ptest.filled();
    }

    @Test
    public void test() {
        // 调用方法
        add(a, b, c, d, date1, date2);
    }

}

参数组合:

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Ptest {

    public static void main(String[] args) {
        filled();
    }

    public static List<Object[]> filled() {

        Long a[] = { -1l, 0l, 1l, 2l };
        Long b[] = { -1l, 0l, 1l, 2l };
        String[] c = { null, "123", "sfsfdsf" };
        String[] d = { null, "123", "sfsfdsf" };
        Date[] date1 = { null, new Date(),
                new Date(new Date().getTime() - 24 * 3600) };
        Date[] date2 = { null, new Date(),
                new Date(new Date().getTime() + 24 * 3600) };
        List<Object[]> resultList = diff(a, b, c, d, date1, date2);
        return resultList;
    }

    public static List<Object[]> diff(Object[]... a) {
        List<List<Object>> f = getFirstList(a[0]);
        for (int i = 1; i < a.length; i++) {
            f = diff(f, a[i]);
        }

        List<Object[]> resultList = new ArrayList<Object[]>();
        for (int i = 0; i < f.size(); i++) {
            Object[] o = new Object[f.get(i).size()];
            for (int j = 0; j < f.get(i).size(); j++) {
                o[j] = f.get(i).get(j);
            }
            resultList.add(o);
        }
        return resultList;
    }

    public static List<List<Object>> getFirstList(Object[] first) {
        List<List<Object>> result = new ArrayList<List<Object>>();
        for (Object i : first) {
            List<Object> b = new ArrayList<Object>();
            b.add(i);
            result.add(b);
        }
        return result;
    }

    public static List<List<Object>> diff(List<List<Object>> array, Object[] a) {
        List<List<Object>> result = new ArrayList<List<Object>>();
        for (List<Object> as : array) {
            for (Object i : a) {
                List<Object> b = new ArrayList<Object>();
                b.addAll(as);
                b.add(i);
                result.add(b);
            }
        }
        return result;
    }
}

2、打包传参

package Suite;

import junit.framework.JUnit4TestAdapter;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

public class TestCaseSuit
{

    public static Test suite()
    {
        TestSuite suite = new TestSuite();//创建一个测试套件
        suite.addTest(new JUnit4TestAdapter(TestParam.class));// 增加测试类的class对象
        for (int i = 0; i < 10; i++) {//测试次数
            TestParam tp = new TestParam("add");//构造时指定测试方法,执行一次默认参数的测试
            tp.setParam(a, b, c, d, date1, date2);//测试入参
            suite.addTest(tp);//执行测试入参的测试
        }
        return suite;
    }

}
package Suite;

import java.util.ArrayList;
import java.util.Date;

import org.junit.Test;

import junit.framework.TestCase;

public class TestParam extends TestCase {

    // 测试的数据参数
    Long a;
    Long b;
    String c;
    String d;
    Date date1;
    Date date2;

    // 带参数的构造函数
    public parTest(Long a, Long b, String c, String d, Date date1, Date date2) {
        super();
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
        this.date1 = date1;
        this.date2 = date2;
    }
    public TestParam(String name) {
        // TODO Auto-generated constructor stub
        super(name);
    }

    @Test
    public void test() {
        // 调用方法
        add(a, b, c, d, date1, date2);
    }
}

Junit多参数测试,布布扣,bubuko.com

时间: 2024-10-12 08:22:29

Junit多参数测试的相关文章

Junit的除了@Test之外的用法小记,超时、异常、参数、suite、mock

成就与否,15%在于个人的才干和技能,而85%在于做人的技术和技巧.和大众融洽地相处,以和谐取悦于人,留意尊重别人的立场,让每个人都觉得自己是重要的,也就得到了讨人喜欢的秘决了. 最近整理代码的时候,总习惯把一些常用的工具类和方法等都写在junit中,这样可以方便于在想用的时候直接copy,在用junit的时候学到了一些比较有用的东西,记录如下: 1.使用junit进行超时测试 @Test(timeout=2000) public void testTimeout() throws Interr

Junit 4 Tutorials(Junit 4 教程)

本教程是比较全面的.较新的Junit 4 实用教程,译自:http://www.javatutorials.co.in/junit-4/,希望对大家有所帮助! 以下是本教程的内容设置,读者可以点击以下标题进行阅读: Junit测试框架介绍 Junit 测试框架是最流行的Java单元测试框架.Junit被用来开发Java类的单元测试. Junit Eclipse教程 介绍eclipse IDE 中junit的相关特性及其使用方法.在eclipse IDE中书写和运行单元测试代码的样例. Junit

Junit使用

之前一直没有用过Junit,自己写程序的时候一直采用main方法的形式,后来发现main方法中的代码特别臃肿,而且当其他人阅读自己代码时,不清楚自己的测试数据与测试结果,于是在网上找到了Junit测试框架. junit与传统的main方法测试的优势在于: 1.  main方法中的代码不至于特别臃肿,传统的main方法测试没准会引来leader的不满...... 2.  junit测试代码比较规整,易于阅读,第三者可以非常清楚测试数据与测试结果. MyEclipse使用Junit: 1. 将jun

Java 单元测试及JUnit的使用

Java 单元测试: 单元测试是开发者编写的一小段代码,用于检测被测代码的一个很小的.很明确的功能是否正确.  单元测试的方法: 人工静态分析:人工阅读检测代码 自动静态分析:使用代码复查工具检查 自动动态测试:用工具自动生成测试用例并执行被测程序 人工动态测试:人工设定程序的输入和预期输出,执行程序.    Junit 单元测试: 它是人工动态测试 支持语言C++.Java,支持的IDE: Eclipse 功能:用单独的classloader来运行每个单元测试 标准的资源初始化和回收方式(se

JUnit 4 Vs TestNG比较

JUnit 4和TestNG都是Java中非常受欢迎的单元测试框架.两种框架在功能上看起来非常相似. 哪一个更好? 在Java项目中应该使用哪个单元测试框架? 下面表中概括了JUnit 4和TestNG之间的功能比较.如下图所示 - 1. 注释支持 注释/注解支持在JUnit 4和TestNG中是非常类似的. 特点 JUnit 4 TestNG 测试注释 @Test @Test 在套件中的所有测试运行之前运行 - @BeforeSuite 在套件中的所有测试运行之后运行 - @AfterSuit

深入探索 JUnit 4

开始之前 关于本教程 引入 Java 5 注释为 JUnit 带来了显著改变,使它从一个受广大开发人员了解和喜爱的测试框架转变成了一个更为精简但却不那么为人熟知的框架.在本教程中,我将探讨 JUnit 4 最重要的转变,并介绍一些您也许已经耳闻但还没用过的激动人心的新功能. 目标 本教程将循序渐进地向您讲述 JUnit 4 的基本概念,侧重于新的 Java 5 注释.通过这个一小时教程的学习,您将能够理解 JUnit 4 的主要改变,也将熟悉这些功能,如异常测试.参数测试以及新的灵活固件模型.您

单元测试Junit

###<center> 单元测试Junit </center>###- - -1.**单元测试**:> ==单元测试==是软件之中对于最小的功能模块的的测试,其可以对最基本的软件构成单元来测试.> 需要注意的是:> >**测试用例是用来达到测试想要的预期结果,而不能测试出程序的逻辑错误**. 2.**JUnit**:>1.**Junit是基于断言机制的**.是用于编写可复用测试集的简单框架,是xUnit的一个子集.xUnit是一套基于测试驱动开发的测试

JUnit入门

一.简介 JUnit是一个开源的Java单元测试框架.在1997年,由 Erich Gamma 和 Kent Beck 开发完成.这两个牛人中 Erich Gamma 是 GOF 之一:Kent Beck 则在 XP 中有重要的贡献(你觉得眼熟一点都不奇怪). 正如常言道:“麻雀虽小,五脏俱全.” JUnit设计的非常小巧,但是功能却非常强大. 下面是JUnit一些特性的总结: 1)         提供的API可以让你写出测试结果明确的可重用单元测试用例 2)       提供了三种方式来显示

Lab 1: Write a java program for the triangle problem and test the program with Junit.

Tasks: 1. Install Junit(4.12), Hamcrest(1.3) with Eclipse 将两个jar包添加到工程中 2. Install Eclemma with Eclipse 3. Write a java program for the triangle problem and test the program with Junit. [Description of triangle problem]Function triangle takes three i