android基礎知識12:android自動化測試07—EclEmma 進行覆蓋測試

來源:互聯網
上載者:User

       覆蓋測試是衡量測試品質的一個重要指標。在對一個軟體產品進行了單元測試、組裝測試、整合測試以及接受測試等繁多的測試之後,我們能不能就此對軟體的品質產生一定的信心呢?這就需要我們對測試的品質進行考察。如果測試僅覆蓋了代碼的一小部分,那麼不管我們寫了多少測試案例,我們也不能相信軟體品質是有保證的。相反,如果測試覆蓋到了軟體的絕大部分代碼,我們就能對軟體的品質有一個合理的信心。本文將介紹一個優秀的開源軟體測試載入器
EclEmma,它能夠對由 Java 語言編寫的程式進行覆蓋測試,從而對程式啟動並執行結果產生詳盡的覆蓋測試報告。

介紹

       現在 IT 開發人員比以往任何時候都更加關注測試的重要性,沒有經過良好測試的代碼更容易出問題。在極限編程中,測試驅動開發已經被證明是一種有效提高軟體品質的方法。在測試驅動的開發方式中,軟體工程師在編寫功能代碼之前首先編寫測試代碼,這樣能從最開始保證程式碼的正確性,並且能夠在程式的每次演化時進行自動的迴歸測試。測試對於軟體產品的成敗起著至關重要的作用,在極限編程領域,甚至有人提議任何未經測試的代碼都應該自動從發布的產品中刪除。作者並不確信這個觀點是正確的,但是測試本身的品質確實是一個需要高度關注的問題。測試的覆蓋率是測試品質的一個重要指標,我們需要工具來協助我們進行對軟體測試覆蓋的考察。

       EclEmma 就是這樣一個能協助開發人員考察測試覆蓋率的優秀的 Eclipse 開源外掛程式。EclEmma 在覆蓋測試領域是如此的優秀,以致於它在過去不久的 2006 年成為了 Eclipse Community Awards Winners 決賽選手。雖然最後 Eclipse Checkstyle Plugin 取得了 Best Open Source Eclipse-based Developer tool 的稱號,但我們也可以由此看到 EclEmma 對開發人員的協助是巨大的(Eclipse
Community Award 的具體資訊可以參閱 參考資源)。

提到 EclEmma 首先就要說到著名的 Java 覆蓋測試載入器 Emma。Emma 是一個在 SourceForge 上進行的開源項目(參閱 參考資源)。從某種程度上說,EclEmma 可以看作是 Emma 的一個圖形介面。在本文的參考文獻中,可以看到專門講述使用
Emma 的技術文章。

       Emma 的作者開發 Emma 之初,程式員已經有了各種各樣優秀的開源 Java 開發工具。舉例來說,我們有優秀的整合式開發環境 Eclipse,有開源的 JDK,有單元測試工具 JUnit,有 Ant 這樣的專案管理工具,我們還可以用 CVS 或 SubVersion 來進行原始碼版本的維護。當時看來,也許唯一缺少的就是一個開源的覆蓋測試載入器了。Emma 就是為了填補這項空白而生的。現在的情況已經和 Emma 誕生的時候不一樣的。時至今日,我們已經有了不少的覆蓋測試載入器。例如 Coverlipse
是一個基於 Eclipse 的覆蓋測試外掛程式。其他還有 Cobertura,Quilt 和 JCoverage 等。但是 Emma 具有一些非常優秀的特性使得它更適合被廣泛的使用。和 Coverlipse 等工具比起來,Emma 是開源的,同時它對應用程式執行速度的影響非常小。

EclEmma 的出現彌補了 Emma 使用者一個大的遺憾 ---- 缺乏圖形介面以及對整合式開發環境的支援。將 Eclipse 和 Emma 這兩個在各自領域最為優秀的工具結合起來,這就是 EclEmma 為我們提供的。接下來,我們就要在後續章節中和讀者朋友一起看看 EclEmma 為開發人員提供了什麼。

 安裝 EclEmma 外掛程式

        安裝 EclEmma 外掛程式的過程和大部分 Eclipse 外掛程式相同,我們既可以通過 Eclipse 標準的 Update 機制來遠程安裝 EclEmma 外掛程式(圖
1),也可以從網站(參閱 參考資源)下載
zip 檔案並解壓到 eclipse 所在的目錄中。

圖 1 添加 EclEmma 更新網站


name:eclemma 
URL:http://update.eclemma.org/

不管採用何種方式來安裝 EclEmma,安裝完成並重新啟動 Eclipse 之後,工具列上應該出現一個新的按鈕:
圖 2 新增的覆蓋測試按鈕


使用 EclEmma 測試 Java 程式
為了實驗 EclEmma 的特性,我們首先在 Eclipse 的 Workspace 中建立一個名稱為 test.emma 的新 Java 項目。接下來,我們在其中建立一個 HelloWorld 類,其代碼如下所示:
清單 1 用於測試 EclEmma 的代碼

                package test.emma;public class HelloWorld {/** * @param args */public static void main(String[] args) {int rand = (int) (Math.random()*100);if(rand%2==0){System.out.println( "Hello, world! 0");}elseSystem.out.println("Hello, world! 1");int result = rand%2==0? rand+rand:rand*rand; System.out.println(result);}} 

接下來,我們通過 EclEmma 運行 HelloWorld.main() 函數。
圖 3 對 Java 應用程式進行覆蓋測試

執行完畢之後,我們正在編輯 HelloWorld.java 的視窗將會變成如下所示:

圖 4 進行覆蓋測試的結果


在 Java 編輯器中,EclEmma 用不同的色彩標示了原始碼的測試情況。其中,綠色的行表示該行代碼被完整的執行,紅色部分表示該行代碼根本沒有被執行,而黃色的行表明該行代碼部分被執行。黃色的行通常出現在單行程式碼封裝含分支的情況,例如 圖 4 中的
16 行就顯示為黃色。由於程式中有一個隨機確定的分支,因此讀者的視窗可能與這裡稍有不同(11 行或者 14 行中有且只有一個紅色的行)。

除了在原始碼編輯視窗直接進行著色之外,EclEmma 還提供了一個單獨的視圖來統計程式的覆蓋測試率。

圖 5 察看程式的覆蓋測試率


EclEmma 提供的 Coverage 視圖能夠分層的顯示代碼的覆蓋測試率,圖 5 中的資訊表明我們對 HelloWorld 的一次運行覆蓋了大約 68.6% 的代碼。

想在一次運行中覆蓋所有的代碼通常比較困難,如果能把多次測試的覆蓋資料綜合起來進行察看,那麼我們就能更方便的掌握多次測試的測試效果。EclEmma 提供了這樣的功能。現在,讓我們重複數次對 HelloWorld 的覆蓋測試。我們注意到 Coverage 視圖總是顯示最新完成的一次覆蓋測試。事實上,EclEmma 為我們儲存了所有的測試結果。接下來,我們將通過 Coverage 視圖的工具按鈕來結合多次覆蓋測試的結果。

圖 6 用於結合多次覆蓋測試結果的工具列按鈕

當我們多次運行 Coverage 之後,我們可以單擊 圖
6 所示工具列按鈕。之後,一個對話方塊將被彈出以供使用者選擇需要合并的覆蓋測試。

圖 7 選擇需要合并的覆蓋測試結果


在合并完成之後,我們可以觀察到 Java 編輯器和 Coverage 視圖中都顯示了合并之後的結果:

圖 8 察看合并後的覆蓋測試結果



8 中,我們可以看到,通過多次運行覆蓋測試,最終我們的代碼達到了 91.4% 的測試覆蓋率。有趣的是,圖中第三行代碼被標記為紅色,而此行代碼實際上是不可執行檔。奧妙在於,我們沒有產生任何 HelloWorld 類的執行個體,因此預設建構函式沒有被調用,而 EclEmma 將這個特殊代碼的覆蓋狀態標記在類聲明的第一行。


EclEmma 的進階特性
       如果 EclEmma 只能測試 Java Application 的測試覆蓋率,那麼它相對命令列版本的 Emma 來說,提供的增強就不多了。相反,EclEmma 提供了很多與 Eclipse 緊密結合的功能。它不僅能測試 Java Application,還能計算 JUnit 單元測試,對 Eclipse 外掛程式測試的覆蓋率。從 圖 9 中我們可以看到 EclEmma 目前支援四種類型的程式。
圖 9 EclEmma 的配置頁面


為了瞭解 EclEmma 是如何獲得覆蓋測試資料的,我們需要先對 Emma 有初步的瞭解。通常代碼覆蓋測試載入器都需要對被執行的代碼進行修改。而 Emma 提供了兩種方式來完成這件事。

  1. 預插入模式:對程式進行測量之前,需要採用 Emma 提供的工具對 class 檔案或者 jar 檔案進行修改。修改完成之後的代碼可以立刻被執行。覆蓋測試的結果將會被存放到指定的檔案中。
  2. 即時插入模式:即時插入模式不需要事先對代碼進行修改。相反,對代碼的修改是通過一個 Emma 定製的 Class loader(類載入器)進行的。這種方式的優點很明顯,我們不需要對 class 或者 jar 檔案進行任何修改。缺點是我們為了獲得測試的結果,需要用 Emma 提供的命令 emmarun 來執行 Java 應用程式。

使用即時插入模式的優點很明顯:class 檔案和 jar 檔案不會被修改。而預插入模式的應用範圍更為廣泛,對於某些需要嵌入到架構中啟動並執行代碼來說(例如 EJB),我們只能使用預插入模式。EclEmma 僅僅使用了 Emma 的預插入模式來工作,不過 EclEmma 預設會在臨時目錄中建立 class 檔案和 jar 檔案的副本來進行修改,因此在 workspace 中 class 和 jar 檔案仍然保持原樣。雖然聽上去很好,但是由於需要修改 classpath 來使用修改過的 class 和 jar 檔案,對於不能修改
classpath 的應用(例如 Eclipse RCP 和 JUnit Plugin Test)來說,我們還是只能選擇修改 workspace 中的 class 檔案和 jar 檔案。對於 Java Application 和 JUnit 類型的覆蓋測試,我們可以在配置對話方塊中選中“In-place instrumentation”項來指定直接修改 Workspace 中的 .class 檔案和 .jar 檔案。

參考資料:

《使用 EclEmma 進行覆蓋測試》

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.