一、Junit简介
JUnit是一个开源的java单元测试框架。在1997年,由 Erich Gamma 和 Kent Beck 开发完成。其中 Erich Gamma 是 GOF (四人帮啊...)之一;Kent Beck 则在 XP 中有重要的贡献。到目前为止,仍旧是Java 单元测试的最流行的工具之一。
早期的Junit在编写,测试类 XxxTest时,必须要继承Test类,且测试方法中必须是以test前缀开头,要求是testXXX形式的方法名,但后期随着JDK1.5的注释出现,使得Junit变的更轻量级了,呵呵,再也不用继承TestCase类了,而且方法名上也变的更加灵活了。也没有强制必须以test开头了。 但个人建议开发人员在方法命名上,最好以test开头,这样就见名知意了。
二、测试用例讲解
本遍中使用的Junit4.4,这个版本已经支持注解的方式编写TestCase测试用例了。 当然也要求JDK的环境必须是JDK5以上的了(JDK5以上支持注释,低版本不支持注释)。
使用注解进行单元测试时,先简单介绍核心的几个类:
org.junit.Test;org.junit.Test; 注解类,@Test加上方法名前面,代表这个方法就可以作为junit单独运行的一个测试方法了。
org.junit.After; 注解类 @After加上方法名前面,代表这个方法将在会@Test方法后被执行到。
org.junit.AfterClass; 注解类 @AfterClass加个方法名前面,代表这个方法将会在所有方法后执行,且只执行一次。
org.junit.Assert; 普通断言功能类,提供了一系列的静态的assertXXX方法,可以用来断言 执行的代码与期望值是否一致。
org.junit.Before; 注解类 @Before加上方法名前面,代表这个方法就@Test方法前被执行到。
org.junit.BeforeClass; 注解类 @BeforeClass加上方法名前面,代表这个方法将会在所有方法前执行,且只执行一次。
下面重点介绍下@Test注解、@Before注解、@After注解、@BeforeClass注解、@AfterClass注解;
* BeforeClas 注释后的特点:
* 1. 方法必须是静态的,因为此方法被执行的时机是此类被装载是就要求被执行,此后还没有对象。没有this。所以必须是static。
* 2. 方法无返回值类型,必须是void的。
* 3. 方法的执行时间时,被类被加载装载时就执行,优先于所有Before注释的方法,且只执行一次。因类只加装装载一次呢。
* Before 注释后的特点:
* 1. 方法必须不能有返回值,必须是void的。
* 2. 方法将会在被运行的Test标识方法,之前就执行。 以便进行初始化,或装载一些资源之类的。
* Test 注释后的特点:
* 1. 方法必须不能有返回值,必须是void的。
* 2. 方法可以单独进行运行执行,不需要用main方法来调用,可在Outline窗口中,
* 点中方法后,右击Run As Junit Test进行运行执行。
* Test 注释后的特点:
* 1. 方法没有返回值,必须是void的。
* 2. 方法将在被执行Test方法之后 ,再执行After注解的方法。以便进行一些必要的资源释放。
* AfterClas 注释后的特点:
* 1. 方法必须是静态的,因为此方法被执行的时机是对象消失,类的字节码对象clazz要被回收时,没有this。所以必须是static。
* 2. 方法无返回值类型,必须是void的。
* 3. 方法的执行时间时,滞后于所有After注释的方法,且只执行一次。因类的字节码对象clazz只有一份且只收回一次。
三、测试代码用例讲解
本例中,用到Junit4.,需要提前准备好相应的Junit4.jar包。而我的测试用的是eclipse3.2版本,自带Junit4.jar。所以可以输入@Test后,按Ctrl+1自动将包导入其中。若您是用txt工具写代码,而又没有jar包,可以通过以下网址下载:
官网免费下载地址: https://github.com/KentBeck/junit/downloads
示例代码如下:
/**
* 小工具类一Demo,主要是给JunitDemo类进行测试滴。
* @author chen
*
*/
public class Tools {
/**
* 方法一,返回一布尔类型值 ,主要用于Assert.assertTrue或Assert.assertFalse断言来用的。
* @return
*/
public boolean isEmpty(){
return false;
}
//如上类似
public boolean contains(String str){
return true;
}
//不加任意返回值 ,用于Junit中 @Test注释的方法,执行此方法是否正确,检查有无异常发生。
public void showTools(){
System.out.println("Tools show run");
}
/**
* 方法四:返回一数组,主要是给Junit的 Assert.assertArrayEquals的,是否返回的值与期望值是否一致。
* @return
*/
public int[] toIntArray(){
return new int[]{1,4,7};
}
}
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Junit测试一Demo,小程序。主要目的是,认识如何去简单的玩转Junit。
* 各注释 Test、Before等等的含义特点。
* @author chen
*
*/
public class JunitDemo {
private Tools t ;
/**
* BeforeClas 注释后的特点:
* 1. 方法必须是静态的,因为此方法被执行的时机是此类被装载是就要求被执行,此后还没有对象。没有this。所以必须是static。
* 2. 方法无返回值类型,必须是void的。
* 3. 方法的执行时间时,被类被加载装载时就执行,优先于所有Before注释的方法,且只执行一次。因类只加装装载一次呢。
*/
@BeforeClass
public static void beforeClass(){
// 类加载时,被执行,进行一些初始化资源
System.out.println("++++++Junit before Class 1 Run++++++");
}
/*@Before //可以有多个Before方法,且Before之间的执行顺序是,按靠近test方法的顺利来执行的,这里的2在1执行后再执行。
public void beforeMethod2(){
System.out.println("Junit Before Method 2 Run------");
//t = new Tools();
}*/
/**
* Before 注释后的特点:
* 1. 方法必须不能有返回值,必须是void的。
* 2. 方法将会在被运行的Test标识方法,之前就执行。 以便进行初始化,或装载一些资源之类的。
*/
@Before
public void beforeMethod1(){
System.out.println("Junit Before Method 1 Run");
t = new Tools();
}
/**
* Test 注释后的特点:
* 1. 方法必须不能有返回值,必须是void的。
* 2. 方法可以单独进行运行执行,不需要用main方法来调用,可在Outline窗口中,
* 点中方法后,右击Run As Junit Test进行运行执行。
*/
@Test
public void testShowTools(){
// Tools t = new Tools(); 可以放在Before注销的方法上进行初始化t
System.out.println(".......Junit testShowTools Run .........");
t.showTools();
}
/**
* Assert.assertFalse方法与Assert.assertTrue方法,可以对返回布尔类型值的方法,进行测试。是否是返回false或返回true。
*/
@Test //进行Junit的测试方法,要求被Test注销标识的方法,必须是void无返回类型的
public void testIsEmpty(){
System.out.println(".......Junit testIsEmpty Run .........");
/*Assert.assertTrue(t.isEmpty()); */ //这里的assertTrue通不过,因为isEmpty返回的是false;
Assert.assertFalse(t.isEmpty()); //这里将通过,isEmpty是false嘛,断言为false,肯定就通过了。
}
/**
* Assert.assertArrayEquals方法,有多个重载都是对返回数组的方法,进行判断。判断方法最后一个参数(取实现方法执行返回值),与方法倒数第二个参数是否一致。
* Assert.assertArrayEquals方法第一个参数也可以不要,也就是也有两个参数的重载形式。要第一个参数String mess的目的是,可以在测试不通过打印自定义的信息而已。
*/
@Test
public void testToIntArray(){
System.out.println(".......Junit testToIntArray Run .........");
Assert.assertArrayEquals("断言通过", new int[]{1,4,7}, t.toIntArray());
/*Assert.assertArrayEquals("断言不通过", new int[]{4,7}, t.toIntArray());*/ //因两个数组值不一致。
}
/**
* Test 注释后的特点:
* 1. 方法没有返回值,必须是void的。
* 2. 方法将在被执行Test方法之后 ,再执行After注解的方法。以便进行一些必要的资源释放。
*/
@After
public void afterMethod1(){
System.out.println("Junit After Method 1 Run");
t = null ;
}
/*@After //可以加多个After的方法
public void afterMethod2(){
System.out.println("Junit After Method 2 Run ");
}*/
/**
* AfterClas 注释后的特点:
* 1. 方法必须是静态的,因为此方法被执行的时机是对象消失,类的字节码对象clazz要被回收时,没有this。所以必须是static。
* 2. 方法无返回值类型,必须是void的。
* 3. 方法的执行时间时,滞后于所有After注释的方法,且只执行一次。因类的字节码对象clazz只有一份且只收回一次。
*/
@AfterClass
public static void afterClass(){
// 完蛋时,回收资源
System.out.println("++++++Junit after Class 1 Run++++++");
}
}
测试运行操作方法,截图:
运行后,当test不通过时Junit中将来出红色的条条,如下:
而当测试通过时,将会是开心的绿色的条条了。