文章目錄
- Jacoco是什么
- Jacoco的主要功能
- (一)多樣化覆蓋率指標分析
- (二) 豐富的報告生成
- (三)實時數據收集
- Jacoco的工作原理
- (一)字節碼增強
- (二)測試執行與數據收集
- 使用方法
- 需要工具
- 步驟
- 本地啟動開啟Jacoco覆蓋率
- 效果
在測試過程中,為了解決 統計【行覆蓋率】和【已經覆蓋行數】兩個指標,便于快速查看和復制,我們可以通過Jacoco去解決。
Jacoco是什么
Jacoco 是專門用于 Java 項目測試覆蓋率檢測的工具,由 EclEmma 項目演變而來。它能夠精準地分析出代碼中哪些部分已被測試覆蓋,哪些部分尚未覆蓋,為開發者優化測試用例提供了明確方向
Jacoco的主要功能
(一)多樣化覆蓋率指標分析
Jacoco 支持多種覆蓋率指標,涵蓋行覆蓋、分支覆蓋、方法覆蓋和類覆蓋等。行覆蓋用于判斷代碼的每行是否至少有一個指令被執行;分支覆蓋聚焦于如 if - else、switch 等語句分支的執行情況;方法覆蓋判斷方法是否被調用執行;類覆蓋則確定類是否被執行。通過這些指標,開發者能全方位了解代碼的測試覆蓋狀況。
(二) 豐富的報告生成
它能生成詳細的覆蓋率報告,且支持 HTML、XML 和 CSV 等多種格式。這些報告清晰展示代碼的覆蓋情況,突出顯示未覆蓋的代碼區域,方便開發者分析和排查問題。
(三)實時數據收集
在測試運行時,Jacoco 可動態收集覆蓋率數據,無需事后處理,能實時反映代碼的測試狀態,助力開發者迅速調整測試策略。
Jacoco的工作原理
(一)字節碼增強
在測試運行前,Jacoco 會對 Java 字節碼進行修改,插入覆蓋率收集的邏輯,這一過程即 “字節碼增強”。增強后的字節碼包含用于記錄代碼路徑執行情況的指令,為準確捕捉代碼執行信息奠定基礎。
(二)測試執行與數據收集
測試用例運行時,增強后的字節碼會執行插入的覆蓋率記錄邏輯,實時收集代碼行、分支、方法和類的執行信息。Jacoco 采用輕量級代理模式,對測試執行性能影響極小。測試完成后,Jacoco 匯總收集到的覆蓋率數據,生成詳細的覆蓋率報告,清晰展示各代碼單元的覆蓋情況。
使用方法
需要工具
油猴插件:https://www.tampermonkey.net/
步驟
- 安裝tampermonkey插件,并打開插件開關
- 點開詳情,將允許訪問文件網址打開,才可以生效與本地生成的jacoco覆蓋率報告
- 通過管理面板,進入管理頁面,新增腳本
- 通過添加新的腳本,將以下腳本鍵入并保存
// ==UserScript==
// @name 白盒覆蓋率報告覆蓋率插件
// @namespace http://tampermonkey.net/
// @version 0.1
// @description 用于jacoco報告的計算行覆蓋率!
// @author lulu
// @match https://coverage.myshopline.cn/jacoco/report/*
// @match file:///*.html
// @icon https://www.google.com/s2/favicons?sz=64&domain=myshopline.cn
// @grant GM_addStyle
// @grant unsafeWindow
// @grant GM_setClipboard
// @require https://unpkg.com/jquery@3.6.0/dist/jquery.min.js
// @require https://unpkg.com/sweetalert2@10.16.6/dist/sweetalert2.all.min.js// ==/UserScript==(function() {'use strict';var element = document.querySelector("tbody");var thead = document.querySelector('td#i');var theadtdratio = document.createElement('td');var coveredtd = document.createElement('td');// 底部var foot = document.querySelector('tfoot > tr > td:nth-of-type(9)');var footcovered = document.createElement('td');var footratiotd = document.createElement('td');footcovered.setAttribute('class','ctr2')footratiotd.setAttribute('class','ctr2')foot.before(footcovered);foot.after(footratiotd);//設置表頭theadtdratio.innerHTML = '行覆蓋率比例';coveredtd.innerHTML = 'Covered';thead.before(coveredtd);thead.after(theadtdratio);var coveredConut = 0;// 獲取地址var url =window.location.href;var baseUrl = url.substring(0,url.lastIndexOf('/')+1)console.log('讀取地址:',baseUrl)for(var i=0; i<element.rows.length; i++){var miss = parseInt(element.rows[i].cells[7].innerHTML.replace(/,/g, ""));var lines = parseInt(element.rows[i].cells[8].innerHTML.replace(/,/g, ""));var link = element.rows[i].cells[0].querySelector('a').getAttribute('href');var covered = lines - missvar result =Math.round((1- miss/lines) * 10000) / 100;//添加結果var td = document.createElement('td');var alink = document.createElement('a');alink.innerHTML = result +'%'alink.href = baseUrl + linktd.appendChild(alink);td.setAttribute('class','ctr2');var coveredtd1 = document.createElement('td');coveredtd1.innerHTML = covered;coveredtd1.setAttribute('class','ctr2')element.rows[i].cells[7].after(coveredtd1);element.rows[i].cells[9].after(td);coveredConut += covered;//totalLines += result;/*//TODO 準備做一鍵復制var copyButton = document.createElement('span');copyButton.id = i;copyButton.innerHTML = miss +'\n' + lines +'\n' + resultelement.rows[i].appendChild(copyButton);copyButton.onclick = function(miss){//copy(miss+'\t'+lines+'\t'+result);console.log('copy:'+copyButton.innerHTML);//copy(parseInt(element.rows[i].cells[7].innerHTML.replace(/,/g, ""))+'\t'+parseInt(element.rows[i].cells[8].innerHTML.replace(/,/g, ""))+'\t'+td.innerHTML);}*///處于70-80if(result>=75 && result < 100){td.style.backgroundColor = '#00FFCC';}else if(result == 100){td.style.backgroundColor = 'green';}//低于70%else{td.style.backgroundColor = 'red';}//總覆蓋率//totalLines += result;console.log(miss,lines,link,result);}footcovered.innerHTML = coveredConut;var tatolratiotd = coveredConut/parseInt(document.querySelector('tfoot > tr > td:nth-of-type(10)').innerHTML.replace(/,/g, "")) ;footratiotd.innerHTML = Math.round(tatolratiotd * 10000) / 100 + '%';if(tatolratiotd>=75 && tatolratiotd < 100){footratiotd.style.backgroundColor = '#00FFCC';}else if(tatolratiotd == 100){footratiotd.style.backgroundColor = 'green';}//低于70%else{footratiotd.style.backgroundColor = 'red';}const copy = (text) => {GM_setClipboard(text, 'text');}})();
- 打開對應開關即可
本地啟動開啟Jacoco覆蓋率
-
編輯運行配置
-
調整運行模板的junit code coverage配置為項目目錄,并選擇jacoco覆蓋率統計工具
-
導出本地日志,保存后會自動打開報告可以查看