EMMA 覆蓋率工具


1. EMMA 介紹

EMMA 是一個開源、面向 Java 程序測試覆蓋率收集和報告工具。它通過對編譯后的 Java 字節碼文件進行插裝,在測試執行過程中收集覆蓋率信息,並通過支持多種報表格式對覆蓋率結果進行展示。EMMA可以統計幾種覆蓋率:class,method,block, line。支持版本迭代的覆蓋率統計

2. EMMA 使用

EMMA基本是四步曲:插樁(instr),運行,收集(ctl),報告(report)。下面分別詳細的介紹下

2.1 安裝

下載地址:http://sourceforge.net/projects/emma/files/emma-testing/

目前流行使用的是v2.1.*,因為支持ctl命令

將emm.jar cp /usr/local/jdk/jre/lib/ext 下面,安裝完成

2.2 插樁

command:java emma instr -cp /usr/local//anrs/lib/anrs.jar -m overwrite -ix +com.* -Dmetadata.out.file=test.em

參數介紹:

-cp,指定插樁的路徑,多個jar包可以用,分割

-m:輸出模式

     overwrite:重新jar包,anrs.jar

     default:copy, 需要加上-d參數,指定輸出路徑。有插樁,才cp一份class到指定路徑

     fullcopy:需要加上-d參數,指定輸出路徑。 不管有沒有插樁,都cp一份class到指定路徑

-merge:合並。

    default:yes。 如果metadata指定輸出的文件一樣,將兩次插樁信息進行合並

    no。不合並兩次插樁信息

-ix:指定需要插樁的class

   +com.*: + 指包含

   -com.*:-指排除

  支持多個+和-,用逗號分隔

這個功能對我們關注被改動的代碼很有作用

-Dmetadata.out.file: 指定元數據(metadata)輸出路徑。默認是當前路徑

我們在測試過程中, 一般都會去更新幾次jar包,並且我們希望統計出這個版本測試的覆蓋率,我們就需要把幾次的元數據進行合並

2.3 運行

一般情況下,直接運行應用程序即可。EMMA會啟動一個監聽端口,用來后面收集信息(ctl)。這個端口是固定的,47653。

如果我們的應用是多進程的,就會出現啟動失敗。

其實EMMA也提供了一個命令,進行端口設置:-Demma.rt.control.port=39123

還有host指定,-Demma.rt.control.host=192.168.22.22. default is localhost

這個參數需要加在程序啟動命令里

EMMA還有簡單的配置文件:java -Demma.properties=my.properties

my.properties format: tag=value

可以配置的參數參考:http://emma.sourceforge.net/reference/ch03s02.html#prop-ref.tables

 

2.4 收集

一般有兩種收集信息方法:

1. 程序退出,自動收集,在當前運行目錄下生成coverage.ec

2. 命令行:

java -cp /usr/jdk/jdk1.6.0_23/jre/lib/ext/emma.jar emma ctl -connect localhost:47653 -command coverage.get,coverage.ec

 

合並.ec文件

由於 EMMA 中測試覆蓋率是通過與 “*.em” 文件關聯獲得代碼信息的,因此當代碼發生變化時,已經運行過的測試不必完全重復,只需將得到的 “*.ec” 文件合並(新得到的 “*.ec” 文件放在后面),然后關聯最新的 “*.em” 文件即可得到代碼變化后的覆蓋率信息,這方便了 EMMA 支持版本變化的測試。在生成新的測試報告的時候,需要注意 “*.ec” 的時間一定要晚於 “*.em” 文件。

1. 自動合並。如果生成的.ec文件名字相同,自動合並。

2. 命令行合並:java  -cp /usr/jdk/jdk1.6.0_23/jre/lib/ext/emma.jar emma merge -input SM1.ec, SM2.ec -outfile SM.ec

.ec 文件需要按照時間從前到后排列,才能保證合並信息正確(參考網上說法。但我測試的結果發現,自動合並與merge合並的結果不一致,自動合並的結果更准確。所以最好使用自動合並)

默認合並為coverage.es。

貌似現在的版本outfile參數不起作用,都會合並為coverage.es

 

清除執行統計信息

如果我們想要每個測試用例的獨立覆蓋率報告,需要將內存中的執行信息清除掉。

目前有兩種清除方法:

1. 重啟應用

2. 命令行:reset

java  -cp /usr/jdk/jdk1.6.0_23/jre/lib/ext/emma.jar emma ctl -connect localhost:47653 -command coverage.reset

reset只能清除內存中記錄的方法、塊、行的執行信息,但是無法清除類覆蓋信息。

2.5 report

command:

java -cp /usr/jdk/jdk1.6.0_29/jre/lib/ext/emma.jar emma report -r html -in anrs.em coverage.ec –sp src/-Dreport.html.out.file=coverage.html

參數介紹

-r: report type:html,txt,xml

-sp: sourcecode path

3. 會碰到的問題(來源於網上介紹,refer to

<http://www.51testing.com/?uid-170805-action-viewspace-itemid-87390>

3.1 issue1

"emma ctl:

coverage.get: RPC failure while executing [coverage.get]

Exception in thread "main" com.vladium.emma.EMMARuntimeException: coverage.get:

RPC failure while executing [coverage.get]

        at com.vladium.emma.ctl.CtlProcessor._run(CtlProcessor.java:242)"

 

需要在應用執行目錄下進行插樁,就可以解決這個issue

3.2 issue2

Exception in thread "main" java.lang.NoClassDefFoundError: com/vladium/emma/rt/R

T

        at org.apache.jmeter.NewDriver.$VRi(NewDriver.java)

        at org.apache.jmeter.NewDriver.<clinit>(NewDriver.java)

errorlevel=1

 

由於java加載ApacheJMeter.jar包時ClassLoader順序非預期,通過-

Xbootclasspath/p:E:\alibaba\tools\emma-stable-2.1-lib\emma.jar  強制優先加載emma.jar。

故修改應用啟動腳本為(以jemeter為例)

%JM_START% %JM_LAUNCH%  -Xbootclasspath/p:E:\alibaba\tools\emma-stable-2.1-lib\emma.jar  %

JVM_ARGS% %ARGS%   -jar "%JMETER_BIN%ApacheJMeter.jar" %JMETER_CMD_LINE_ARGS%

 

4. 項目應用

4.1 項目特點

應用程序會啟動多個進程,啟動腳本也會執行jar包。---需要解決emma端口沖突

測試過程中,由於bug會修改代碼,版本迭代。希望統計這些版本的整個覆蓋率信息---emma支持多個版本的覆蓋率統計

希望每個case都有自己獨立的覆蓋率統計信息,同時也要有整個的覆蓋統計信息。

4.2 應用

每個case執行的步驟:

1. 判斷是否更新了jar包

1.1 更新:插樁,指定同個文件名合並到一起

1.1.1 stop app

1.1.2 設置 EMMAPORT 環境變量

1.1.3 啟動一個應用進程,指定EMMAPORT:-Demma.rt.control.port=$EMMAPORT

1.1.4 循環1.1.2 & 1.1.3,啟動完所有的進程

1.2 未更新:

1.2.1 清除執行信息:

java  -cp /usr/jdk/jdk1.6.0_23/jre/lib/ext/emma.jar emma ctl -connect localhost:47653 -command coverage.reset

2. 執行case

3. 收集執行信息

3.1 把所有進程的執行信息收集到一個文件里

java -cp /usr/jdk/jdk1.6.0_23/jre/lib/ext/emma.jar emma ctl -connect localhost:47653 -command coverage.get,coverage.ec

3.2 每個case需要有獨立的執行信息

cp coverage.ec coverage_caseNo.ec

4. 生成報告

測試完這個版本后,生成報告


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM