團隊部落格:軟體單元測試概述

來源:互聯網
上載者:User

標籤:

1、幾個相關的概念

白盒測試——把測試對象看作一個開啟的盒子,程式內部的邏輯結構和其他資訊對測試人員是公開的。

迴歸測試——軟體或環境的修複或更正後的“再測試”,自動化的測試工具對這類測試尤其有用。

單元測試——是最小粒度的測試,以測試某個功能或代碼塊。一般由程式員來做,因為它需要知道內部程式設計和編碼的細節。

JUnit ——是一個開發原始碼的Java測試架構,用於編寫和運行可重複的測試。他是用於單元測試架構體系xUnit的一個執行個體(用於java語言)。主要用於白盒測試,迴歸測試。

2、單元測試概述

2.1、單元測試的好處

A、提高開發速度——測試是以自動化方式執行的,提升了測試代碼的執行效率。

B、提高軟體代碼品質——它使用小版本發布至整合,便於實現人員除錯。同時引入重構概念,讓代碼更乾淨和富有彈性。

C、提升系統的可信賴度——它是迴歸測試的一種。支援修複或更正後的“再測試”,可確保代碼的正確性。

2.2、單元測試的針對對象

A、面向過程的軟體開發針對過程。

B、物件導向的軟體開發針對對象。

C、可以做類測試,功能測試,介面測試(最常用於測試類別中的方法)。

2.3、單元測試工具和架構

目前的最流行的單元測試工具是xUnit系列架構,常用的根據語言不同分為JUnit(java),CppUnit(C ),DUnit (Delphi ),NUnit(.net),PhpUnit(Php )等等。該測試架構的第一個和最傑出的應用就是由Erich Gamma (《設計模式》的作者)和Kent Beck(XP(Extreme Programming)的創始人)提供的開放原始碼的JUnit。

3.Junit入門簡介

3.1、JUnit的好處和JUnit單元測試編寫原則

好處:

A、可以使測試代碼與產品代碼分開。

B、針對某一個類的測試代碼通過較少的改動便可以應用於另一個類的測試。

C、易於整合到測試人員的構建過程中,JUnit和Ant的結合可以實施漸進式開發。

D、JUnit是公開原始碼的,可以進行二次開發。

C、可以方便地對JUnit進行擴充。

編寫原則:

A、是簡化測試的編寫,這種簡化包括測試架構的學習和實際測試單元的編寫。

B、是使測試單元保持持久性。

C、是可以利用既有的測試來編寫相關的測試。

3.2、JUnit的特徵

A、使用斷言方法判斷期望值和實際值差異,返回Boolean值。

B、測試驅動裝置使用共同的初始設定變數或者執行個體。

C、測試包結構便於組織和整合運行。

D、支援圖型互動模式和文本互動模式。

3.3、JUnit架構組成

A、對測試目標進行測試的方法與過程集合,可稱為測試案例(TestCase)。

B、測試案例的集合,可容納多個測試案例(TestCase),將其稱作測試包(TestSuite)。

C、測試結果的描述與記錄。(TestResult) 。

D、測試過程中的事件監聽者(TestListener)。

E、每一個測試方法所發生的與預期不一致狀況的描述,稱其測試失敗元素(TestFailure)

F、JUnit Framework中的出錯異常(AssertionFailedError)。

JUnit架構是一個典型的Composite模式:TestSuite可以容納任何派生自Test的對象;當調用TestSuite對象的run()方法是,會遍曆自己容納的對象,逐個調用它們的run()方法。(可參考《程式員》2003-6期)。

3.4、JUnit的安裝和配置

JUnit安裝步驟分解:

在http://download.sourceforge.net/junit/中下載JUnit包並將Junit壓縮包解壓到一個物理目錄中(例如C:\Junit3.8.1)。

記錄Junit.jar檔案所在目錄名(例如C:\Junit3.8.1Junit.jar)。

進入作業系統(以Windows2000作業系統為準),按照次序點擊“開始 設定 控制台”。

在控制台選項中選擇“系統”,點擊“環境變數”,在“系統變數”的“變數”列表框中選擇“CLASS-PATH”關鍵字(不區分大小寫),如果該關鍵字不存在則添加。

雙擊“CLASS-PATH”關鍵字添加字串“C:\Junit3.8.1Junti.jar”(注意,如果已有別的字串請在該字串的字元結尾加上分號“;”),這樣確定修改後Junit就可以在Integration Environment中應用了。

對於IDE環境,對於需要用到的JUnit的項目增加到lib中,其設定不同的IDE有不同的設定 。

3.5、JUnit中常用的介面和類

Test介面——運行測試和收集測試結果

Test介面使用了Composite設計模式,是單獨測試案例(TestCase),彙總測試模式(TestSuite)及測試擴充(TestDecorator)的共同介面。

它的public int countTestCases()方法,它來統計這次測試有多少個TestCase,另外一個方法就是public void run( TestResult ),TestResult是執行個體接受測試結果, run方法執行本次測試。

TestCase抽象類別——定義測試中固定方法

TestCase是Test介面的抽象實現,(不能被執行個體化,只能被繼承)其建構函式TestCase(string name)根據輸入的測試名稱name建立一個測試執行個體。由於每一個TestCase在建立時都要有一個名稱,若某測試失敗了,便可識別出是哪個測試失敗。

TestCase類中包含的setUp()、tearDown()方法。setUp()方法集中初始化測試所需的所有變數和執行個體,並且在依次調用測試類別中的每個測試方法之前再次執行setUp()方法。tearDown()方法則是在每個測試方法之後,釋放測試程式方法中引用的變數和執行個體。

開發人員編寫測試案例時,只需繼承TestCase,來完成run方法即可,然後JUnit獲得測試案例,執行它的run方法,把測試結果記錄在TestResult之中。

Assert靜態類——一系列斷言方法的集合

Assert包含了一組靜態測試方法,用於期望值和實際值比對是否正確,即測試失敗,Assert類就會拋出一個AssertionFailedError異常,JUnit測試架構將這種錯誤歸入Failes並加以記錄,同時標誌為未通過測試。如果該類方法中指定一個String類型的傳參則該參數將被做為AssertionFailedError異常的標識資訊,告訴測試人員改異常的詳細資料。

JUnit 提供了6大類31組斷言方法,包括基礎斷言、數字斷言、字元斷言、布爾斷言、對象斷言。

其中assertEquals(Object expcted,Object actual)內部邏輯判斷使用equals()方法,這表明斷言兩個執行個體的內部雜湊值是否相等時,最好使用該方法對相應類執行個體的值進行比較。而assertSame(Object expected,Object actual)內部邏輯判斷使用了Java運算子“==”,這表明該斷言判斷兩個執行個體是否來自於同一個引用(Reference),最好使用該方法對不同類的執行個體的值進行比對。asserEquals(String message,String expected,String actual)該方法對兩個字串進行邏輯比對,如果不匹配則顯示著兩個字串有差異的地方。ComparisonFailure類提供兩個字串的比對,不匹配則給出詳細的差異字元。

TestSuite測試包類——多個測試的組合

TestSuite類負責組裝多個Test Cases。待測得類中可能包括了對被測類的多個測試,而TestSuit負責收集這些測試,使我們可以在一個測試中,完成全部的對被測類的多個測試。

TestSuite類實現了Test介面,且可以包含其它的TestSuites。它可以處理加入Test時的所有拋出的異常。

TestSuite處理測試案例有6個規約(否則會被拒絕執行測試)

A 測試案例必須是公有類(Public)

B 測試案例必須繼承與TestCase類

C 測試案例的測試方法必須是公有的( Public )

D 測試案例的測試方法必須被聲明為Void

E 測試案例中測試方法的前置名詞必須是test

F 測試案例中測試方法誤任何傳遞參數

n TestResult結果類和其它類與介面

TestResult結果類集合了任意測試累加結果,通過TestResult執行個體傳遞個每個測試的Run()方法。TestResult在執行TestCase是如果失敗會異常拋出

TestListener介面是個事件監聽規約,可供TestRunner類使用。它通知listener的對象相關事件,方法包括測試開始startTest(Test test),測試結束endTest(Test test),錯誤,增加異常addError(Test test,Throwable t)和增加失敗addFailure(Test test,AssertionFailedError t)

TestFailure失敗類是個“失敗”狀況的收集類,解釋每次測試執行過程中出現的異常情況。其toString()方法返回“失敗”狀況的簡要描述

3.6、JUnit一個執行個體

在控制台中簡單的範例如下:

1、寫個待測試的Triangle類,建立一個TestCase的子類ExampleTest:

2、ExampleTest中寫一個或多個測試方法,斷言期望的結果(注意:以test作為待測試的方法的開頭,這樣這些方法可以被自動找到並被測試)

3、ExampleTest中寫一個suite()方法,它會使用反射動態建立一個包含所有的testXxxx方法的測試套件:

Junit本身的操作並沒有什麼特別的地方。這裡提供了6種測試專案,分別針對不同的測試對象或者可以說是目標。

test case:這個是最常用的,也就是對程式碼中類的測試。

test suite:這個更高一級,可以一次行測試多個類。其效果與分別 進行多個testcase是相同的。

jdbc fixture:這個是針對資料庫連結的測試。(很少用,不大懂。)我學的是預設的jdbc的資料庫。

jndi fixture:這個相當於是一個容器測試。如果說主要的內容就是測試那些存放連結的fixture。

在編程的時候,經常把一些常用的連結放在一個類似於容器的東東裡面,這樣,如果調用重複調用連結的話,可以同一調用容器地址,再具體指向裡面的連結。這是否是一種管理呢。

comparision fixture:這個也是比較少用的東東。

custom fixture:這個是自訂設定。只是產生一個架構。

junitx.framework包主要功能

該包以類方法的方式擴充junit.framework.Assert的功能。

也就是這時候,可以不用繼承相應的類,可以直接使用斷言的相關的功能。事實上基於中繼資料的測試架構都基本採用這種方式實現斷言。

junitx.framework.Assert

junitx.framework.ArrayAssert

junitx.framework.ComparableAssert

junitx.framework.FileAssert

junitx.framework.ListAssert

junitx.framework.ObjectAssert

junitx.framework.NamingAssert

junitx.framework.OrderedTestSuite

junitx.framework.StringAssert

junitx.framework.ThrowableAssert

2. 測試類別的私人屬性

2.1 測試類別的私人屬性的實現

使用相關類(junitx.util.PrivateAccessor)的方法類訪問私人屬性和方法。

參考:

ExampleJUnit_Addons_Exampleexample1目錄下

example1.TestAccount類

example1.Account類

2.2 實現訪問類的屬性和方法的原理

利用Java的反射機制來實現的。

l .使用java.lang.Class的相關方法,獲得相關指定對象的Field,然後調用

field.setAccessible(true);繞過存取權限的檢查,然後可以訪問Field的值,當然

也可以設定Field的值。

2.使用java.lang.Class的相關方法,獲得相關指定對象的Method;然後調用

field.setAccessible(true);繞過存取權限的檢查;最後執行該方法.

3. junitx.extensions包主要功能

這個包實際上在使用模板方法模式建立測試案例工具類。

使用了模板方法模式,定義抽象類別,把相關的測試方法給出具體實現,把被測試對象的建立放到基本方法中。

JUnit-addons架構自己的例子有:

junitx.extensions.ComparabilityTestCase

junitx.extensions.EqualsHashCodeTestCase

junitx.extensions.SerializabilityTestCase

這幾個類都定義了幾個抽象方法,這些方法主要是用於建立對象的方法,需要在具體類裡面實現這些方法。在TestSuite裡面,增加測試案例是通過,使用類的無參數構造器來實現的,因此上面的這些類,為了實現測試對象的注入,採用了set注入的方式,而不是構造器注入方式。

團隊部落格:軟體單元測試概述

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.