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. 生成報告
測試完這個版本後,生成報告
相關文章
- 使用EMMA獲取Android測試覆蓋率Android
- Jacoco--測試覆蓋率工具
- 程式碼覆蓋率與測試覆蓋率比較
- iOS 覆蓋率檢測原理與增量程式碼測試覆蓋率工具實現iOS
- [android]android自動化測試十一之程式碼覆蓋率報告EMMAAndroid
- 覆蓋率檢查工具:JaCoCo 食用指南
- 程式碼覆蓋率工具 Istanbul 入門教程
- Google開源ScriptCover,JavaScript程式碼覆蓋率工具GoJavaScript
- pHp程式碼覆蓋率PHP
- 程式碼覆蓋率分析
- 【Lua】實現程式碼執行覆蓋率統計工具
- idea2022.1 檢視單測覆蓋率展示分支覆蓋率Idea
- go 程式碼覆蓋率測試Go
- 程式碼測試覆蓋率分析
- JavaScript覆蓋率統計實現JavaScript
- java覆蓋率檢測-jacocoJava
- 什麼是程式碼覆蓋率
- 前端精準測試探索:覆蓋率實時統計工具前端
- 微軟Windows 10創意者更新秋季版覆蓋率覆蓋率再達新高:已達85%微軟Windows
- 如何提高全城wifi訊號覆蓋率WiFi
- 多程式下的測試覆蓋率
- Mockito提升單元測試覆蓋率Mockito
- 模型評估過程中:命中率/覆蓋率模型
- 在做服務端程式碼覆蓋率或者準備做程式碼覆蓋率的兄弟們,來聊聊???服務端
- JaCoCo計算程式碼覆蓋率原理
- Java 程式碼覆蓋率調研報告Java
- PouchContainer 整合測試覆蓋率統計AI
- 使用Rational PureCoverage測試程式碼覆蓋率
- 單元測試的覆蓋率計算
- 精準測試與開源工具Jacoco的覆蓋率能力對比開源工具
- Linux下lcov單元測試覆蓋率Linux
- Go1.20 新版覆蓋率方案解讀Go
- ITU:行動網路全球覆蓋率達90%
- 如何制定介面自動化測試的覆蓋率?
- 蘋果代簽名:iPhone 5G覆蓋率差?蘋果iPhone
- Android Demo:手工覆蓋率(AS3.2)use JacocoAndroidS3
- 請問大家覆蓋率監控分支是哪個版本?
- ReactNative 多端程式碼覆蓋率調研及實踐React