即便開發人員知道測試的益處,我們也會發現程序員們不愿意測試他們的代碼。他們會列出各種理由,如時間不夠、沒有有效的工具以及在編寫帶有許多有依賴關系的對象的測試方面有問題。
本期的文章中,我想將重點放在單元測試上,并看看如何解決這些問題。特別地,我想提供一些技巧來說明編寫帶有模擬對象的單元測試是多么容易。
對于單元測試的常見異議
在深入探討模擬對象之前,讓我們先來看一下以下兩點異議。
花費時間太長
我們很早就認識到這樣一個原則“做事情需要花費時間”,特別當這些事情值得去做。很少的開發人員會懷疑整體測試的價值,因此我們需要考慮如何定義“太長”這個詞的含義。
開發人員們缺乏耐心,他們想要的是結果。他們喜歡寫代碼、運行代碼然后看結果。從這一點來說,單元測試對他們有幫助。單元測試滿足開發人員們的及時需求,但是許多程序開發
仍有許多程序設計人員認為找出他們代碼中的錯誤是其他一些人的工作。我發現近十年來這種情況已經有了顯著的改進,但是仍有大量的程序人員并沒有為他們的工作負全責,他們也不使用有助于改進他們代碼的工具和技術。在早期的軟件工程課程中我向我的學生們介紹過單元測試。我告訴他們如何使用現代工具編寫測試。我布置了關于編寫單元測試的作業。然而,當給他們機會在工作中采用有效的單元測試時,只有25%的學生這樣做。原因是什么呢?因為他們還沒有意識到測試的重要性。他們的直覺戰勝了理性。他們知道單元測試的價值,但他們選擇不予理會。
單元測試并不需要花費很長時間,但許多程序設計員認為它需要。作為一名教育
低效的工具
這充其量是一個乏味的借口。在今天有很多有效的單元測試工具可供開發人員們使用。不管您使用的是什么程序語言或者其他的開發工具,單元測試工具都可以供您使用。許多工具都是開源或者免費的。
我選擇 Eclipse 作為我的主要開發環境。在我現有的 Eclipse 配置里可以得到的所有單元測試工具中,我主要使用的是 Junit 測試框架。大多數 Java 設計人員都知道 Junit 并且大概至少使用過一次。JUnit 是 Eclipse 的 Java 開發工具中的一個完整部分。這個平臺使得創建 Junit 測試變得簡單。我只需在瀏覽器包里選擇一個 Java 源文件,并在右擊已選文件時從關系菜單里選擇 New>JUnit Test Case(見圖1)即可。提供的支持包括在測試中為類自動創建測試方式以及更多的東西。運行測試和創建一樣簡單。Eclipse 帶有一個獨立的視圖可以觀察 Junit 測試的結果。
Eclipse 中集成了大量的單元測試工具。其中許多是基于 Junit 并在性能上有所擴充。我讓我的學生們在面向對象的設計類中使用 Coverlipse 插件程序來檢測他們的測試的代碼覆蓋率。我希望在他們所有的應用程序代碼中有100%的覆蓋率。一開始他們不喜歡這樣,但是到了期中,他們的測試的覆蓋率通常都達到100%。
我已經為 TestNG,、djUnit、 Eclipse Test 和 Performance Tools Platform (TPTP) 安裝了插件程序。其中每一個都有一組特性支持有效的單元測試。關鍵是有大量合適的單元測試工具提供給每一個開發人員,因此缺少工具不再被認為是沒有創建單元測試的理由。
測試帶有復雜的依賴性?使用模擬對象
一個好的單元測試檢測一個獨立的方法。在一個設計良好的系統里,對象們協同工作共同完成一項任務;因此,為了檢驗一種方法,通常我們需要提供使得這種方法完成其任務的其他對象。企業應用程序里的對象相當復雜,很難創建,并且他們的狀態依賴外部的對象。一個數據庫相關的應用程序有許多這樣的對象,如連接、語句、結果集等等。我們想要單元測試簡單快速的執行。如果我們需要在每次單元測試前將數據庫重新設置到一個已知狀態,那么測試會相當復雜并且運行速度自然會比我們期望得要慢。
簡化單元測試的一個流行技巧就是創建僅用于測試中的模擬對象。為了達到快速測試的目的,我們創建模擬對象來代替真實的對象。模擬對象被 Tim Mackinnon、 Steve Freeman 和 Philip Craig 1 所支持并成為單元測試工具箱的主要組成部分。一些書籍和論文講述了如何在單元測試中使用模擬對象,描述的是模擬對象應該具備的能力以及如何使用他們。盡管如此,在沒有任何基礎的情況下開始創建模擬對象是相當困難的。我們希望能夠自動完成這項任務。
有一些軟件工具,像 EasyMock, 2 提供了自動幫助功能,但是它們可能很復雜而且也很難使用。此外,他們不是總能夠與我們其他的開發工具兼容。但是利用現有的工具可以有一些創建模擬對象或是相當能力的簡單方法。文章后面的部分將展示利用 Eclipse 平臺做到這一點的一些方法。
從接口創建模擬對象
文章來源于領測軟件測試網 http://www.kjueaiud.com/