Java世界

          學(xué)習(xí)筆記

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          天籟村

          新華網(wǎng)

          雅虎

          最新評(píng)論

          使用 EclEmma 進(jìn)行覆蓋測(cè)試

          覆蓋測(cè)試是衡量測(cè)試質(zhì)量的一個(gè)重要指標(biāo)。在對(duì)一個(gè)軟件產(chǎn)品進(jìn)行了單元測(cè)試、組裝測(cè)試、集成測(cè)試以及接受測(cè)試等繁多的測(cè)試之后,我們能不能就此對(duì)軟件的質(zhì)量產(chǎn)生一定的信心呢?這就需要我們對(duì)測(cè)試的質(zhì)量進(jìn)行考察。如果測(cè)試僅覆蓋了代碼的一小部分,那么不管我們寫了多少測(cè)試用例,我們也不能相信軟件質(zhì)量是有保證的。相反,如果測(cè)試覆蓋到了軟件的絕大部分代碼,我們就能對(duì)軟件的質(zhì)量有一個(gè)合理的信心。本文將介紹一個(gè)優(yōu)秀的開源軟件測(cè)試工具 EclEmma,它能夠?qū)τ?Java 語言編寫的程序進(jìn)行覆蓋測(cè)試,從而對(duì)程序運(yùn)行的結(jié)果生成詳盡的覆蓋測(cè)試報(bào)告。

          介紹

          現(xiàn)在 IT 開發(fā)人員比以往任何時(shí)候都更加關(guān)注測(cè)試的重要性,沒有經(jīng)過良好測(cè)試的代碼更容易出問題。在極限編程中,測(cè)試驅(qū)動(dòng)開發(fā)已經(jīng)被證明是一種有效提高軟件質(zhì)量的方法。在測(cè)試驅(qū)動(dòng)的開發(fā)方式中,軟件工程師在編寫功能代碼之前首先編寫測(cè)試代碼,這樣能從最開始保證程序代碼的正確性,并且能夠在程序的每次演進(jìn)時(shí)進(jìn)行自動(dòng)的回歸測(cè)試。測(cè)試對(duì)于軟件產(chǎn)品的成敗起著至關(guān)重要的作用,在極限編程領(lǐng)域,甚至有人提議任何未經(jīng)測(cè)試的代碼都應(yīng)該自動(dòng)從發(fā)布的產(chǎn)品中刪除。作者并不確信這個(gè)觀點(diǎn)是正確的,但是測(cè)試本身的質(zhì)量確實(shí)是一個(gè)需要高度關(guān)注的問題。測(cè)試的覆蓋率是測(cè)試質(zhì)量的一個(gè)重要指標(biāo),我們需要工具來幫助我們進(jìn)行對(duì)軟件測(cè)試覆蓋的考察。

          EclEmma 就是這樣一個(gè)能幫助開發(fā)人員考察測(cè)試覆蓋率的優(yōu)秀的 Eclipse 開源插件。EclEmma 在覆蓋測(cè)試領(lǐng)域是如此的優(yōu)秀,以致于它在過去不久的 2006 年成為了 Eclipse Community Awards Winners 決賽選手。雖然最后 Eclipse Checkstyle Plugin 取得了 Best Open Source Eclipse-based Developer tool 的稱號(hào),但我們也可以由此看到 EclEmma 對(duì)開發(fā)人員的幫助是巨大的(Eclipse Community Award 的具體信息可以參閱 參考資源)。

          提到 EclEmma 首先就要說到著名的 Java 覆蓋測(cè)試工具 Emma。Emma 是一個(gè)在 SourceForge 上進(jìn)行的開源項(xiàng)目(參閱 參考資源)。從某種程度上說,EclEmma 可以看作是 Emma 的一個(gè)圖形界面。在本文的參考文獻(xiàn)中,可以看到專門講述使用 Emma 的技術(shù)文章。

          Emma 的作者開發(fā) Emma 之初,程序員已經(jīng)有了各種各樣優(yōu)秀的開源 Java 開發(fā)工具。舉例來說,我們有優(yōu)秀的集成開發(fā)環(huán)境 Eclipse,有開源的 JDK,有單元測(cè)試工具 JUnit,有 Ant 這樣的項(xiàng)目管理工具,我們還可以用 CVS 或 SubVersion 來進(jìn)行源代碼版本的維護(hù)。當(dāng)時(shí)看來,也許唯一缺少的就是一個(gè)開源的覆蓋測(cè)試工具了。Emma 就是為了填補(bǔ)這項(xiàng)空白而生的。現(xiàn)在的情況已經(jīng)和 Emma 誕生的時(shí)候不一樣的。時(shí)至今日,我們已經(jīng)有了不少的覆蓋測(cè)試工具。例如 Coverlipse 是一個(gè)基于 Eclipse 的覆蓋測(cè)試插件。其他還有 Cobertura,Quilt 和 JCoverage 等。但是 Emma 具有一些非常優(yōu)秀的特性使得它更適合被廣泛的使用。和 Coverlipse 等工具比起來,Emma 是開源的,同時(shí)它對(duì)應(yīng)用程序執(zhí)行速度的影響非常小。

          EclEmma 的出現(xiàn)彌補(bǔ)了 Emma 用戶一個(gè)大的遺憾 ---- 缺乏圖形界面以及對(duì)集成開發(fā)環(huán)境的支持。將 Eclipse 和 Emma 這兩個(gè)在各自領(lǐng)域最為優(yōu)秀的工具結(jié)合起來,這就是 EclEmma 為我們提供的。接下來,我們就要在后續(xù)章節(jié)中和讀者朋友一起看看 EclEmma 為開發(fā)人員提供了什么。


          安裝 EclEmma 插件

          安裝 EclEmma 插件的過程和大部分 Eclipse 插件相同,我們既可以通過 Eclipse 標(biāo)準(zhǔn)的 Update 機(jī)制來遠(yuǎn)程安裝 EclEmma 插件(圖 1),也可以從站點(diǎn)(參閱 參考資源)下載 zip 文件并解壓到 eclipse 所在的目錄中。

          圖 1 添加 EclEmma 更新站點(diǎn)
          圖 1 添加 EclEmma 更新站點(diǎn)

          不管采用何種方式來安裝 EclEmma,安裝完成并重新啟動(dòng) Eclipse 之后,工具欄上應(yīng)該出現(xiàn)一個(gè)新的按鈕:

          圖 2 新增的覆蓋測(cè)試按鈕
          圖 2 新增的覆蓋測(cè)試按鈕

          使用 EclEmma 測(cè)試 Java 程序

          為了實(shí)驗(yàn) EclEmma 的特性,我們首先在 Eclipse 的 Workspace 中建立一個(gè)名稱為 test.emma 的新 Java 項(xiàng)目。接下來,我們?cè)谄渲薪⒁粋€(gè) HelloWorld 類,其代碼如下所示:

          清單 1 用于測(cè)試 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 運(yùn)行 HelloWorld.main() 函數(shù)。

          圖 3 對(duì) Java 應(yīng)用程序進(jìn)行覆蓋測(cè)試
          圖 3 對(duì) Java 應(yīng)用程序進(jìn)行覆蓋測(cè)試

          執(zhí)行完畢之后,我們正在編輯 HelloWorld.java 的窗口將會(huì)變成如下所示:

          圖 4 進(jìn)行覆蓋測(cè)試的結(jié)果
          圖 4 進(jìn)行覆蓋測(cè)試的結(jié)果

          在 Java 編輯器中,EclEmma 用不同的色彩標(biāo)示了源代碼的測(cè)試情況。其中,綠色的行表示該行代碼被完整的執(zhí)行,紅色部分表示該行代碼根本沒有被執(zhí)行,而黃色的行表明該行代碼部分被執(zhí)行。黃色的行通常出現(xiàn)在單行代碼包含分支的情況,例如 圖 4 中的 16 行就顯示為黃色。由于程序中有一個(gè)隨機(jī)確定的分支,因此讀者的窗口可能與這里稍有不同(11 行或者 14 行中有且只有一個(gè)紅色的行)。

          除了在源代碼編輯窗口直接進(jìn)行著色之外,EclEmma 還提供了一個(gè)單獨(dú)的視圖來統(tǒng)計(jì)程序的覆蓋測(cè)試率。

          圖 5 察看程序的覆蓋測(cè)試率
          圖 5 察看程序的覆蓋測(cè)試率

          EclEmma 提供的 Coverage 視圖能夠分層的顯示代碼的覆蓋測(cè)試率,圖 5 中的信息表明我們對(duì) HelloWorld 的一次運(yùn)行覆蓋了大約 68.6% 的代碼。

          想在一次運(yùn)行中覆蓋所有的代碼通常比較困難,如果能把多次測(cè)試的覆蓋數(shù)據(jù)綜合起來進(jìn)行察看,那么我們就能更方便的掌握多次測(cè)試的測(cè)試效果。EclEmma 提供了這樣的功能。現(xiàn)在,讓我們重復(fù)數(shù)次對(duì) HelloWorld 的覆蓋測(cè)試。我們注意到 Coverage 視圖總是顯示最新完成的一次覆蓋測(cè)試。事實(shí)上,EclEmma 為我們保存了所有的測(cè)試結(jié)果。接下來,我們將通過 Coverage 視圖的工具按鈕來結(jié)合多次覆蓋測(cè)試的結(jié)果。

          圖 6 用于結(jié)合多次覆蓋測(cè)試結(jié)果的工具欄按鈕
          圖 6 用于結(jié)合多次覆蓋測(cè)試結(jié)果的工具欄按鈕

          當(dāng)我們多次運(yùn)行 Coverage 之后,我們可以單擊 圖 6 所示工具欄按鈕。之后,一個(gè)對(duì)話框?qū)⒈粡棾鲆怨┯脩暨x擇需要合并的覆蓋測(cè)試。

          圖 7 選擇需要合并的覆蓋測(cè)試結(jié)果
          圖 7 選擇需要合并的覆蓋測(cè)試結(jié)果

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

          圖 8 察看合并后的覆蓋測(cè)試結(jié)果
          圖 8 察看合并后的覆蓋測(cè)試結(jié)果

          圖 8 中,我們可以看到,通過多次運(yùn)行覆蓋測(cè)試,最終我們的代碼達(dá)到了 91.4% 的測(cè)試覆蓋率。有趣的是,圖中第三行代碼被標(biāo)記為紅色,而此行代碼實(shí)際上是不可執(zhí)行的。奧妙在于,我們沒有生成任何 HelloWorld 類的實(shí)例,因此缺省構(gòu)造函數(shù)沒有被調(diào)用,而 EclEmma 將這個(gè)特殊代碼的覆蓋狀態(tài)標(biāo)記在類聲明的第一行。


          EclEmma 的高級(jí)特性

          如果 EclEmma 只能測(cè)試 Java Application 的測(cè)試覆蓋率,那么它相對(duì)命令行版本的 Emma 來說,提供的增強(qiáng)就不多了。相反,EclEmma 提供了很多與 Eclipse 緊密結(jié)合的功能。它不僅能測(cè)試 Java Application,還能計(jì)算 JUnit 單元測(cè)試,對(duì) Eclipse 插件測(cè)試的覆蓋率。從 圖 9 中我們可以看到 EclEmma 目前支持四種類型的程序。

          圖 9 EclEmma 的配置頁面
          圖 9 EclEmma 的配置頁面

          為了了解 EclEmma 是如何獲得覆蓋測(cè)試數(shù)據(jù)的,我們需要先對(duì) Emma 有初步的了解。通常代碼覆蓋測(cè)試工具都需要對(duì)被執(zhí)行的代碼進(jìn)行修改。而 Emma 提供了兩種方式來完成這件事。

          1. 預(yù)插入模式:對(duì)程序進(jìn)行測(cè)量之前,需要采用 Emma 提供的工具對(duì) class 文件或者 jar 文件進(jìn)行修改。修改完成之后的代碼可以立刻被執(zhí)行。覆蓋測(cè)試的結(jié)果將會(huì)被存放到指定的文件中。
          2. 即時(shí)插入模式:即時(shí)插入模式不需要事先對(duì)代碼進(jìn)行修改。相反,對(duì)代碼的修改是通過一個(gè) Emma 定制的 Class loader(類載入器)進(jìn)行的。這種方式的優(yōu)點(diǎn)很明顯,我們不需要對(duì) class 或者 jar 文件進(jìn)行任何修改。缺點(diǎn)是我們?yōu)榱双@得測(cè)試的結(jié)果,需要用 Emma 提供的命令 emmarun 來執(zhí)行 Java 應(yīng)用程序。

          使用即時(shí)插入模式的優(yōu)點(diǎn)很明顯:class 文件和 jar 文件不會(huì)被修改。而預(yù)插入模式的應(yīng)用范圍更為廣泛,對(duì)于某些需要嵌入到框架中運(yùn)行的代碼來說(例如 EJB),我們只能使用預(yù)插入模式。EclEmma 僅僅使用了 Emma 的預(yù)插入模式來工作,不過 EclEmma 缺省會(huì)在臨時(shí)目錄中創(chuàng)建 class 文件和 jar 文件的副本來進(jìn)行修改,因此在 workspace 中 class 和 jar 文件仍然保持原樣。雖然聽上去很好,但是由于需要修改 classpath 來使用修改過的 class 和 jar 文件,對(duì)于不能修改 classpath 的應(yīng)用(例如 Eclipse RCP 和 JUnit Plugin Test)來說,我們還是只能選擇修改 workspace 中的 class 文件和 jar 文件。對(duì)于 Java Application 和 JUnit 類型的覆蓋測(cè)試,我們可以在配置對(duì)話框中選中“In-place instrumentation”項(xiàng)來指定直接修改 Workspace 中的 .class 文件和 .jar 文件。

          posted on 2013-11-01 09:43 Rabbit 閱讀(1191) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 汤原县| 彩票| 历史| 虎林市| 浑源县| 伊宁市| 西安市| 彰化市| 广昌县| 禹州市| 囊谦县| 巴林左旗| 丹江口市| 巨鹿县| 义乌市| 龙泉市| 滨海县| 浙江省| 和顺县| 乳源| 阿拉尔市| 略阳县| 甘洛县| 乐昌市| 青浦区| 白沙| 大理市| 中山市| 当涂县| 习水县| 延吉市| 全南县| 阜平县| 禄丰县| 乌审旗| 阳新县| 高台县| 吉水县| 嘉义市| 安康市| 台中市|