一、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中将来出红色的条条,如下:
而当测试通过时,将会是开心的绿色的条条了。