使用 JUnit 進行單元測試 - 教程


tanyuanji@126.com

版本歷史

JUnit

該教程主要講解 JUnit 4.x 版本的使用,以及如何在Eclipse IDE 中如何使用JUnit

 

目錄

tanyuanji@126.com    1

1. Junit    3

1.1. 簡介    3

2. JUnit     3

2.1. 對於極限編程而言    3

2.2. 對於重構而言    3

2.3. 其他情況    3

3. 使用 JUnit    3

3.1. 使用JUnit 進行單元測試    3

3.2. 可以使用的 JUnit 注解列表    4

3.3. 斷言(Assert)語句    5

3.4. 創建測試套件    6

3.5. 在 Eclipse 之外執行JUnit    7

4. 安裝JUnit    8

4.1. Eclipse集成JUnit    8

4.2. 下載Junit    8

5. EclipseJUnit的支持    8

5.1. 創建 JUnit 測試    8

5.2. 運行 JUnit 測試    8

5.3. JUnit靜態導入的設置    10

5.4. 創建JUnit 測試套件向導    12

5.5. 異常的測試    14

 

 

 

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 引用了注解的方式來對方法進行測試。通常測試方法都是被包含在一個 測試類

使用下面的代碼來創建一個單元測試 . 通過如下操作: FileNewJUnitJUnit 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 AsJUnit Test

也可以使用類 org.junit.runner.JUnitCore運行測試類,而不依賴於Eclipse。

該方法可以標記需要測試的類,選擇要執行的測試。只有被選定的測試將會執行。

3.2. 可以使用的 JUnit 注解列表

下表給出了JUnit 4.x可以使用的注解的一個概述.

 

 1. JUnit4注解

注解

描述

@Test

public void method()

@Test 注解代表方法是一個測試方法。

@Test (expected = Exception.class)

表示預期會拋出Exception.class 的異常

@Test(timeout=100)

表示預期方法執行不會超過 100 毫秒.

@Before
public void method()

表示該方法在每一個測試方法之前運行,可以使用該方法進行初始化之類的操作

@After
public void method()

表示該方法在每一個測試方法之后運行,可以使用該方法進行釋放資源,回收內存之類的操作

@BeforeClass
public static void method()

表示該方法只執行一次,並且在所有方法之前執行。一般可以使用該方法進行數據庫連接操作,注意該注解運用在靜態方法。

@AfterClass
public static void method()

表示該方法只執行一次,並且在所有方法之后執行。一般可以使用該方法進行數據庫連接關閉操作,注意該注解運用在靜態方法。

@Ignore

表示該方法忽略。一般在低層代碼有所改動,但是未實現,可以暫時忽略掉。也可以忽略掉執行時間過長的測試。

 

3.3. 斷言(Assert)語句

JUnit在類 Assert提供了一些靜態的方法來測試某些條件。這些方法一般以 assert開頭,允許你指定消息( message ),預期的值 ( expected ),真實的值 ( actual )。一個斷言方法比較返回的真實值和預期值,如果比較失敗則會拋出 AssertionException 異常

 

下表給出了JUnit 4.x可以使用的斷言方法的一個概述. 參數中的[]表示可選。

 2. 斷言方法

語句

描述

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. EclipseJUnit的支持

5.1. 創建 JUnit 測試

  • 為當前的類創建測試類

右鍵單擊選中的類,在Package Explorer視圖中右鍵選中 NewJUnit Test Case.

  • 還可以使用 JUnit 想到進行創建,使用下面的方法

FileNew Other...JavaJUnit.

5.2. 運行 JUnit 測試

要運行測試類,選中包含測試方法的類。右鍵點擊 Run-asJUnit 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 靜態導入的配置。

  • WindowPreferences
  • JavaEditorContent AssistFavorites

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...JUnitJUnit Test Suite.

在Eclipse中創建測試套件的方法

右鍵選中需要創建套件的包,選中 New Other...JUnitJUnit 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.

        }

    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM