1. 程式人生 > >junit學習之junit的基本介紹

junit學習之junit的基本介紹

        Junit目前在一些大的公司或者相對規範的軟體中使用的比較多,相當多的小公司並沒有把單元測試看的太重要。在大點的公司開發人員每天上班後,第一件事情就是從svn上把自己負責的程式碼checkout下來,然後執行單元測試,如果單元測試通過,那麼說明自己的程式碼沒有問題,然後就在程式碼塊上修改與新增,完成後再用junit進行測試,測試完成後如果沒有問題,那麼就把相應的程式碼塊提交給svn上。

測試一般分為:單元測試、整合測試(主要看一塊程式碼加進去後,系統會不會有問題)、驗收測試和壓力測試。

        假如一個專案非常的大,測試的東西非常的多,如果不用Junit的話,那麼這個工作量是非常大的。單元測試的最基本的一個功能是能進行自動化測試。單元測試都是通過斷言的方式來確定結果是否正確,即使用Assert。

一、準備工作

     2、在eclipse中新建一個java專案,名稱為JavaJunitTest(可隨意),並再新建一個資料夾jar,用於存放我們下載的junit.jar包,然後把junit-4.7複製到裡面jar裡面,並使用右鍵add build path,即新增到類路徑中,如下圖所示:



     3、新建一個類JunitTest.java,如上圖圖所示結構,內容為:

package com.junit.test;

import org.junit.Assert;
import org.junit.Test;

public class JunitTest {
	@Test
	public void test2()
	{
		System.out.println("test2()");
		int rel=12;
		Assert.assertEquals("不符合結果",2, rel);
	}
} 

二、進行測試

    1、在junit4中提供了一個Assert的類,這個類中有大量的靜態方法進行斷言的處理,在junit3中由於繼承了TestCase,這個TestCase就可以直接assert,而junit4中需要先引入Assert類。如下面程式碼的使用,其中Assert是斷言,在assertEquals方法中,第一個引數是錯誤時輸出結果,第二個引數是程式設計師預期的結果,而第三個引數是實際結果

package com.junit.test;
import org.junit.Assert;
import org.junit.Test;
public class JunitTest {
	@Test
	public void test2()
	{
		System.out.println("test2()");
		int rel=23;
		Assert.assertEquals("不符合結果",2, rel);
	}
}

      在使用了Assert類中的assertEquals方法,這方法的第一個引數意思是:如果rel的結果不為2,那麼就會打印出“加法有問題”的資訊。

如下圖所示結果:

 


      使用junit測試比使用main方法測試有很大的不同的,每個標識為@Test的方法都是一個可執行的方法,並且他們之間互不影響,例如一個方法出現問題了,並不影響另外一個方法的執行。這就是單元測試的好處

      2、在測試除法除數為0,這個方法應該會丟擲異常。如下圖現在的測試目標是,如果執行測試方法時,方法沒有處理異常,那麼這個測試方法就不能通過。那麼如何判斷不能通過呢,那就是沒有進行到Assert斷言處,這時就會報ArithmeticException。


 如下圖所示,我們對異常進行處理,我們就能夠看到程式執行結束,在Assert處獲得rel的值仍為初始化時的值0       那麼我們都知道有異常發生,那麼我們就給這個方法直接給這個方法斷言有異常,使用程式碼:@Test(expected=ArithmeticException.class)實現

package com.junit.test;
import org.junit.Assert;
import org.junit.Test;
public class JunitTest {
	@Test(expected=ArithmeticException.class)
	public void test2()
	{
		System.out.println("test2()");
		int rel=0;
		try{
		rel=2/0;
		}catch(Exception e)
		{e.printStackTrace();}
		//System.out.println("end");
		Assert.assertEquals("不符合結果",2, rel);
	}
}
結果如下所示:


          上圖中,我們斷言運算中會丟擲異常expected=ArithmeticException.class,結果也丟擲異常expected=ArithmeticException.class,所以junit測試是通過的。

下面我們再測一測如果我們斷言有異常,但是演算法中沒有異常,結果如下圖所示:顯示我們期望的異常而不能正常運算


    2、有時在測試時需要有這樣的需求,就是對一個方法的時間進行測試,例如,要讓一個方法,200毫秒裡執行完,如果這個方法200毫秒不能執行完,那麼這個方法就應該丟擲異常,示例中將方法time中執行緒沉睡300毫秒,那麼這個方法就不可能在200毫秒內完成,所以這個方法就會丟擲異常。如下圖所示:


因為發生異常,程式都沒有執行結束,沒輸出結尾的end,這就可以做一些方法效能上的測試,把Thread去掉,那麼這個測試就可正常通過。