前言
代碼覆蓋率是用來干什么的?得到之后呢?
這是昨天隔壁小伙問我的問題,仔細(xì)想了一想。代碼覆蓋率只是對于測試質(zhì)量評估的某一個(gè)維度而已。并不是什么指標(biāo)等硬性的要求。大多數(shù)項(xiàng)目其實(shí)都用上了單元測試的代碼覆蓋率,java項(xiàng)目的jacoco, js下的karma等工具也也來越容易使用。在我這有限的工作經(jīng)驗(yàn)中也經(jīng)歷過多次對于代碼覆蓋率的討論,尤其是UT的test coverage。在java項(xiàng)目中,尤其是事務(wù)腳本類的web結(jié)構(gòu)代碼,代碼覆蓋率就更加無法代表代碼質(zhì)量。
換個(gè)角度去看,測試覆蓋率可以幫助找到?jīng)]有被測試到case,這樣反而意義更大。這也是本文提到集成測試和回歸測試的覆蓋率的起因。
代碼覆蓋率工具
Jacoco是現(xiàn)在java項(xiàng)目常用的覆蓋率工具,jacoco的代碼覆蓋粒度包括了 類
,方法
,行
,分支
,指令
和圈
。
這是幾種java代碼覆蓋率工具(jacoco, emma, Cobertura)使用的插莊方式,
本文要說的是基于byte code的植入方式。jacoco使用的是基于javaagent 的on-the-fly模式。
這種方式相比于offline無需修改代碼,并且可以在程序運(yùn)行時(shí)dump覆蓋率報(bào)告,但是需要開啟額外的代理。
JacocoAgent
jacoco的on-the-fly 模式是基于javaagent。需要在啟動程序的jvm參數(shù)中指定-javaagent 的jar文件,也就是存在機(jī)器某個(gè)位置的jacocoAgent.jar 文件。
jacocoAgent的報(bào)告dump方式有三種:
local file
在jvm參數(shù)值配置output路徑
-javaagent:[yourpath/]jacocoagent.jar=output=/user/path/jacoco.execTCP server
配置address和port,然后使用jacocoant,dump jacoco報(bào)告。TCP client
配置address和port,然后使用jacocoant,數(shù)據(jù)直接sync到remote端口。
dump報(bào)告
在server使用jacocoAgent啟動后,jacoco會一直檢測啟動后這段時(shí)間內(nèi)的server運(yùn)行鎖執(zhí)行過的程序生成覆蓋率報(bào)告。
jacocoAgent默認(rèn)會在jvm stop是自動dump報(bào)告數(shù)據(jù)。但是也可以通過Ant Tasks 或 jacoco mvn plugin 來dump。
具體使用可參照文檔。