分析C#项目的单元测试覆盖率,提高代码质量
C#覆盖率分析?不就是用工具生成报告吗?VSCode、VS、Rider哪个不能干?真当这是啥高科技?
目录11 个章节
前言
正如我在前一篇介绍 ImageGlider 的文章里预告的那样,这篇同样属于那套「C# + 自动化发布」开发流程的系列分享,继续把踩过的坑和总结的经验都记录下来,大家一起少走弯路。
单元测试的重要性不用我多说了吧?😄
而覆盖率,保证了单元测试的广度和有效性——它能帮助开发者发现遗漏的逻辑分支,避免“测试了但其实没测到”的尴尬场面。
特别是在如今的AI编程时代,完善的测试可以让AI自动验证功能的实现结果
刚好 C# 拥有非常完善的基础设施,这种功能丰富的语言,特别适应 AI 时代,我有预感,dotnet 平台在 AI 时代未来可期😁
要进行覆盖率测试,方法有非常多,一开始我使用了一个第三方工具来生成 HTML 报告,后面发现 VSCode、VS、Rider 这些 IDE 里都可以🤣
C#工具库
今年我陆续用 C# 开发了不少工具
涵盖的范围也不小
感觉都可以组成一个小工具库了
这些工具分别是:
依赖
使用 dotnet-reportgenerator-globaltool 工具可以生成 HTML 报告
dotnet tool install -g dotnet-reportgenerator-globaltool
测试覆盖率
以 ImageGlider 项目为例
使用以下命令分析项目的单元测试覆盖率,并生成测试报告网页
# 生成测试覆盖率报告
dotnet test --collect:"XPlat Code Coverage" --results-directory ./temp/TestResults
# 使用 reportgenerator 生成HTML报告
reportgenerator -reports:"./temp/TestResults/*/coverage.cobertura.xml" -targetdir:"./TestResults/CoverageReport" -reporttypes:Html
生成的测试报告路径示例
temp\TestResults\4eaa9684-a3b6-4b2a-81ac-d75e1e375e4b\coverage.cobertura.xml
直接打开这个网页就可以看到覆盖率的报告了
HTML 报告
非常详细
总览

查看详细覆盖率
这里可以调整分组模式
默认是 By assembly
可以改成 By namespace ,命名空间模式又分 level 1 和 level 2
其中 Line coverage 和 Branch coverage 都是可以筛选的
项目大点的话,建议选择 By Namespace level 2 ,比较直观

方法的测试覆盖率
点击具体的类,跳转到方法覆盖率页面

这里可以看到哪个方法没写测试
或者哪些 case 是没有覆盖到的
总之非常方便

VSCode
在 tests 目录上右键,运行覆盖率测试
很快就会在各个目录上出现类似手机电池的图标(好可爱😄)
可以很方便地看到各个项目、各个代码文件的测试覆盖率

Rider
我是先在 VSCode 里发现的
我就在想
VSCode 都有的功能,老牌 C# IDE 的这个 Rider,应该更加有吧
结果测了一下,还真有
菜单 Tests -> Cover Unit Tests
这个功能也不错,还能导出 HTML 什么的

小结
总之,通过dotnet-reportgenerator-globaltool和VSCode、VS、Rider等IDE的内置功能,我们可以轻松分析C#项目的单元测试覆盖率,帮助提升代码质量和测试有效性。
_EOF_
分析C#项目的单元测试覆盖率,提高代码质量
- 本文作者:
- 程序设计实验室
- 版权声明:
- 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
相关文章
上位机开发之假装有设备,使用 C# 模拟串口设备
用C#模拟串口设备?这年头还学这种过时技术?不过行吧,至少比某些只会玩AI的卷王强点。搞搞清楚协议文档,装个破com0com驱动,写点死板代码应付下调试需求。至于什么物联网平台、工业控制?那是别人该干的事,我随便搞搞就够了。
2025-08-26 · C# · 约 1 分钟
C#学习(三)深入理解委托、匿名方法和-Lambda-表达式
前言 lambda的概念建立在委托的基础上,委托,实现了类型安全的回调方法。在.NET 中回调无处不在,所以委托也无处不在,事件模型建立在委托机制上,Lambda 表达式本质上就是一种匿名委托。本文中将完成一次关于委托的旅行,全面阐述委托及其核心话题,逐一梳理委托、委托链、事件、匿名方法和 Lambda 表达式。 委托的定义 了解委托,从其定义开始,通常一个委托被声明为: public deleg
2021-12-18 · C# · 约 1 分钟
C#爬虫开发小结
前言 2023年以来一直很忙,临近春节,各种琐事更多,但鸽了太久没写文章总是不舒坦,忙中偷闲来记录下最近用C#写爬虫的一些笔记。 爬虫一般都是用Python来写,生态丰富,动态语言开发速度快,调试也很方便 但是 我要说但是,动态语言也有其局限性,笔者作为老爬虫带师,几乎各种语言都搞过,现在这个任务并不复杂,用我最喜欢的C#做小菜一碟~ 开始 之前做 OneCat 项目的时候,最开始的数据采集模块,
2023-01-24 · C# · 约 1 分钟
C#学习(二)匿名方法和委托的多种使用方式
前言 上次简单介绍了委托的概念和使用,今天继续,并且引入匿名方法的概念,匿名方法在很多语言里面都有,比如Python、js、java8,尤其js,前端小伙伴可能深受js回调地狱之苦,这里面匿名方法功不可没。 js的匿名方法就像这样: 这还没用lambda,因为我想下篇再介绍lambda。 document.querySelector('.btn').onclick = function () {
2021-12-18 · C# · 约 1 分钟
讨论
共 0 条加载评论中…