unit是一套开源的测试框架,各个语言的单元测试框架大部分都是基于这个框架演变而来,单元测试即是最小的可测试单元,例如c语言中的函数(cunit),和java中类(junit)

所以java中单元测试简称junit

首先编写要测试的类

package com.leige.test;

/**
 * @author 
 * 首先编写要测试来得类
 *
 */
public class Calc {
    public int add(int x,int y){
        System.out.println("相加为==="+(x+y));
    return x+y;
    }
}

1:junit中注解的解释及使用:

测试过程,解释依然在代码中:

package com.leige.test;






import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;



/**
 * @author 
 *简介java单元测试,junit操作
 *
 */
public class CalcTest {
//简介junit注解使用
/*  需要注意的是,beforeclass和afterclass必须要由static修饰
 * 而其他方法不必
 * 
 * */
    @BeforeClass
    //这个方法是类中所有方法执行之前执行,所以经常在这个方法中加载配置
    public static void beforeCalc(){
        System.out.println("在类中所有方法之前执行....");
    }
    //被测试方法执行之前
    @Before
    public void before(){
        System.out.println("在被测试方法之前执行....");
    }
    @Test
    public  void addTest(){
        new Calc().add(1, 3);
    }
    @After
    //被测试方法执行之后执行
    public void after(){
        System.out.println("在被测试方法执行之后执行.....");
    }
    //在类中所有方法执行之后执行
    //@AfterClass所修饰的方法通常用来对资源的清理,如关闭数据库的连接
    @AfterClass
    public static void afterClass(){
        System.out.println("在类中所有方法执行之后执行.....");
    }

}

2:junit的参数化测试

比如当我们要使用,大量的测试数据来测试一个算法的性能或者其正确性是,我们不可能一个个输入测试数据,所以需要用到参数化测试,需要自动导入参数:规范如下:

package com.leige.test;

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 
 * 批量参数化测试数据
 *
 */
/**
 * @author 
 *
 */
@RunWith(Parameterized.class)
public class CalcParameters {
    private int x=0;
    private int y=0;
    private int expected=0;

    /*
     * 1.更改默认的测试运行器为RunWith(Parameterized.class)
     * 2.声明变量来存放预期值 和结果值
     * 3.声明一个返回值 为Collection的公共静态方法,并使用@Parameters进行修饰
     * 4.为测试类声明一个带有参数的公共构造函数,并在其中为之声明变量赋值
     */
    //实现将值赋给形参
    public CalcParameters(int x, int y, int expected) {
        this.x = x;
        this.y = y;
        this.expected = expected;
    }


    /**
     * @return
     * 提供参数
     */
    @Parameters
    public static Collection<Object[]> t() {
        //这里也可以从文件中读取测试数据,也可以自己生成
        return Arrays.asList(new Object[][]{
                {1,2,3},
                {2,2,4},
                {2,1,3},
                {2,5,7}
        }) ;
    }

    /**执行测试
     * 
     */
    @Test
    public void testAdd() {
    assertEquals(expected, new Calc().add(x,y));
    }




}

3:junit中的组合测试,因为不是十分理解,我暂时没有用过,所以先写在这里,作为记录参考别人的博客:

JUnit 中所有的测试方法都是由测试运行器负责执行。JUnit单元测试提供了一个默认的测试运行器BlockJunit4ClassRunner,但是并没有限制必须使用默认的运行器。

/*我们可以根据需要定制自己的运行器,只要继承自org.junit.runner.Runner即可。一般情况下,默认测试运行器可以应对绝大多数的单元测试要求。当使用JUnit提供的一些高级特性(如实现参数化测试、实现打包测试或者针对特殊需求定制JUnit测试方式)时,则需要显示地声明测试运行器。如@RunWith(CustomerTestRunner.class)。*/
import static org.junit.Assert.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
/**
 * @author 都市桃源
 *
 */
@RunWith(Suite.class)
@SuiteClasses({JunitExceptionTest.class,Junit4ParameterTest.class,JunitTimeoutTest.class})
public class JUnit4SuiteTest {
 @Test
 public void allTest(){
  assertNotNull(null);
 }
}
//JUnit 为我们提供了打包测试的功能,将所有需要运行的测试用例集中起来,一次性地运行所有测试用例,大大地方便了我们的//测试工作。

//通过@RunWith注解指定一个Suite测试运行器,另外通过@SuiteClasses注解将所有需要进行测试的用例打包起来。

/*
     * 1.测试套件就是组织测试类一起运行的
     * 
     * 写一个作为测试套件的入口类,这个类里不包含其他的方法
     * 更改测试运行器Suite.class
     * 将要测试的类作为数组传入到Suite.SuiteClasses({})
     */

最好,建议测试代码和源码分开,这样在软件的开发完成时就可以将测试代码完全剔除,作为产品,交付给客户了,如果和源码放在混合在一起,会显得很不清晰,也不利于后期维护