引言

在前几章我们深度讲解了单元测试和集成测试的基础知识,这一章我们来讲解一下代码覆盖率,代码覆盖率是单元测试运行的度量值,覆盖率通常以百分比表示,用于衡量代码被测试覆盖的程度,帮助开发人员评估测试用例的质量和代码的健壮性。常见的覆盖率包括语句覆盖率(Line Coverage)、分支覆盖率(Branch Coverage)、路径覆盖率(Path Coverage)等,不同类型的覆盖率可以帮助开发人员更全面地了解测试用例对代码的覆盖情况,从而改进测试策略和提高代码质量。

核心组件

本文介绍如何通过 Coverlet 在单元测试中使用代码覆盖率和使用 ReportGenerator 生成报表。

什么是Coverlet

CoverletGitHub 上的开源项目,可为 C# 提供跨平台代码覆盖率框架,Coverlet.NET Foundation 的一部分,Coverlet 收集 Cobertura 覆盖率测试运行数据,用于生成报表。

什么是ReportGenerator?

ReportGenerator 将由 Cobertura 生成的覆盖率报表转换为各种格式的用户可读的报表。

代码覆盖率实战

我们在之前的项目中创建了Sample.ApiSample.Repository用作我们单元测试和集成测试的Demo项目,接下来我们用这个项目来做一下单元测试覆盖。

  • 创建xUnit测试项目

    然后看一下csprojXML文件
  <ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="xunit" Version="2.5.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.3" />
</ItemGroup>

从上面可以看出xUnit的测试项目已经默认对coverlet.collector添加了支持

我们在讲解在单元测试中使用依赖注入时,用Sample.Repository做的单元测试,我们把之前的代码Copy一份,到新的测试项目,添加和讲解依赖注入时一样的配置。

然后添加对我们Sample.Repository的项目引用

NuGet\Install-Package Xunit.DependencyInjection -Version 9.1.0
NuGet\Install-Package Xunit.DependencyInjection.Logging -Version 9.0.0

可以看到我们项目基本成型了,但是Copy过来的代码还是我们dotNetParadise.DependencyInjection测试依赖注入时那个类库。

一个小tips

鼠标点击我们的测试项目dotNetParadise.CodeCoverage->右键->同步命名空间

可以看到我们的命名空间已经被正确替换

同步命名空间功能

  • 使用时机: 你想要通过将文件拖动到新文件夹重构部分解决方案。

  • 操作原因: 你想要确保你的命名空间中的新文件夹结构保持最新。

开始统计

我们可以通过CMD命令进入测试项目类库的内

然后执行下面这个命令

dotnet test --collect:"XPlat Code Coverage"

"XPlat Code Coverage" 参数是与 Coverlet 中的数据收集器对应的易记名称。 此名称是必需的,但不区分大小写。 若要使用 .NET 的内置代码覆盖率数据收集器,请使用"Code Coverage"

看一下执行完控制台输出

通过控制台反馈我们得知了,生成了一个附件路径在

~\TestResults\2515646c-5845-4bfb-ae14-7e0bf4617b84\coverage.cobertura.xml

作为 dotnet test 运行的一部分,生成的 coverage.cobertura.xml 文件输出到 TestResults 目录 。 该 XML 文件包含结果。 这是一个依赖于 .NET CLI 的跨平台选项,非常适用于不可使用 MSBuild 的生成系统。

简单解读一下

cobertura.xml代码覆盖率报告,提供了关于代码单元测试覆盖率的详细信息。其中包含了各种指标和数据,如以下几点:

  • line-ratebranch-rate 分别表示语句覆盖率和分支覆盖率,均为 0.5,表示被测试覆盖的比例为 50%。
  • lines-coveredlines-valid 分别表示被覆盖的代码行数和总代码行数。
  • branches-coveredbranches-valid 分别表示被覆盖的分支数和总分支数。
  • 在具体的类和方法级别,提供了各自的覆盖率、复杂度等信息,以及每行代码的覆盖情况(hits 表示执行次数,branch 表示是否为分支语句,condition-coverage 表示条件覆盖率)。

生成报告

上面提到了coverlet.collector是用来收集单元测试的指标的真正的报告是用 ReportGenerator生成。

第一步要将 ReportGenerator NuGet 包安装为 .NET 全局工具

dotnet tool install -g dotnet-reportgenerator-globaltool

有很多种生成报告的方法如 命令行,添加netconfig等大家可以自行选择

下面用命令行来演示一下

导航到coverage.cobertura.xmlxml 报告文件下

reportgenerator -reports:"coverage.cobertura.xml" -targetdir:"coveragereport" -reporttypes:html

输出:

查看测试报告:

我的路径:

TestResults\b5595744-2bb9-42ab-8c2e-60d544b4b04f\coveragereport

最后

通过创建测试项目并使用 Coverlet 进行代码覆盖率统计,我们可以得到详细的覆盖率报告。生成的 coverage.cobertura.xml 文件提供了各种指标和数据,如语句覆盖率、分支覆盖率等,帮助开发团队评估代码的测试覆盖情况。

随后,通过 ReportGenerator 工具生成报表,我们可以将覆盖率数据转换为易读的报表形式,帮助团队更直观地了解测试覆盖情况,进一步优化测试策略和提高代码质量。

通过以上实践,我们能够更有效地利用代码覆盖率工具,提升单元测试的质量和效率,从而构建更健壮的软件系统。

欢迎关注笔者公众号一起学习交流,获取更多有用的知识~

单元测试必备:Asp.Net Core代码覆盖率实战,打造可靠应用 !的更多相关文章

  1. 【无私分享:ASP.NET CORE 项目实战(第十四章)】图形验证码的实现

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 很长时间没有来更新博客了,一是,最近有些忙,二是,Core也是一直在摸索中,其实已经完成了一个框架了,并且正在准备在生产环境中 ...

  2. 【无私分享:ASP.NET CORE 项目实战(第十三章)】Asp.net Core 使用MyCat分布式数据库,实现读写分离

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 MyCat2.0版本很快就发布了,关于MyCat的动态和一些问题,大家可以加一下MyCat的官方QQ群:106088787.我 ...

  3. [转]【无私分享:ASP.NET CORE 项目实战(第十四章)】图形验证码的实现

    本文转自:http://www.cnblogs.com/yuangang/p/6000460.html 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 很长时间没有来更新博客 ...

  4. Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  5. Asp.Net Core 项目实战之权限管理系统(0) 无中生有

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  6. Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  7. Asp.Net Core 项目实战之权限管理系统(2) 功能及实体设计

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  8. Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  9. Asp.Net Core 项目实战之权限管理系统(5) 用户登录

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  10. Asp.Net Core 项目实战之权限管理系统(6) 功能管理

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

随机推荐

  1. vscode 格式化 vue 等文件的 配置 eslint vetur prettier Beautify

    需求 自动格式化需求 多行回车 合并一行,去分号 最后一个逗号,自动删除,符合eslint 结果 虽然能用了,但是 百度好几个方案,也不知道哪个对哪个,太忙没时间弄了. 配置文件记录 eslint 得 ...

  2. Linux 常见缩写命令英文全称

    linux 命令参考Linux 命令大全: https://man.linuxde.net/ awk = "Aho Weiberger and Kernighan" 三个作者的姓的 ...

  3. 展会回顾 | 2023元宇宙生态博览会圆满落幕,3DCAT荣获“元宇宙交互技术奖”

    2023年5月10日-5月12日,一场涵盖了元宇宙终端头显.数字文娱.数字艺术.数字运动.数字多媒体展陈设计.数字展厅展馆.科技文旅.夜游演艺.沉浸式KTV/酒吧等多个领域的元宇宙商业盛会--2023 ...

  4. clickhouse使用心得

    clickhouse目前用在实时BI后台,只要数据稳定落库了,出报表很快,临时查询也很快,在使用过程中,对它的一些优点和不足也是深有体会,这里总结一下,不能做到面面俱到,但尽可能详细的介绍实际应用需要 ...

  5. 单目测距那些事儿(上) | 从MobileEye谈起

    单目测距那些事儿(上) | 从MobileEye谈起 全面专业的自动驾驶学习资料:链接 前言 在ADAS领域,有个功能叫自适应巡航控制(Adaptive Cruise Control, ACC). A ...

  6. 提升团队协作效率:欧奥PicHome打造无缝资料共享平台

    1. 引言 在快节奏的工作环境中,团队成员需要快速访问和共享信息.有效的资料共享不仅提高工作效率,还能促进团队协作和创新.然而,许多团队仍在使用传统的文件共享方法,这些方法往往效率低下,难以满足现代工 ...

  7. KingabseES执行计划-分区剪枝(partition pruning)

    概述 分区修剪(Partition Pruning)是分区表性能的查询优化技术 .在分区修剪中,优化器分析SQL语句中的FROM和WHERE子句,以在构建分区访问列表时消除不需要的分区.此功能使数据库 ...

  8. Android常用布局之LinearLayout线性布局和RealtiveLayout相对布局

    LinearLayout最常用的属性: id layout_width layout_height background 外边距:layout_margin:也是有好多方向 layout_margin ...

  9. Python爬虫爬取全球疫情数据并存储到mysql数据库

    思路:使用Python爬虫对腾讯疫情网站世界疫情数据进行爬取,封装成一个函数返回一个    字典数据格式的对象,写另一个方法调用该函数接收返回值,和数据库取得连接后把    数据存储到mysql数据库 ...

  10. Emgucv以及debugVisualizer下载

    1.Emgucv官网 https://www.emgu.com/ Github-- https://github.com/emgucv/ 在release 包中找到对应系统的版本 例如: libemg ...