https://blog.csdn.net/qq_33589510/article/details/104915621
jacoco能解決什么問題
- 自動化測試雖然快,但是不知道是不是有漏測
- 提高測試設計質量
- 可快速對比多次測試之間的差距
- 測試完整性的一種手段
jacoco需要依賴的 - 困難
- 最好有獨立的測試環境(測試環境隔離)
- 在統計覆蓋率的時候,有干擾項(可能不是自動化測試用例跑出來的)
- 測試環境不能有分布式jar,不然接口測試分流了 可能會統計不准(一個節點跑出了30%,一個節點跑出了70%)
分布式情況的統計合並(對測試用例,流量的配置) - 依賴模塊或第3方可能導致用例中斷統計不准(需要對依賴模塊的檔板隔離)
- 增量覆蓋率(差異化,不同版本的覆蓋率對比再修改自動化測試腳本)
on-the-fly
- 插樁模式,jacoco在外圍動態收集覆蓋率信息
jacoco操作步驟
- 配置jacocoagent參數,啟動服務
java - javaagent:jacocoagent.jar [=options]應用
- 生成 jacoco.exec
ant dump
- ant 構建生成覆蓋率報告
ant report
includes:包含在執行分析中的類名列表,*表示全部
output:表示使用tcpserver代理偵聽由address和port屬性指定的TCP端口,並將執行的數據寫入此TCP連接,從而實現不停止項目運行實時生成代碼覆蓋率報告
port:開啟的端口號
address: 開啟的ip地址,本地寫127.0.0.1
jar:運行服務的jar包地址
java - javaagent:jacocoagent.jar [=options]應用
什么方法級別覆蓋率你都還不滿足,想看到底哪行代碼覆蓋到了?
那你得知道這有多坑了,最基本的配置是做不到的,我們還需要配置自己的 class 文件路徑和源碼路徑!
注意要具體到 class 目錄和 java 目錄!,即 com 目錄的上一級目錄,就能完美展示源碼的覆蓋率情況了
jacoco實戰
以Api的方式來進行操作的好處
- https://testerhome.com/topics/20632
- https://www.eclemma.org/jacoco/
- 以 Api 的方式來進行操作,可以有以下好處
Jacoco 官方的 Api 示例
地址: https://www.jacoco.org/jacoco/trunk/doc/api.html
可以屏蔽不同方式的構建部署,如果你想把這個功能做成平台,那 api 想必是很好的一種方式。
也就是說,我只需要把 jacoco 插樁到測試服務器上,暴露 tcp 的 ip 和端口,剩余的提取代碼執行數據、生成覆蓋率報告,就可以用統一的方式進行就好了。
眾所周知,jacoco 官方提供了 Maven 插件方式、Ant 的 xml 方式,均有對應的 dump 和 report 來進行覆蓋率數據的 dump 和報告生成,如果有興趣可以研究一下,我也不過於啰嗦。
- 構建工具。我司現有 Maven 構建、ANT 構建,想必有的公司還有用 gradle 的。部署方式。Ant、Maven 插件啟動、java -jar 啟動、tomcat 啟動 war 包 (打包方式就隨便了)
tomcat war包的方式插樁
只需要改動 catalina.sh 中的啟動參數即可。
前面提到過,主要改動主要是改動 java -jar,tomcat 是通過一個 JAVA_OPTS 參數來控制額外的 java 啟動參數的,我們只需要在合適的地方把上面的啟動命令追加到 JAVA_OPTS 即可
打開 catalina.sh,找到合適的地方修改 JAVA_OPTS 參數:
理論上,任何地方修改 JAVA_OPTS 參數均可,但我們實驗過后,在以下位置加入,是一定可以啟動成功的,當然您也可以嘗試其他位置.
JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`"
源腳本中有這個注釋掉的地方,我們在下方修改 JAVA_OPTS:
在其下方,加一句:
JAVA_OPTS="$JAVA_OPTS -javaagent:$jacocoJarPath=includes=*,output=tcpserver,port=2014,address=192.168.110.1"
檢驗是否啟動成功:
ps -ef|grep jacoco
netstat -anp |grep 'address'
maven 插件的方式啟動
mvn clean install
export MAVEN_OPTS="-javaagent:$jacocoJarPath=includes=*,output=tcpserver,port=2014,address=192.168.110.1"
mvn tomcat7:run -Dport=xxx
export MAVEN_OPTS=""
mvn clean install
export MAVEN_OPTS="-javaagent:$jacocoJarPath=includes=*,output=tcpserver,port=2014,address=192.168.110.1"
mvn spring-boot:run -Dport=xxx
export MAVEN_OPTS=""
關於啟動之后
- 就可以直接給測試用了
覆蓋率報告生成
就本質上來說,覆蓋率報告的生成,只需要兩個必須的東西,一個是 class 文件,一個是針對這些 class 產生的執行信息 (就是 exec 文件)。
當然了源碼起到很重要的作用就是可以讓你在報告里面來回跳轉查看代碼詳情,如果沒有源碼,則沒辦法點進去方法。
綜上來說,那也可以說成一個完善的覆蓋率報告,可以有源碼、class 文件、和對應的 exec 文件即可。
可能出現的問題
造成覆蓋率報告數據不准確的原因有哪些?
最最最最底層的原因。 部署時的 class 文件和生成報告的時候,用的 class 文件不一致。有以下幾種情況:
- 測試服務器(就是你的應用所在的那個環境)中的 class 文件和我管理平台上編譯環境不一致,導致產生的 class 文件跟部署時的 class 文件有差異。這個可以通過不手動編譯,而是從 測試服務器部署位置的目錄來拷貝傳輸,來解決
- 測試服務器版本變更了,但是管理平台上的代碼沒變更(或者說新代碼拉取下來了,但是沒有重新編譯。),導致 class 文件不一致
- 管理平台上的新版本代碼的版本號沒有填寫,默認每次拉取最新代碼,這會導致生成報告的時候,源碼變了,class 文件沒變,覆蓋率插樁收集的時候,用的還是老代碼 所以,要想准確。需要保證,測試服務器部署時的代碼版本和管理平台上寫的版本號完全一致。
獲取增量覆蓋率作為精准測試平台的六脈神劍之一
https://testerhome.com/articles/23700
didi_tech:super-jacoco
https://mp.weixin.qq.com/s/3a8ki3GiW0Rk0lBzN4cnHw,https://www.infoq.cn/article/Hx3l4qjsFVbE6hNp3reZ
https://gitee.com/Dray/jacoco
https://gitee.com/Dray/code-diff
https://blog.csdn.net/tushuping/article/details/117320809?spm=1001.2014.3001.5501