EclEmma配置以及使用說明
使用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");
}
else
System.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 提供了兩種方式來完成這件事。
預插入模式:對程式進行測量之前,需要採用 Emma 提供的工具對 class 檔案或者 jar 檔案進行修改。修改完成之後的代碼可以立刻被執行。覆蓋測試的結果將會被存放到指定的檔案中。
即時插入模式:即時插入模式不需要事先對代碼進行修改。相反,對代碼的修改是通過一個 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 檔案。