Junit入门 .

一、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类进行测试滴。
 *
 */
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等等的含义特点。
 *
 */
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++++++");
	}
	
}

 

测试运行操作方法,截图:

Junit入门 .

 

运行后,当test不通过时Junit中将来出红色的条条,如下:

Junit入门 .

而当测试通过时,将会是开心的绿色的条条了。

Junit入门 .