l

2013年4月1日 星期一

EclEmma:免費Eclipse Java測試涵蓋率工具

Mar. 31 00:12~13:19

螢幕快照 2013-03-31 上午1.10.37

 

Teddy在3月22~23日的「單元測試與持續整合實作班」(請參考《單元測試與持續整合實作班課程實錄》)介紹了測試涵蓋率的用途,並且使用EclEmma這個Eclipse外掛程式協助開發人員觀察Java程式的statement coverage(line coverage)與branch coverage。今天介紹一下這個免費又方便好用的工具。

EclEmma的官方網頁在此,目前最新的版本是2.2.0。EclEmma是一個Eclipse外掛程式,底層原本是呼叫Emma這個工具來計算Java程式的測試涵蓋率。但自從2.0版之後,EclEmma已經改用JaCoCo這個工具,而不再使用Emma。EclEmma雖然已經和Emma這個工具沒有關係了,不過EclEmma的名字卻沒有因此改為EclJaCoCo,如果沒留意會造成一點小困擾(Emma和JaCoCo所支援的測試涵蓋率種類有點不同)。

***

安裝EclEmma

連到EclEmma的官方網站上面會有如何在Eclipse上安裝EclEmma的介紹,方法很簡單,在Eclipse的選單中選Help->Install New Software…,輸入EclEmma的update site位址http://update.eclemma.org/,細節就不多做說明了。

螢幕快照 2013-03-31 上午12.25.44

 

安裝完成之後可能需要重新啟動Eclipse,之後會在Eclipse上方的工具列上出現一個新的按鈕。

螢幕快照 2013-03-31 上午12.31.22

 

待測程式(Production Code)

在寫測試程式之前先看一下待測程式長成什麼鳥樣子。等一下要用單元程式分別達到100%的statement coverage與branch coverage,所以待測程式也非常簡單,裡面只有一個if敘述外加兩個System.out.println(),分別印出兩個不同的執行路徑。

螢幕快照 2013-03-31 上午12.37.08

 

100% Statement Coverage

要達到100%的statement coverage只要讓測試程式可以執行到待測程式ifMethod()的每一行程式就可以了。如何做到?很簡單,傳入true這個參數就OK了。以下是測試程式。

螢幕快照 2013-03-31 上午12.47.29

 

在測試案例上按下滑鼠右鍵,選Coverage As->JUnit Test。

螢幕快照 2013-03-31 上午12.48.21

 

EclEmma提供了一個Coverage view,可以看到statement coverage已達到100%。

螢幕快照 2013-03-31 上午12.51.21

 

切換到production code,綠色的表示該行程式100%被執行,紅色表示完全被執行,黃色表示有部分沒有被執行。剛剛的測試案例,由於傳入參數的數值是true,if (aBool)只涵蓋了true這個路徑,false沒有被涵蓋到,因此這一行程式碼被用黃色標示。

螢幕快照 2013-03-31 上午12.52.13

 

if(aBool)這一行右邊有一個小菱形符號,將滑鼠移到上面顯示1 of 2 branches missed

螢幕快照 2013-03-31 上午12.55.37

 

100% Branch Coverage

要達到100%的branch coverage也很簡單,修改一下測試程式。

螢幕快照 2013-03-31 上午12.59.05

 

執行Coverage As,再觀察一下Coverage view。這裡有一個小地方要注意一下,由於Coverage view一次只能顯示一種coverage,要觀察branch coverage,必須將Coverage view切換成顯示Branch Counters。

螢幕快照 2013-03-31 上午1.04.25

 

切換完畢之後顯示待測程式有2個branch,而且branch coverage是100%。

螢幕快照 2013-03-31 上午1.06.55

 

切回production code,原本的黃色這一行也變成綠色了。

螢幕快照 2013-03-31 上午1.08.09

***

觀察測試涵蓋率的原因是希望知道自己專寫的測試案例是否足夠,而且有真正測試到待測程式的各種不同執行路徑。但是看到這邊鄉民們可能會想:我連寫測試程式的時間都不夠了,哪有可能還去關注測試涵蓋率啊。對於加班加到家人都快不認識你的工程師而言,話是這樣說沒錯。但萬一有哪一天真到需要寫單元測試,對於那些邏輯比較複雜、比較容易出錯、或是重要性比較高的程式,有工具可以幫助了解測試程式的有效性,以及提醒自己還有哪些情況沒有測試到,也是挺不錯的。

***

友藏內心獨白:耶,測試程式裡面為什麼沒有任何assertion呢?

沒有留言:

張貼留言