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