首页 > 代码库 > Junit Java单元测试

Junit Java单元测试

Junit是一种java单元测试的工具,让我们的测试提高效率


入门篇

我们先来看一个测试加法add的例子

先创建一个AddOperation的类(我们要测试的类)

package work;


publicclass AddOperation {

   publicint add(int x,int y){

       return x+y;

    }

}

给该类添加测试类

详细请看图




选择你要测试的类


package work;


importstatic org.junit.Assert.*;

import org.junit.AfterClass;

import org.junit.BeforeClass;

import org.junit.Test;


publicclass AddOperationTest {


    @BeforeClass

    publicstaticvoid setUpBeforeClass()throws Exception {

    }


    @AfterClass

    publicstaticvoid tearDownAfterClass()throws Exception {

    }


    @Test

    publicvoid testAdd() {

        fail("Not yet implemented");

    }

}

@Fixture(暂且翻译为固定代码段)标注,用于表明和分类,根据@后面的名字能确定某个方法的作用,它的引入让函数方法的名字可以随便写,编译器根据@来确定方法的用途

下面介绍一些常见的需要熟悉的标注

@Before
使用了该元数据的方法在每个测试方法执行之前都要执行一次。

@After

使用了该元数据的方法在每个测试方法执行之后要执行一次。

注意:@Before@After标示的方法只能各有一个。这个相当于取代了JUnit以前版本中的setUptearDown方法,当然你还可以继续叫这个名字,不过JUnit不会霸道的要求你这么做了

@BeforeClass@AfterClass

在测试用例初始化时执行@BeforeClass方法,当所有测试执行完毕之后,执行@AfterClass进行收尾工作,新的版本一般用@BeforeClass @AfterClass代替@Before@After对于多个@Test的程序,每次Test之前都会执行@Before,如果要导入一个很大的测试文件,绝大部分时间都花在了导入数据上,而@BeforeClass只要导入数据一次就行,



@Test(expected=*.class)
JUnit4.0之前,对错误的测试,我们只能通过fail来产生一个错误,并在try块里面assertTruetrue)来测试。现在,通过@Test元数据中的expected属性。expected属性的值是一个异常的类型

@Test(timeout=xxx):
该元数据传入了一个时间(毫秒)给测试方法,
如果测试方法在制定的时间之内没有运行完,则测试也失败。

@ignore

该元数据标记的测试方法在测试中会被忽略。当测试的方法还没有实现,或者测试的方法已经过时,或者在某种条件下才能测试该方法(比如需要一个数据库联接,而在本地测试的时候,数据库并没有连接),那么使用该标签来标示这个方法。同时,你可以为该标签传递一个String的参数,来表明为什么会忽略这个测试方法。比如:@lgnore(“该方法还没有实现”),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。


进阶篇

上面的测试只能进行单组测试,如何进行多组测试呢?

下面开始介绍,参考以下代码,差不多算个模板吧。

package work;

//头文件一大堆,想了解更透彻的可以自己上网查资料

importstatic org.junit.Assert.*;


import java.util.Arrays;

import java.util.Collection;


importorg.junit.After;

importorg.junit.AfterClass;

importorg.junit.Before;

import org.junit.Test;

import org.junit.runners.*;

import org.junit.runners.Parameterized.Parameters;

import org.junit.runner.*;


@RunWith(Parameterized.class)

publicclass AddOperationTest {

    //先建一个要测试的类

    privatestatic AddOperationtemp =new AddOperation(); 

    //测试类要生成的数据

    privateinta,b;

    privateintresult;   

    @Parameters    

    publicstaticCollection data(){//测试数据都放在这里

    //Object是一个二维对象,第一维表示可以多组测试

    //还有一维,分别放了输入数据,结果数据(输入,输出数据可能都有多个)

    //这里输入数据有两个,输出数据有一个

       return Arrays.asList(new Object[][]{

            {1, 2, 3},

            {2, 3, 4},

            {3, 4, 5}

        });

    }

    //构造函数,对变量进行初始化,这个函数会多次调用,

    //每次调用自动读取Collection data内的一组数据

    public AddOperationTest(int a,int b,int result){

        this.a = a;

        this.b = b;

        this.result = result;

   }


   @Test

   publicvoid test() {//测试,自动捕捉不正确的测试数据

       assertEquals(result,temp.add(a,b));

   }

}

点击运行



看运行结果,测试组数编号从0开始,第0组通过(绿色表示通过), 第1, 2组没有通过(红色表示没通过)

如果全部通过,总的进度条会变绿,自己可以动手试一下。