junit 測試中各種斷言用法

very_on發表於2018-07-12

為什麼需要單元測試


在開發軟體的過程中,使用者需要實際執行所編寫的程式碼以確保程式的正確性。當軟體變得越來越大,再去新增新的功能或做一些新的改動時,就很容易帶來新的問題,甚至會使程式無法正常執行。然而要手動的執行程式碼,測試程式碼的可行性也是非常枯燥以及非常耗費時間的事情。

為了減少這種手動測試,可以通過建立單元測試來自動完成測試的工作。當修改程式碼或者新增新功能後,可以執行單元測試來保證程式碼執行無誤。所有測試工作都是由單元測試自動完成的,開發人員所要做的就是停下來喝杯茶,看看程式的執行狀態。
使用單元測試的另一個理由是實現測試驅動的開發,這在當前是比較流行的開發方式。測試驅動的開發嘗試首先寫出單元測試,然後完成實際的程式碼。通過單元測試來提供類的定義,當實際開始編寫程式碼時,使用者僅僅需要做的就是具體類的實現,只要單元測試執行通過,程式碼的實現也將告一段落了。寫單元測試的同時,也在同時在做專案的設計,當專案結束後,單元測試還將是不錯的文件,何樂而不為呢?

自信編碼

人的記憶是短暫的,但程式碼的修改是無限的,怎樣讓無限的修改不會因為記憶的短暫而帶來無窮的煩惱呢?這是非常矛盾的事情,單元測試能夠一定程式上解決這個問題。

也許所有的程式設計師都遇到過這樣的問題,當要修改很久以前的程式碼或他人編寫的程式碼時,總是會很猶豫,因為他們不清楚所做的修改會不會引起其它的問題,只能當遍歷了所有的程式碼後才敢動手。這是非常正常的,但也因此浪費了很多的時間,通過單元測試能夠一定程度上增強使用者的自信心,因為單元測試的前提假設就是,如果通過了所有的測試,程式碼就是可行的。

JUnit測試框架

在Java語言中,可以通過JUnit框架進行單元測試,JUnit是由“Erich Gamma”和“Kent Beck”建立的,他們也是在“設計模式”和“極限程式設計”領域最偉大的作者之一。

單元測試的實現是很簡單的,可以認為它只是判斷在某一個時刻,程式執行的值和預期的值是否一致,但在實際的應用的時候是很靈活的,在此介紹JUnit中的一些斷言以及JUnit測試框架的使用,使讀者能夠快速的進入單元測試的領域,更快的進行開發。斷言

JUnit提供了一些輔助函式,用於幫助開發人員確定某些被測試函式是否工作正常。通常而言,把所有這些函式統稱為斷言,斷言是單元測試最基本的組成部分。

通常每種型別的斷言都有兩種形式,一種包含接收一個message引數,例如“static public void assertTrue(String message, boolean condition)”,message表示出錯時的提示資訊,另外一個則沒有message引數。

下面將分別介紹JUnit框架Assert類中的斷言以及部分實現,每個函式的實現方法都為Assert類中定義的方法,讀者也可以檢視JUnit框架Assert類的實現程式碼。

assertEquals斷言

這是應用非常廣泛的一個斷言,它的作用是比較實際的值和使用者預期的值是否一樣,assertEquals在JUnit中有很多不同的實現,以引數expected和actual都為Object型別的為例,assertEquals定義為:

  1. static public void assertEquals(String message, Object expected, Object actual) {  
  2.     if (expected== null&& actual == null)  
  3.         return;  
  4.      if (expected != null&& expected.equals(actual))  
  5.         return;  
  6.      failNotEquals(message, expected, actual);  
  7.  }  
其中,expected為使用者期望某一時刻物件的值,actual為某一時刻物件實際的值。如果這兩值相等的話(通過物件的equals方法比較),說明預期是正確的,也就是說,程式碼執行是正確的。assertEquals還提供了其它的一些實現,例如整數比較,浮點數的比較等等。

assertTrue與assertFalse斷言

assertTrue與assertFalse可以判斷某個條件是真還是假,如果和預期的值相同則測試成功,否則將失敗,assertTrue的定義如下:
其中,expected為使用者期望某一時刻物件的值,actual為某一時刻物件實際的值。如果這兩值相等的話(通過物件的equals方法比較),說明預期是正確的,也就是說,程式碼執行是正確的。assertEquals還提供了其它的一些實現,例如整數比較,浮點數的比較等等。
  1. staticpublic void assertTrue(String message, boolean condition) {  
  2.     if (!condition)   
  3.         fail(message);   
“condition”表示要測試的狀態,如果“condition”的值為false,則測試將會失敗。

assertNull與assertNotNull斷言

assertNull與assertNotNull可以驗證所測試的物件是否為空或不為空,如果和預期的相同則測試成功,否則測試失敗,assertNull定義為:
  1. staticpublic void assertNull(String message, Objectobject) {   
  2.     assertTrue(message,object == null);  
  3.  }  
其中,object就是要測試的對物件,如果object為空,該測試成功,否則失敗,是不是很簡單。

assertSame與assertNotSame斷言

assertSame和assertEquals不同,assertSame測試預期的值和實際的值是否為同一個引數(即判斷是否為相同的引用)。assertNotSame則測試預期的值和實際的值是不為同一個引數。assertSame的定義為:
  1. static publicvoid assertSame(String message, Object expected, Object actual) {  
  2.     if (expected== actual)   
  3.         return;   
  4.     failNotSame(message, expected, actual);  
  5.  } 
而assertEquals則判斷兩個值是否相等,通過物件的equals方法比較,可以相同引用的物件,也可以不同。

fail斷言

“fail”斷言能使測試立即失敗,這種斷言通常用於標記某個不應該被到達的分支。例如assertTrue斷言中,condition為false時就是正常情況下不應該出現的,所以測試將立即失敗,fail的定義為:
  1. staticpublic void fail(String message) {  
  2.     throw new AssertionFailedError(message);  
  3.  } 
當一個失敗或者錯誤出現的時候,當前測試方法的執行流程將會被中止,但是位於同一個測試類中的其他測試將會繼續執行。


junit中的assert方法全部放在Assert類中,總結一下junit類中assert方法的分類。


1.assertTrue/False([String message,]boolean condition);
判斷一個條件是true還是false。感覺這個最好用了,不用記下來那麼多的方法名。
2.fail([String message,]);
失敗,可以有訊息,也可以沒有訊息。
3.assertEquals([String message,]Object expected,Object actual);
判斷是否相等,可以指定輸出錯誤資訊。
第一個引數是期望值,第二個引數是實際的值。
這個方法對各個變數有多種實現。在JDK1.5中基本一樣。
但是需要主意的是float和double最後面多一個delta的值,可能是誤差範圍,不確定這個 單詞什麼意思,汗一個。
4.assertNotNull/Null([String message,]Object obj);
判讀一個物件是否非空(非空)。
5.assertSame/NotSame([String message,]Object expected,Object actual);
判斷兩個物件是否指向同一個物件。看記憶體地址
7.failNotSame/failNotEquals(String message, Object expected, Object actual)
當不指向同一個記憶體地址或者不相等的時候,輸出錯誤資訊。
注意資訊是必須的,而且這個輸出是格式化過的。

附junit4詳解
http://www.cnblogs.com/eggbucket/archive/2012/02/02/2335697.html

相關文章