1. 程式人生 > >使用 EclEmma 進行覆蓋測試——java

使用 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 更新站點

使用 EclEmma 進行覆蓋測試

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

  圖 2 新增的覆蓋測試按鈕

使用 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 應用程式進行覆蓋測試

使用 EclEmma 進行覆蓋測試

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

  圖 4 進行覆蓋測試的結果

使用 EclEmma 進行覆蓋測試

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

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

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

使用 EclEmma 進行覆蓋測試

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

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

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

使用 EclEmma 進行覆蓋測試

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

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

使用 EclEmma 進行覆蓋測試

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

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

使用 EclEmma 進行覆蓋測試

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

  EclEmma 的高階特性

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

  圖 9 EclEmma 的配置頁面

使用 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 檔案。

  結論

  本文通過一個簡單的例子介紹了使用 EclEmma 進行覆蓋測試的基本過程。EclEmma 允許軟體工程師方便的考察測試的覆蓋率,並能將測試結果以直觀、簡潔的方式展現給開發人員。

相關推薦

使用 EclEmma 進行覆蓋測試——java

 介紹   現在 IT 開發人員比以往任何時候都更加關注測試的重要性,沒有經過良好測試的程式碼更容易出問題。在極限程式設計中,測試驅動開發已經被證明是一種有效提高軟體質量的方 法。在測試驅動的開發方式中,軟體工程師在編寫功能程式碼之前首先編寫測試程式碼,這樣能從最開始保證程

使用JMeter進行效能測試(Java請求)

看了兩篇如何使用JMeter在HTTP請求及資料庫方面做效能測試的文章(如下兩個連結),感受到這款工具的強大及易用。我在這裡延續下,對JMeter裡另外一種常用的測試型別:"Java請求",做個入門級的介紹。 "Java請求"是指JMeter對Java C

JMeter學習(十七)JMeter測試Java 目的:對Java程式進行測試

目的:對Java程式進行測試   目錄 一、核心步驟 二、例項 三、JMeter Java Sampler介紹 四、自帶Java Request Sampler   一、核心步驟 1.建立一個Java工程; 2.將JMeter的lib目錄下

對一些常見的排序演算法進行演算測試,對比效率。(JAVA 實現)

大三下了,正在找實習,把一些常用的排序演算法重新複習一遍,同時簡單的比較了一下各個演算法的效率,總的來說,快排效率最高,冒泡效率最低。-----具體的排序演算法包括:直接插入排序、折半插入排序、Shell排序(插入排序) 冒泡、快速排序(交換排序) 歡迎大家一起討論,如有錯誤務必指出

Java執行緒與執行緒安全,開啟多執行緒及每執行緒迴圈10次對類進行輸出測試

最近看到執行緒問題,emmm~腦闊回想到計算機作業系統貌似又講,不過上課睡覺覺去啦哈哈哈,java課老師莫得講~ 然歸正傳,今對執行緒進行查閱及測試,做一下筆記,有錯之處還請指出,謝謝~上程式碼之前呢先說一哈前傳 執行緒是程序中的最小執行單位:    手機呢會有很多單獨

JAVA】使用Mockito進行單元測試

1. @Mock與@InjectMocks的作用 @Mock:建立一個Mock @InjectMocks:建立一個例項(被測試類的例項,一般只用一次該註解) 在單元測試某個類的時候,需要標註@InjectMocks,該類的變數需要添加註解@Mock,當需要用到被測試類中

java ssh 框架下 利用junit4 spring-test進行單元測試

ssh框架下  由於bean實列 都交給spring 管理,要做單元測試就比較苦難,junit4 引入註解方便很多; 1. 加入依賴包   使用Spring的測試框架需要加入以下依賴包: Spring Test (Spring框架中的test包)Spring 相關其

JMETER通過java程式碼通過程式碼/ JMETER API實現示例進行負載測試

本教程試圖解釋Jmeter的基本設計,功能和用法,Jmeter是用於在應用程式上執行負載測試的優秀工具。通過使用jmeter GUI,我們可以根據我們的要求為請求建立測試樣本並執行具有多個使用者負載的樣本。由於jmeter工具是使用JAVA完全開發的,我們可以編寫java程式碼來做同樣的事情而不使用jmete

【翻譯】Java使用Mockito進行Mock測試

原文地址:http://java.dzone.com/articles/getting-started-mocking-java文章通過一個簡單例項,介紹了使用Mockito建立mock物件來進行單元測試構建。例子淺顯易懂,相信希望瞭解mock的同學會有所收穫。文章的最後附

java客戶端進行kafka測試時,生產者不能生產資訊,消費者不能消費資訊,而且沒有報錯,但是在虛擬機器中沒有任何錯誤

我的kafka在虛擬機器中都正常啟動,而且在虛擬機器中生產和消費資訊都沒有錯誤,但是使用window客戶端生產和消費時不成功,而且也不報任何錯誤,生產和消費訊息時都停留一段時間然後結束。以下是我提供的一種思路,但不一定適合所有這樣的錯誤:1.先看一下虛擬機器系統中kafka安

TPTP(Java Profiling Tools外掛)對Java程式進行效能測試

來源:http://blog.csdn.net/wsj19890201/article/details/5492517 概述:Eclipse Test & Performance Tools Platform (TPTP) 的效能測試工具 (Profiling t

使用@RunWith(SpringJUnit4ClassRunner.class)進行單元測試時 報錯 和 java.lang.NoSuchMethodError的解決方法

1 使用@RunWith(SpringJUnit4ClassRunner.class)進行單元測試時,需要junit高版本和spring-test的高版本才支援,junit需要4.0以上的,spring-test也需要高版本,最開始我用的4.3.13的,翻開jar包發現並沒有

NUnit.Framework在VS2015中如何進行單元測試

開放 ron 微軟 strong 擴展 分享 方案 mar 項目 微軟在VS2015中加入了自動化生成測試功能, 在需要測試的源文件的公共方法中右鍵既可以創建單元測試。 不過需要註意的是,要在公共方法中創建,否則會提示這個錯誤 如下是自動化單元測試界面,可以發

APP接口自動化測試JAVA+TestNG(三)之HTTP接口測試實例

ons ace src 沒有 app 9.png 轉載 image try 前言 前兩篇普及相關基礎知識後,本篇主要對舉例對國家氣象局接口自動化測試進行講解(Get請求及結果斷言),以達到自動化測試入門目的,除了前兩篇的一些了解外,需要有一定的JAVA知識(HTTP

【轉】JMeter學習(十八)JMeter測試Java(二)

sets interval permsize int 文件 不同 時間 結果 argument 實例: 服務為:將輸入的兩個參數通過IO存入文件; 1、打開MyEclipse,編寫Java代碼 服務: package test; import java.io.F

在vue-cli生成的項目中使用karma+chrome進行單元測試

使用 設計實現 測試用例 runner 服務 進行 ui界面 包含 node 用vue-cli生成項目時,如果選擇了單元測試,那麽會采用karma+mocha作為單元測試框架,默認使用的瀏覽器是PhantomJs。 Karma是一個基於Node.js的JavaScri

Jmeter連接SqlServer數據庫進行壓力測試

jmeter 性能測試 前提準備:先安裝jdbc驅動驅動下載鏈接地址:http://pan.baidu.com/s/1bpDpjSr 密碼:v6tn 下載解壓之後,講sqljdbc4.jar放置jmeter的安裝目錄/lib下;復制之後重新啟動jmeter;1.測試計劃—配置驅動程序 測試計劃

第二篇--Jmeter測試Java請求

代碼 數量 介紹 第二篇 -1 art .cn eclipse cor   前提:需要準備eclipse作為開發工具,安裝jdk,準備完畢,接下來開工嘍!      1、新建Java工程BMIrisJNIJarTest,新建lib目錄,將Jmeter安裝目錄下lib/ext

使用MockMVC與Junit進行單體測試

eval mvc obj abs nco tps 測試 nal pub 1、pom.xml追加 junit spring-test 2、測試共通類 @ContextConfiguration(locations = { "classpath:springframewo

調用騰訊優圖開放平臺進行人臉識別-Java調用API實現

ace tno 開放平臺 term href max pre ant water ttp://open.youtu.qq.com官網 騰訊產品文檔 直接234. 第一步:鑒權服務技術方案 Java代碼實現如下 import java.util.Date;