單元測試覆蓋率

什么是單元測試覆蓋率

關于其定義,先來看一下維基百科上的一段描述:

代碼覆蓋(Code coverage)是軟件測試中的一種度量,描述程序中源代碼被測試的比例和程度,所得比例稱為代碼覆蓋率。

簡單來理解,就是單元測試中代碼執行量與代碼總量之間的比率。

以一個最簡單的例子來直觀感受一下:

Service服務類:

public class NumToStringServiceImpl implements NumToStringService {@Overridepublic String num2Str(Integer i) {String str = "";switch (i) {case 1:str = "one";break;case 2:str = "two";break;default:str = "none";}return str;}
}

單元測試類:

public class NumToStringServiceTest {@AutowiredNumToStringService numToStringService;@Testvoid testNum2Str() {String str1 = numToStringService.num2Str(1);assertThat(str1, is("one"));String str2 = numToStringService.num2Str(2);assertThat(str2, is("two"));}
}

從上面的代碼中能看出,單元測試方法testNum2Str能夠覆蓋到服務類num2Str方法的case 1case 2兩個分支,覆蓋不到default分支。那么覆蓋率就是num2Str方法case 1case 2分支的代碼量除以方法的總代碼量。

單元測試覆蓋率框架

單元測試覆蓋率常用的框架有JaCoCoEMMACobertura。我們目前(在Jenkins中)使用的是JaCoCo。

JaCoCo可以統計的指標有:

  1. 指令(C0 Coverage):JaCoCo計數的最小單元是單一的Java字節碼指令。指令覆蓋率提供了關于字節碼執行數量、未執行數量的信息。
  2. 分支(C1 Coverage):對所有的ifswitch語句計算分支覆蓋率。統計在方法中分支執行數量、未執行數量的信息。但要注意,異常處理不在此計算范圍內。
  3. 圈復雜度(Cyclomatic Complexity):對非抽象方法計算圈復雜度,并匯總類、包和組的(圈)復雜度。這個值可以做為單元測試用例是否完全覆蓋的參考。
  4. 行(Lines):一行可能包含一條或多條指令,如果至少有一條指令被執行了,那么該行就算作是被執行了。
  5. 方法(Methods):每個非抽象方法至少包含一條指令。如果至少有一條指令被執行了,那么該方法就算作是被執行了。
  6. 類(Classes):如果類中至少有一個方法被執行了,那么該類就算作是被執行了。

注:個人認為,最需要關注的指標是(Lines)和分支(C1 Coverage),其次是方法(Methods)和(Classes),指令(C0 Coverage)和圈復雜度(Cyclomatic Complexity)可以不用關注,因為跟(Lines)和分支(C1 Coverage)其實是差不多的,只不過多了一種參考維度。

查看單元測試覆蓋率

在IntelliJ IDEA中已經內置了JaCoCo插件,因此研發可以在本機運行單元測試來查看覆蓋率:

1、點擊IDE右上側的"Edit Configurations...":

2、在"Choose coverage runner"中選擇JaCoCo:

?

3、點擊"Run ... with Coverage"運行:

?

?4、運行完成后會展示分支(C1 Coverage)、(Lines)、方法(Methods)、(Classes)這四個指標:

?5、點擊"Generate Coverage Report"可以生成一份html版的所有指標的報告:

?

JaCoCo與持續集成

1、需要在項目的<plugins>中加入JaCoCo插件:

<plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><version>0.8.5</version><executions><execution><id>default-prepare-agent</id><goals><goal>prepare-agent</goal></goals></execution><execution><id>default-report</id><goals><goal>report</goal></goals></execution></executions>
</plugin>

目前發現如果項目中不加以上配置,而是在Jenkinsfile中

?以命令的方式去應用JaCoCo,會導致不能生成jacoco.exec,進而無法運行覆蓋率測試。

2、在Jenkinsfile中加入

?

exclusionPattern: '**/controller/*.class', sourceExclusionPattern: '**/controller/*.java'

可以過濾掉controller層的檢測。因為目前我們的單元測試主要是針對service層的,如果把controller層的類引入進來,會使單元測試覆蓋率的值變低。

3、可以在Jenkins(http://${ip}:${port}/job/${your_project}/lastBuild/jacoco/)中查看生成的單元測試覆蓋率報告:

?

該報告與IntelliJ IDEA中的報告都是JaCoCo原生的,是準確的。

目前發現SonarQube中的報告一是不準,二是指標不全,建議不要查看SonarQube的報告。

題外話

覆蓋率作為衡量單元測試質量的唯一標準是不合理的。比如下面這個例子:

public double cal(double a, double b) {if (b != 0) {return a / b;}
}


僅一個測試用例就可以做到100%的覆蓋率,比如cal(10.0, 2.0),但并不代表測試足夠全面了,還需要考慮當除數等于0的情況下,代碼執行是否符合預期。


---------------------
作者:谷隱凡二
來源:CSDN
原文:https://blog.csdn.net/m0_37570494/article/details/125440949
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24301.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24301.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24301.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言實現map數據結構 key—value對應

1.首先43行 createKeyValuePair(char*key ,int value)這個函數就是給一個keyValuePair *pair的指針來通過內存分配將數據key和value存入這個pair指針所對應的內存空間 2.52行freeKeyValuePair這個函數是釋放內存空間 3.頭文件 struct結構體KeyValuePair就是一個指針一個值 4…

GO語言 服務發現概述

https://zhuanlan.zhihu.com/p/32027014 明明白白的聊一下什么是服務發現-CSDN博客 一、服務發現 是什么 在傳統的系統部署中&#xff0c;服務運行在一個固定的已知的 IP 和端口上&#xff0c;如果一個服務需要調用另外一個服務&#xff0c;可以通過地址直接調用。 但是&…

軟件巨頭SAP裁員優厚條件,吸引5300名員工爭相離職

導語 大家好&#xff0c;我是社長&#xff0c;老K。專注分享智能制造和智能倉儲物流等內容。 新書《智能物流系統構成與技術實踐》 在科技行業的大潮中&#xff0c;SAP公司近日因一項頗具爭議的裁員計劃而備受矚目。但這次裁員風波并未如往常般引發員工的強烈抗議&#xff0c;反…

D365 子窗體調用父窗體方法

文章目錄 一、在子窗體中調用父窗體公共方法二、刷新 CallerForm 數據源 一、在子窗體中調用父窗體公共方法 Object callerForm element.args().caller(); if(callerForm is FormRun && formHasMethod(callerForm, identifierStr(parentMethod))) {callerForm.parent…

知網-數學學習與研究-收稿郵箱

知網-數學學習與研究-收稿郵箱 《數學學習與研究》雜志是由東北師范大學主管&#xff0c;吉林省數學會與東北師范大學出版社聯合主辦的省級優秀數學類期刊雜志。 主管單位&#xff1a;東北師范大學 主辦單位&#xff1a;吉林省數學會;東北師范大學數學與統計學院 創刊時間1983…

AI學習指南機器學習篇-決策樹基本原理

AI學習指南機器學習篇-決策樹基本原理 在機器學習領域&#xff0c;決策樹是一種常見且十分重要的算法。它不僅在分類任務中被廣泛應用&#xff0c;還可以用于回歸任務。本篇博客將詳細介紹決策樹的基本原理&#xff0c;包括節點、分裂準則、信息增益、基尼不純度等概念&#x…

msvcr120.dll丟失怎樣修復?為什么msvcr120.dll文件很重要

msvcr120.dll? 是一個屬于 Microsoft Visual C 2013 Redistributable package 的動態鏈接庫文件。這個文件對于運行使用 Visual Studio 2013 開發的應用程序是必要的&#xff0c;因為它包含了C運行時庫的一部分功能&#xff0c;這些功能是標準C庫中與輸入/輸出操作、字符串操作…

OpenCV中的圓形標靶檢測——斑點檢測算法(二)

前面的章節中我們已經大致介紹了算法流程,也對一些算法中用到的相關概念做了簡要介紹,同時給出了算法調用的API,現在我們開始算法檢測接口實現源碼的分析。 1. 斑點的分組與加權 這里我們選擇后者,先了解算法的處理流程,再分析各個模塊的實現。算法流程圖如下圖所示,上一…

android中調用onnxruntime框架

創建空白項目 安裝Android Studio及創建空白項目參考&#xff1a;【安卓Java原生開發學習記錄】一、安卓開發環境的搭建與HelloWorld&#xff08;詳細圖文解釋&#xff09;_安卓原生開發-CSDN博客 切記&#xff1a;build configuration language 一定選擇Groovy&#xff01;官…

51單片機-LCD液晶顯示

目錄 前言: 一. LCD1602模塊簡介 二. 代碼功能實現 三.總結 前言: 本文主要是51單片機的LCD液晶顯示,使用的是LCD1602.下面是詳細介紹和完整代碼,歡迎大家的點贊,評論和關注.感謝. 一. LCD1602模塊簡介 LCD1602 模塊具有以下特點&#xff1a; 顯示特點&#xff1a; 可以…

MySQL 將null轉0 ifnull() coalesce()

做統計報表的時候&#xff0c;有時候不希望查出來的值是null&#xff0c;因為在代碼中需要做大量的判空&#xff0c;最后轉換成0來處理。既然如此&#xff0c;那在sql中查出來就是0&#xff0c;就不用為空而去判空了。 1.IFNULL() ifnull()只能放2個值。 select IFNULL(null,0…

[240608] Zig 發布 v0.13.0 |AMD 新處理器不支持 Win 10 |DuckDuckgo 發布AI匿名聊天服務

目錄 Zig 發布 0.13.0 版本AMD 下一代銳龍處理器不支持 Windows 10DuckDuckgo 發布 AI 匿名聊天服務 Zig 發布 0.13.0 版本 Zig 發布 0.13.0 版本&#xff0c;此次發布的主要目的是升級 zig 工具鏈&#xff0c;發布重點如下&#xff1a; 工具鏈升級&#xff1a; LLVM&#xf…

DevOps的原理及應用詳解(六)

本系列文章簡介&#xff1a; 在當今快速變化的商業環境中&#xff0c;企業對于軟件交付的速度、質量和安全性要求日益提高。傳統的軟件開發和運維模式已經難以滿足這些需求&#xff0c;因此&#xff0c;DevOps&#xff08;Development和Operations的組合&#xff09;應運而生&a…

企業建站響應式網站建設平臺版源碼系統 海量模版可選擇 帶完整的安裝代碼以及搭建教程

系統概述 企業建站響應式網站建設平臺版源碼系統是一款集創新性、實用性和便捷性于一體的建站解決方案。它旨在為用戶提供一站式的網站建設服務&#xff0c;無論你是新手還是經驗豐富的開發者&#xff0c;都能通過該系統輕松實現網站的構建與部署。 該系統采用先進的技術架構…

單鏈表復習 (C語言版)

目錄 一.順序表與鏈表的區別 二.鏈表概念 三.單鏈表 1.單鏈表的開始與初始化 2.單鏈表的打印 3.單鏈表的尾插 重難點&#xff1a;單鏈表實現時的指針詳解 4.單鏈表的頭插 5.單鏈表的尾刪 6.單鏈表的頭刪 小結&#xff1a; 7.單鏈表的查找 8.在指定位置前插入數據 …

mingw64,clang,gcc

MinGW-w64、Clang 和 GCC 都是編譯器&#xff0c;但它們在功能和設計上有一些區別&#xff1a; MinGW-w64 是一個在 Windows 平臺上的開發工具集&#xff0c;它提供了一組 GNU 工具和庫&#xff0c;可以用于編譯和構建本地的 Windows 應用程序。MinGW-w64 的主要目標是提供類似…

GitHub工程獲取第三方PR操作

GitHub工程獲取第三方PR操作 1. 源由2. 獲取第三方PRStep 1&#xff1a;安裝ghStep 2&#xff1a;獲取個人TokenStep 3&#xff1a;通過git協議獲取代碼Step 4&#xff1a;獲取第三方PR分支 3. 總結 1. 源由 通常來說&#xff0c;GitHub上通常有三種場景&#xff1a; 工程管理…

STM32 UART 錯誤代碼 HAL_UART_ERROR_PE

HAL_UART_ERROR_PE 是STM32 HAL庫&#xff08;硬件抽象層庫&#xff09;中UART&#xff08;通用異步收發傳輸器&#xff09;模塊定義的一個錯誤碼&#xff0c;表示“Parity Error”&#xff08;奇偶校驗錯誤&#xff09;。當UART通信過程中檢測到奇偶校驗不匹配時&#xff0c;會…

自動化噴涂生產線方案三

本文介紹自動化噴涂生產線的另外一種方案&#xff0c;單工作站方案&#xff0c;單工作站配置一臺機械臂和一套除塵柜&#xff0c;代替一個工位完成噴涂工藝&#xff0c;其工作原理簡要介紹如下。 一套單工作站的主要組成設備有&#xff0c;10kg負載機械臂一臺主要負責噴涂工藝&…

源碼講解kafka 如何使用零拷貝技術(zero-copy)

前言 kafka 作為一個高吞吐量的分布式消息系統,廣泛應用與實時應用場景中。為了實現高效的數據傳輸,kafka使用了零拷貝技術(zero-copy)顯著提高了性能。本文將詳細講解 Kafka 如何利用零拷貝技術優化數據傳輸。 什么是零拷貝 零拷貝技術目的是減少數據傳輸的效率。在傳統…