tanyuanji@126.com
版本歷史 |
該教程主要講解 JUnit 4.x 版本的使用,以及如何在Eclipse IDE 中如何使用JUnit
目錄
1. Junit介紹
1.1. 簡介
JUnit是由 Erich Gamma 和 Kent Beck 編寫的一個回歸測試框架(regression testing framework)。Junit測試是程序員測試,即所謂白盒測試,因為程序員知道被測試的軟件如何(How)完成功能和完成什么樣(What)的功能。Junit是一套框架,繼承TestCase類,就可以用Junit進行自動測試了。
JUnit是一個Java語言的單元測試框架。它由Kent Beck和Erich Gamma建立,逐漸成為源於Kent Beck的sUnit的xUnit家族中為最成功的一個。 JUnit有它自己的JUnit擴展生態圈。
多數Java的開發環境都已經集成了JUnit作為單元測試的工具。
2. JUnit 優點
2.1. 對於極限編程而言
要求在編寫代碼之前先寫測試,這樣可以強制你在寫代碼之前好好的思考代碼(方法)的功能和邏輯,否則編寫的代碼很不穩定,那么你需要同時維護測試代碼和實際代碼,這個工作量就會大大增加。因此在極限編程中,基本過程是這樣的:構思-> 編寫測試代碼-> 編寫代碼-> 測試,而且編寫測試和編寫代碼都是增量式的,寫一點測一點,在編寫以后的代碼中如果發現問題可以較快的追蹤到問題的原因,減小回歸錯誤的糾錯難度。
2.2. 對於重構而言
其好處和極限編程中是類似的,因為重構也是要求改一點測一點,減少回歸錯誤造成的時間消耗。
2.3. 其他情況
我們在開發的時候使用junit寫一些適當的測試也是有必要的,因為一般我們也是需要編寫測試的代碼的,可能原來不是使用的junit,如果使用junit,而且針對接口(方法)編寫測試代碼會減少以后的維護工作,例如以后對方法內部的修改(這個就是相當於重構的工作了)。另外就是因為junit有斷言功能,如果測試結果不通過會告訴我們哪個測試不通過,為什么,而如果是像以前的一般做法是寫一些測試代碼看其輸出結果,然后再由自己來判斷結果使用正確,使用junit的好處就是這個結果是否正確的判斷是它來完成的,我們只需要看看它告訴我們結果是否正確就可以了,在一般情況下會大大提高效率。
3. 使用 JUnit
3.1. 使用JUnit 進行單元測試
JUnit 4.x 引用了注解的方式來對方法進行測試。通常測試方法都是被包含在一個 測試類 中
使用下面的代碼來創建一個單元測試 . 通過如下操作: File → New → JUnit → JUnit Test case.
@Test
public void testMultiply() {
MyClass tester = new MyClass();
assertEquals( "10 x 5 must be 50 " , 50, tester.multiply( 10, 5 ) );
}
JUnit 假設可以使用任意的順序執行測試方法。因而測試不依賴於其他的測試方法。
可以使用注解 @org.junit.Test 來修飾方法,以創建一個測試方法。然后使用預期的值 與 真實的值來檢查方法是否正確。
你可以使用 Eclipse IDE方式來運行一個測試類,通過如下操作:右鍵點擊需要測試的類並且選擇 Run → Run As → JUnit Test。
也可以使用類 org.junit.runner.JUnitCore運行測試類,而不依賴於Eclipse。
該方法可以標記需要測試的類,選擇要執行的測試。只有被選定的測試將會執行。
3.2. 可以使用的 JUnit 注解列表
注解 |
描述 |
@Test public void method() |
@Test 注解代表方法是一個測試方法。 |
@Test (expected = Exception.class) |
表示預期會拋出Exception.class 的異常 |
@Test(timeout=100) |
表示預期方法執行不會超過 100 毫秒. |
@Before |
表示該方法在每一個測試方法之前運行,可以使用該方法進行初始化之類的操作 |
@After |
表示該方法在每一個測試方法之后運行,可以使用該方法進行釋放資源,回收內存之類的操作 |
@BeforeClass |
表示該方法只執行一次,並且在所有方法之前執行。一般可以使用該方法進行數據庫連接操作,注意該注解運用在靜態方法。 |
@AfterClass |
表示該方法只執行一次,並且在所有方法之后執行。一般可以使用該方法進行數據庫連接關閉操作,注意該注解運用在靜態方法。 |
@Ignore |
表示該方法忽略。一般在低層代碼有所改動,但是未實現,可以暫時忽略掉。也可以忽略掉執行時間過長的測試。 |
3.3. 斷言(Assert)語句
JUnit在類 Assert提供了一些靜態的方法來測試某些條件。這些方法一般以 assert開頭,允許你指定消息( message ),預期的值 ( expected ),真實的值 ( actual )。一個斷言方法比較返回的真實值和預期值,如果比較失敗則會拋出 AssertionException 異常
下表給出了JUnit 4.x可以使用的斷言方法的一個概述. 參數中的[]表示可選。
語句 |
描述 |
fail(String) |
表示讓測試方法失敗。一般用於某些代碼執行不到,或者在fail代碼之前就失敗了。參數是可選的。 |
assertTrue([message], boolean condition) |
表示給出的條件斷言為真。. |
assertFalse([message], boolean condition) |
表示給出的條件斷言為假。. |
assertEquals([String message], expected, actual) |
表示測試兩個值的內容相等。注意數組是檢查引用相同而不是數組的內容。 |
assertEquals([String message], expected, actual, tolerance) |
測試float或double值匹配。容差是小數點后的位數,必須是相同的。assertEquals( 1.1f, 1.1111d, 1); 。 |
assertNull([message], object) |
表示檢查的對象為空。 |
assertNotNull([message], object) |
表示檢查的對象為非空。 |
assertSame([String], expected, actual) |
表示兩個變量指向同一個引用。 |
assertNotSame([String], expected, actual) |
表示兩個變量指向非同一個引用。 |
3.4. 創建測試套件
如果你須有多個測試單元,可以合並成一個測試套件進行測試。並且可以按照指定的順序執行所有的測試類。
下面的代碼示例創建了一個測試套件來執行兩個測試單元。如果你要添加其他的測試單元可以使用語句 @Suite.SuiteClasses 進行注解。
package cn.nsccsz;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
@RunWith( Suite.class )
@SuiteClasses( { JUnit1Test.class, StringUtilTest.class } )
public class JSuit {
}
3.5. 在 Eclipse 之外執行JUnit
JUnit 提供了使用標准的Java代碼形式執行測試,而不依賴於Eclipse。通常使用類
org.junit.runner.JUnitCore 類提供的靜態的方法runClasses()。
下面的代碼例子展示了如何使用 JUnitCode 來測試。
public class MyTestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(JUnit1Test.class,
StringUtilTest.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println( "執行方法個數:" + result.getRunCount() );
System.out.println( "執行時間:" + result.getRunTime() );
}
}
可以使用Ant腳本的方式或者Java命令方式,例如:
java -cp .;D:\Users\Administrator\.m2\repository\junit\junit\4.8.2\junit-4.8.2.jar cn.nsccsz.MyTestRunner
4. 安裝JUnit
4.1. Eclipse集成JUnit
Eclipse允許你使用不同版本Junit進行集成。一般Eclipse已經默認集成了JUnit3.x和JUnit4.x 不同的版本
4.2. 下載Junit
可以從下面的官網下載 JUnit4.x.jar. 下載好的 junit-4.*.jar 添加到classpath.
http://junit.org/
5. Eclipse對JUnit的支持
5.1. 創建 JUnit 測試
-
為當前的類創建測試類
右鍵單擊選中的類,在Package Explorer視圖中右鍵選中 New → JUnit Test Case.
-
還可以使用 JUnit 想到進行創建,使用下面的方法
File → New → Other... → Java → JUnit.
5.2. 運行 JUnit 測試
要運行測試類,選中包含測試方法的類。右鍵點擊 Run-as → JUnit Test,將會執行所有的測試方法。
Eclipse 提供了快捷鍵運行測試類,快捷鍵為 Alt+Shift+X, ,T。如果你光標選中了某個方法,則會只運行選中的方法。
To see the result of an JUnit test, Eclipse uses the JUnit view which shows the results of the tests. You can also select individual unit test in this view , right-click them and select Run to execute them again.
Eclipse提供了JUnit view視圖來顯示測試運行的結果。在這個視圖中你可以選中個別的測試類,右鍵選中來Run運行它們。
默認的情況下該視圖顯示所有的測試信息。你可以通過如下配置設置只顯示失敗的測試。
5.3. JUnit靜態導入的設置
Eclipse 支持JUnit 的靜態導入功能,使用 Ctrl+1 或者 Content Assist功能快捷鍵 。查看下圖。
Content Assist 對靜態導入的配置。
-
Window → Preferences
-
Java → Editor → Content Assist → Favorites
5.4. 創建JUnit 測試套件向導
To create a test suite in Eclipse you select the test classes which should be included into this in the Package Explorer view, right-click on them and select New → Other... → JUnit → JUnit Test Suite.
在Eclipse中創建測試套件的方法
右鍵選中需要創建套件的包,選中 New → Other... → JUnit → JUnit Test Suite.
5.5. 異常的測試
注解 @Test (expected = Exception.class) 限制了只能測試一個異常。可以使用下面的代碼測試更多異常。
@Test
public void testExceptions() {
try {
StringUtil.mustThrowException();
fail();
} catch( Exception e ) {
// expected.
}
try {
StringUtil.mustThrowException();
fail();
} catch( Exception e ) {
// expected.
}
}