<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java世界

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

    常用鏈接

    統(tǒng)計(jì)

    積分與排名

    天籟村

    新華網(wǎng)

    雅虎

    最新評論

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

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

    介紹

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

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

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

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

    EclEmma 的出現(xiàn)彌補(bǔ)了 Emma 用戶一個大的遺憾 ---- 缺乏圖形界面以及對集成開發(fā)環(huán)境的支持。將 Eclipse 和 Emma 這兩個在各自領(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,安裝完成并重新啟動 Eclipse 之后,工具欄上應(yīng)該出現(xiàn)一個新的按鈕:

    圖 2 新增的覆蓋測試按鈕
    圖 2 新增的覆蓋測試按鈕

    使用 EclEmma 測試 Java 程序

    為了實(shí)驗(yàn) EclEmma 的特性,我們首先在 Eclipse 的 Workspace 中建立一個名稱為 test.emma 的新 Java 項(xiàng)目。接下來,我們在其中建立一個 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 運(yùn)行 HelloWorld.main() 函數(shù)。

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

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

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

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

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

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

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

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

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

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

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

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

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

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


    EclEmma 的高級特性

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

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

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

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

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

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


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: yellow视频免费在线观看| 国产精品亚洲片夜色在线| 欧洲亚洲国产清在高| 久久精品国产亚洲香蕉| 亚洲精品久久久久无码AV片软件| 香蕉视频免费在线播放| 四虎成年永久免费网站| 久久精品国产亚洲一区二区三区| 亚洲国产精品久久丫| 亚洲午夜无码毛片av久久京东热| 国产在线观看无码免费视频| 最近免费中文字幕大全视频| 亚洲精品夜夜夜妓女网| 国产亚洲综合久久| 久草视频免费在线| 亚洲国产精品VA在线看黑人 | 亚洲中文字幕不卡无码| 亚洲午夜国产精品无卡| 亚洲黄色免费网址| 亚洲av综合avav中文| 一级毛片aaaaaa免费看| 久久国产成人亚洲精品影院| 男女一进一出抽搐免费视频 | 女人18毛片水真多免费播放| 亚洲性日韩精品一区二区三区| 亚洲ts人妖网站| 老汉精品免费AV在线播放| 狠狠亚洲狠狠欧洲2019| 国产成人免费视频| 久久亚洲精品中文字幕三区| 最近免费视频中文字幕大全| 久久久久亚洲Av片无码v | 亚洲gay片在线gv网站| 又大又硬又爽免费视频| 亚洲精品无码久久久久A片苍井空| 亚洲三级在线免费观看| 精品亚洲国产成人av| 国产午夜鲁丝片AV无码免费| 亚洲精华液一二三产区| 亚洲乱码无码永久不卡在线 | 四虎国产精品永免费|