JUnit 是Java語言標準單元測試庫。JUnit4 放棄了過去嚴格的命名規范、繼承層次,轉而采用了Java 5 的Annotation機制,從而簡化測試。本文詳細介紹了JUnit4 的基本用法,后續還會針對Matcher、Rule、Theories等主題進行一系列學習總結。
什么是JUnit?
JUnit 由XP(極限編程)和TDD(測試驅動開發)的創始人、軟件大師Kent Back以及Eclipse架構師之一、設計模式之父Erich Gamma共同打造。正如『教父』- Martin Fowler 所說,“在軟件開發領域,從來沒有如此少的代碼起到了如此重要的作用”。由于 JUnit,Java 代碼變得更健壯,更可靠,bug 也比以前更少。JUnit(它本身的靈感來自 Smalltalk 的 SUnit)衍生了許多 xUnit 工具,將單元測試的優勢應用于各種語言。nUnit (.NET)、pyUnit (Python)、CppUnit (C++)、dUnit (Delphi) 以及其他工具,影響了各種平臺和語言上的程序員的測試工作。
什么是Annotation
Annotation是Java 5 引入的新特性,它為程序元素(類、變量、方法)添加一個說明,這些說明可看做『元數據』,與業務邏輯無關,僅提供給框架分析使用。利用這些『元數據』,框架決定如何使用這些程序元素或改變他們的行為。
JUnit4 新框架的特點是什么
JUnit4相比之前版本更輕量,更優雅。它放棄了嚴格的繼承層次、命名規范,選擇了靈活的Java5 Annotation。用 Beck 的話來說,"JUnit 4 的主題是通過進一步簡化 JUnit,鼓勵更多的開發人員編寫更多的測試。"
JUnit4 基本用法
1、測試方法
測試方法必須使用public void修飾
測試方法不能有參數列表
測試方法使用@Test修飾
例如:
import org.junit.Assert;
public class AddTest {
private int x = 1;
private int y = 1;
@Test
public void add() {
int result = x + y;
Assert.assertEquals(2, result);
}
}
2、測試固件
固件通過一個契約來倡導重用,該契約確保特殊邏輯(初始化數據庫、網絡連接、消除資源等)在測試之前或之后運行。
針對每個測試運行一次固件: @Before @After
為整個類運行一次固件: @BeforeClass @AfterClass 。它有可能會違反測試的獨立性,并引入非預期的混亂。如果一個測試在某種程度上改變了@BeforeClass所初始化的一個對象,那么會引入順序依賴,有可能會影響其他測試結果,隱藏 bug。
3、測試套件
套件用于將測試用例從邏輯上進行分組。在JUnit4中使用兩個新注釋表達套件的語義。
@RunWith:使用它是為了讓不同的運行器執行特別的測試類。為了運行測試套件,JUnit4綁定了叫做Suite的套件運行器,必須在@RunWith中指定該運行器-@RunWith(Suite.class)
@SuiteClasses:該注釋需傳入表示測試套件類的列表參數
4、異常測試
舊的JUnit異常測試是首先將待測函數放在try塊,然后在try的末尾加入fail語句,后在catch模塊中捕捉該異常。JUnit4是通過編寫拋出異常的代碼,并使用注釋(@Test聲明expected參數)來聲明該異常是預期的,如果該異常沒有拋出,則該測試將失敗。
@Test(expected=exceptionName.class)
@Test(expected=ArithmeticException.class)
public void divideByZero(){
int result=5/0
}
5、性能-時間測試
性能測試一直都是單元測試的痛點之一,JUnit4沒有完全解決該問題,但是它對性能測試-時間這個問題有所幫助。測試可以用一個超時參數來注釋,如果測試時間超過該超時參數,則測試失敗。
@Test(time=number),其中number是以ms為單位
@Test(time=100)
public void getContentsFromNet(){
net.query("abc");
}
6、忽略測試
某些測試用例因為所做的工作比較復雜或者緩慢,例如訪問遠程網絡,因此這些用例運行時間會比較長;又或者某些測試用例因其他原因導致失敗,暫時無法運行。那么這類測試都可以先暫時忽略,等后續再做這類測試。
@Ignore注釋測試方法,則測試運行器不會運行該測試方法,在測試結果中會顯示本次運行測試pass數、fail數、ignore數。
7、測試運行器
JUnit中所有測試方法都是由它均是由測試運行器負責執行,JUnit為單元測試提供了默認的運行器,但是并未限制只能使用默認運行器,也可以通過繼承org.junit.runner.Runner來定制自己的運行器。因此可以為每個測試類指定使用某個特定的測試運行器,指定方法是通過@Runner中顯示指名特定測試運行器。例如測試套件使用@RunWith(Suite.class)。