.NET Code Coverage

閱讀時間約 5 分鐘

Code Coverage 是什麼?

程式碼覆蓋率(Code Coverage)是一種軟體測試指標,用百分比表示,數值越高越好。

  1. 100% 的意思是「整個程式碼在測試中都被執行到」。
  2. 80% 的意思是「有80%的程式碼在測試中被執行到,還有20%的程式碼沒有被測試覆蓋」。
  3. 20% 的意思是「只有20%的程式碼在測試中被執行到,有80%的程式碼沒有經過測試」。

常見 Unit Test 在 80% 認定為達到基本標準;90% 算是良好。不過這沒有標準,不同公司都有不同的作法,有的公司甚至完全不寫測試。達到 100% 的覆蓋率需要耗費相當多的時間,就看技術人員評估這樣做是不是值得。

我認為用 SonarQube 的 Clean as You Code 的方式改善程式碼覆蓋率,會是比較務實的作法。也就是每次修改、新增的程式碼都通過 SonarQube 的檢查。之前的程式碼就暫時不管,但是隨著不斷的修改程式,如果有碰到之前的程式,就順便修改,加上相關的測試程式,通過 SonarQube 的檢查。專案的程式就會逐漸改善,程式碼覆蓋率會逐漸的提升。

Coverlet

GitHub 有 Coverlet 專案,此專案可建立 Code Coverage 報告。

https://github.com/coverlet-coverage/coverlet

Coverlet 有以下使用方式(多選一):

  1. VSTest engine integration - 當 Visual Studio Test Platform 執行時,找到 Coverlet Data Collector,然後由 Coverlet 負責建立 Code Coverage 報告。(功能比較少)
  2. MSBuild task integration - 整合到 MSBuild 上,也就整合到 dotnet build 的流程上。
  3. As a .NET Global tool (supports standalone integration tests) - 一個 Binary 執行檔,根據測試專案的 Assembly 建立 Code Coverage 報告。

Usage

VSTest engine integration

安裝以下 package:

dotnet add package coverlet.collector

產生 Code Coverage 報告:

dotnet test --collect:"XPlat Code Coverage"

報告會出現在類似以下的目錄(TestResults\{GUID}\coverage.cobertura.xml):

C:\\git\\coverlet\\Documentation\\Examples\\VSTest\\HelloWorld\\XUnitTestProject1\\TestResults\\bc5e983b-d7a8-4f17-8c0a-8a8831a4a891\\coverage.cobertura.xml

MSBuild task integration

安裝以下 Package:

dotnet add package coverlet.msbuild

建立 Code Coverage 報告:(Test project 會建立 coverage.json 報告)

dotnet test /p:CollectCoverage=true

As a .NET Global tool

透過 dotnet tool 安裝 coverlet 執行檔:

dotnet tool install --global coverlet.console

建立 Code Coverage 報告:

coverlet /path/to/test-assembly.dll --target "dotnet" --targetargs "test /path/to/test-project --no-build"

註:一定要指定參數 --no-build,否則會沒有資料。

MSBuild task integration 進階使用

Threshold

line, branch, method coverage 任何一項低於 80% 時會報錯:

dotnet test /p:CollectCoverage=true /p:Threshold=80

只檢測 line coverage,當低於 80% 時報錯:

dotnet test /p:CollectCoverage=true /p:Threshold=80 /p:ThresholdType=line

個別指定 coverage:

dotnet test /p:CollectCoverage=true /p:Threshold=\\"80,100,70\\" /p:ThresholdType=\\"line,branch,method\\"

根據 Attributes 排除

dotnet test /p:CollectCoverage=true /p:ExcludeByAttribute="Obsolete,GeneratedCodeAttribute,CompilerGeneratedAttribute"

根據 Source Files 排除

dotnet test /p:CollectCoverage=true /p:ExcludeByFile=\\"**/dir1/class1.cs,**/dir2/*.cs,**/dir3/**/*.cs\\"
專注於 C#, DevOps 的工程師
留言0
查看全部
發表第一個留言支持創作者!
本文介紹瞭如何在C#專案中建立和使用packages.lock.json檔案,以確保每次執行dotnet restore時都可以獲得相同的packages集合。我們還討論了dotnet restore抓取不同packages的原因,並提供了相關的解決方案。
Semgrep 是一個功能強大的 SAST 工具,可以幫助開發人員早期發現程式碼中的安全問題,本文介紹如何將 Semgrep 整合到 GitLab Pipeline 以進行 SAST 掃描。
說明 Dockerfile 的 ENTRYPOINT、CMD 指令。
Docker network 會影響 Container: 是否可以透過網路存取其它的 Container。 是否可以存取網際網路(Internet)。 是否可以存取實體網路(Physical Network)。 Docker bridg
CI/CD Pipeline 是一連串自動化步驟,可以測試軟體,部屬應用程式。但實際上到底要做什麼事情呢?可以從 GitLab 的 Auto DevOps 了解。 Auto Dependency Scanning 掃描第三方函式庫的安全性漏洞。參考下圖: 如果是 .NET 6 可以用以下指令掃描:
Prometheus 提供 PromQL 讓我們對 metrics 查詢,可以查出最近 1 小時內的請求成功率,最近 30 分鐘內的請求延遲等等的資訊,下面用範例說明。 Request Per Second 此範例查詢「每秒的請求數量」,我用 Traefik 當作範例說明。 這幫我們得出以下結果:
本文介紹瞭如何在C#專案中建立和使用packages.lock.json檔案,以確保每次執行dotnet restore時都可以獲得相同的packages集合。我們還討論了dotnet restore抓取不同packages的原因,並提供了相關的解決方案。
Semgrep 是一個功能強大的 SAST 工具,可以幫助開發人員早期發現程式碼中的安全問題,本文介紹如何將 Semgrep 整合到 GitLab Pipeline 以進行 SAST 掃描。
說明 Dockerfile 的 ENTRYPOINT、CMD 指令。
Docker network 會影響 Container: 是否可以透過網路存取其它的 Container。 是否可以存取網際網路(Internet)。 是否可以存取實體網路(Physical Network)。 Docker bridg
CI/CD Pipeline 是一連串自動化步驟,可以測試軟體,部屬應用程式。但實際上到底要做什麼事情呢?可以從 GitLab 的 Auto DevOps 了解。 Auto Dependency Scanning 掃描第三方函式庫的安全性漏洞。參考下圖: 如果是 .NET 6 可以用以下指令掃描:
Prometheus 提供 PromQL 讓我們對 metrics 查詢,可以查出最近 1 小時內的請求成功率,最近 30 分鐘內的請求延遲等等的資訊,下面用範例說明。 Request Per Second 此範例查詢「每秒的請求數量」,我用 Traefik 當作範例說明。 這幫我們得出以下結果:
你可能也想看
Thumbnail
「設計不僅僅是外觀和感覺。設計是其運作的方式。」 — Steve Jobs 身為一個獨立文案,許多人會以為我們的生活只需要面對電腦,從無到有,用精巧的文字填滿空白的螢幕,呈現心目中獨具風格的作品。 ——有的時候可以如此,但其實這是我們夢寐以求的偶發日常。 更多的時候,白天的工作時間總被各種繁雜
Thumbnail
台股、美股近期明顯回檔,市場敘事發生改變,壞消息一樁接一樁出現,下一步該怎麼走呢?本文將探討近期的宏觀經濟事件,並分享個人的操作思考。
Thumbnail
NET 1Q24 財報結果,整體 Top line 營收大致合於市場預期,並未超出市場預期太多、也低於我 model 預期,而進一步觀察 1Q24 財報細項,暗示未來營收成長的幾個關鍵指標中,雖然 RPO 加速,但包括 cRPO, Billings 都出現劇烈減速,雙雙反應出客戶當前的保守態度。
「基隆東岸廣場」爆發產權之爭,基隆東岸廣場不只是海港地標,更是基隆房地產最具指標的地段,附近除了廟口夜市,還有崁仔頂漁市場及郵輪港口人潮,不但可提供遊客停車空間,也是北台灣熱門的觀光景點, 基隆市政府和NET爆發東岸廣場之爭,8年前大日開發公司向市府簽約承租基隆東岸廣場,當時大日開發公司也和NET
Thumbnail
農曆新年即將來臨,NET在今年的公益活動中再次展現其溫暖與關懷,特別捐贈80萬元提貨券給台北家扶中心,讓家扶的孩子們得以穿上嶄新的衣物,迎接新一年的到來。
Thumbnail
HTTP伺服器端 package main import ( "net/http" ) type Refer struct { handler http.Handler refer string } //實現中介軟體邏輯​ func (this *Refer) ServeHTTP(
當我們是一個API專案,我們可能會有 Swagger , 我們有Swagger之後,可能又是用  NJsonSchema NSwag.AspNetCore NSwag.Core 此時在我們的專案因為有了這三個存在,這是在今日時都還有的問題 我們會跳出錯誤, 偵測到 Microsofe
.NET MVC線上教學 — MIS2000Lab 課程大綱 與 試聽 自從我把影片上線以來,已經過了三年。 一路不斷的補充,現在的課程已經從「基礎的75小時」一路延伸到「完整版,超過90小時」 通常是學員發問,我再做增補(別的學員有問題,可能您也會遇見、也想學) 1–3 撰寫第一個類別檔。
.NET Core — WebAPI + JWT 會員登入 與 權限管理 這是一門「 **純** 」後端的課程,所以不包含前端JS與HTML。 不建議「完全沒基礎」的朋友參與,擔心您跟不上。 提供試聽,所以沒有退費機制,請審慎考慮! 2C. JWT如何透過 Postman開始測試,片長 02:54
Thumbnail
不知道有多少人在關注CloudFlare呢?我們就來看看這一年2020 Q4的亮眼表現,但是緊接而來的營收成長速度正常下降,各位覺得還可以保持現在這樣的高估值嗎?
Thumbnail
「設計不僅僅是外觀和感覺。設計是其運作的方式。」 — Steve Jobs 身為一個獨立文案,許多人會以為我們的生活只需要面對電腦,從無到有,用精巧的文字填滿空白的螢幕,呈現心目中獨具風格的作品。 ——有的時候可以如此,但其實這是我們夢寐以求的偶發日常。 更多的時候,白天的工作時間總被各種繁雜
Thumbnail
台股、美股近期明顯回檔,市場敘事發生改變,壞消息一樁接一樁出現,下一步該怎麼走呢?本文將探討近期的宏觀經濟事件,並分享個人的操作思考。
Thumbnail
NET 1Q24 財報結果,整體 Top line 營收大致合於市場預期,並未超出市場預期太多、也低於我 model 預期,而進一步觀察 1Q24 財報細項,暗示未來營收成長的幾個關鍵指標中,雖然 RPO 加速,但包括 cRPO, Billings 都出現劇烈減速,雙雙反應出客戶當前的保守態度。
「基隆東岸廣場」爆發產權之爭,基隆東岸廣場不只是海港地標,更是基隆房地產最具指標的地段,附近除了廟口夜市,還有崁仔頂漁市場及郵輪港口人潮,不但可提供遊客停車空間,也是北台灣熱門的觀光景點, 基隆市政府和NET爆發東岸廣場之爭,8年前大日開發公司向市府簽約承租基隆東岸廣場,當時大日開發公司也和NET
Thumbnail
農曆新年即將來臨,NET在今年的公益活動中再次展現其溫暖與關懷,特別捐贈80萬元提貨券給台北家扶中心,讓家扶的孩子們得以穿上嶄新的衣物,迎接新一年的到來。
Thumbnail
HTTP伺服器端 package main import ( "net/http" ) type Refer struct { handler http.Handler refer string } //實現中介軟體邏輯​ func (this *Refer) ServeHTTP(
當我們是一個API專案,我們可能會有 Swagger , 我們有Swagger之後,可能又是用  NJsonSchema NSwag.AspNetCore NSwag.Core 此時在我們的專案因為有了這三個存在,這是在今日時都還有的問題 我們會跳出錯誤, 偵測到 Microsofe
.NET MVC線上教學 — MIS2000Lab 課程大綱 與 試聽 自從我把影片上線以來,已經過了三年。 一路不斷的補充,現在的課程已經從「基礎的75小時」一路延伸到「完整版,超過90小時」 通常是學員發問,我再做增補(別的學員有問題,可能您也會遇見、也想學) 1–3 撰寫第一個類別檔。
.NET Core — WebAPI + JWT 會員登入 與 權限管理 這是一門「 **純** 」後端的課程,所以不包含前端JS與HTML。 不建議「完全沒基礎」的朋友參與,擔心您跟不上。 提供試聽,所以沒有退費機制,請審慎考慮! 2C. JWT如何透過 Postman開始測試,片長 02:54
Thumbnail
不知道有多少人在關注CloudFlare呢?我們就來看看這一年2020 Q4的亮眼表現,但是緊接而來的營收成長速度正常下降,各位覺得還可以保持現在這樣的高估值嗎?