前言
代碼覆蓋率是用來干什么的兼蜈?得到之后呢饭尝?
這是昨天隔壁小伙問我的問題献宫,仔細(xì)想了一想。代碼覆蓋率只是對于測試質(zhì)量評估的某一個維度而已涉瘾。并不是什么指標(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ì)量驯妄。
換個角度去看,測試覆蓋率可以幫助找到?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ī)器某個位置的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。
具體使用可參照文檔挫望。