单元测试必备:Asp.Net Core代码覆盖率实战,打造可靠应用 !
引言
在前几章我们深度讲解了单元测试和集成测试的基础知识,这一章我们来讲解一下代码覆盖率
,代码覆盖率是单元测试运行的度量值
,覆盖率通常以百分比表示,用于衡量代码被测试覆盖的程度,帮助开发人员评估测试用例的质量和代码的健壮性。常见的覆盖率包括语句覆盖率(Line Coverage
)、分支覆盖率(Branch Coverage
)、路径覆盖率(Path Coverage
)等,不同类型的覆盖率可以帮助开发人员更全面地了解测试用例对代码的覆盖情况,从而改进测试策略和提高代码质量。
核心组件
本文介绍如何通过 Coverlet
在单元测试中使用代码覆盖率和使用 ReportGenerator
生成报表。
什么是Coverlet
?
Coverlet
是GitHub
上的开源项目,可为C#
提供跨平台代码覆盖率框架,Coverlet
是.NET Foundation
的一部分,Coverlet
收集Cobertura
覆盖率测试运行数据,用于生成报表。
什么是ReportGenerator
?
ReportGenerator
将由Cobertura
生成的覆盖率报表转换为各种格式的用户可读的报表。
代码覆盖率实战
我们在之前的项目中创建了Sample.Api
和Sample.Repository
用作我们单元测试和集成测试的Demo
项目,接下来我们用这个项目来做一下单元测试覆盖。
- 创建
xUnit
测试项目
然后看一下csproj
的XML
文件
<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-rate
和branch-rate
分别表示语句覆盖率和分支覆盖率,均为 0.5,表示被测试覆盖的比例为 50%。lines-covered
和lines-valid
分别表示被覆盖的代码行数和总代码行数。branches-covered
和branches-valid
分别表示被覆盖的分支数和总分支数。- 在具体的类和方法级别,提供了各自的覆盖率、复杂度等信息,以及每行代码的覆盖情况(
hits
表示执行次数,branch
表示是否为分支语句,condition-coverage
表示条件覆盖率)。
生成报告
上面提到了coverlet.collector
是用来收集单元测试的指标的真正的报告是用 ReportGenerator
生成。
第一步要将 ReportGenerator
NuGet
包安装为 .NET
全局工具
dotnet tool install -g dotnet-reportgenerator-globaltool
有很多种生成报告的方法如 命令行,添加netconfig等大家可以自行选择
下面用命令行来演示一下
导航到coverage.cobertura.xml
xml 报告文件下
reportgenerator -reports:"coverage.cobertura.xml" -targetdir:"coveragereport" -reporttypes:html
输出:
查看测试报告:
我的路径:
TestResults\b5595744-2bb9-42ab-8c2e-60d544b4b04f\coveragereport
最后
通过创建测试项目并使用 Coverlet
进行代码覆盖率统计,我们可以得到详细的覆盖率报告。生成的 coverage.cobertura.xml
文件提供了各种指标和数据,如语句覆盖率、分支覆盖率等,帮助开发团队评估代码的测试覆盖情况。
随后,通过 ReportGenerator
工具生成报表,我们可以将覆盖率数据转换为易读的报表形式,帮助团队更直观地了解测试覆盖情况,进一步优化测试策略和提高代码质量。
通过以上实践,我们能够更有效地利用代码覆盖率工具,提升单元测试的质量和效率,从而构建更健壮的软件系统。
欢迎关注笔者公众号一起学习交流,获取更多有用的知识~
单元测试必备:Asp.Net Core代码覆盖率实战,打造可靠应用 !的更多相关文章
- 【无私分享:ASP.NET CORE 项目实战(第十四章)】图形验证码的实现
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 很长时间没有来更新博客了,一是,最近有些忙,二是,Core也是一直在摸索中,其实已经完成了一个框架了,并且正在准备在生产环境中 ...
- 【无私分享:ASP.NET CORE 项目实战(第十三章)】Asp.net Core 使用MyCat分布式数据库,实现读写分离
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 MyCat2.0版本很快就发布了,关于MyCat的动态和一些问题,大家可以加一下MyCat的官方QQ群:106088787.我 ...
- [转]【无私分享:ASP.NET CORE 项目实战(第十四章)】图形验证码的实现
本文转自:http://www.cnblogs.com/yuangang/p/6000460.html 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 很长时间没有来更新博客 ...
- Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
- Asp.Net Core 项目实战之权限管理系统(0) 无中生有
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
- Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
- Asp.Net Core 项目实战之权限管理系统(2) 功能及实体设计
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
- Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
- Asp.Net Core 项目实战之权限管理系统(5) 用户登录
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
- Asp.Net Core 项目实战之权限管理系统(6) 功能管理
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
随机推荐
- moviepy 官方网址
https://zulko.github.io/moviepy/ Gitee 说我有违规信息 醉了 { title: "moviepy", url: "https://z ...
- Idea编译/运行Java程序慢
修改前: 修改后: 参考: https://www.jjput.com/archives/macbookpro14m1mavenslowcompilation 问题 JDK尽量不要换版本 class ...
- 适合新手练习的python开源经典源码
一 前记 python学习离不开三要素: A.基础知识要熟悉 B. 练习源码要够量 C.实战项目要跟上 二 链接 书本的基础就看几本书就可以了,这里给出源码练习的经典开源源码: 该链接集合了pytho ...
- Python isinstance() 函数含义及用法解析
描述 isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type(). isinstance() 与 type() 区别: type() 不会认为子类是一种父类类型,不考虑继承关 ...
- 逆向通达信Level-2 续八 (BackTrace, Trace任意TdxW.exe内部函数, Breakin)
TdxW kun anti-debugging, i debug you without a debugger. 添加bt命令,BackTrace 下图是hack某一个函数后使用bt命令进行Trace ...
- 安装libevent
1.在libevent官网(http://libevent.org/)上下载压缩包(我下载的是libevent-2.1.8-stable.tar.gz) 2.解压压缩包:tar -zxvf libev ...
- 使用docker-compose管理freeswitch容器
概述 之前的文章我们介绍过如何将freeswitch做成docker镜像,也使用命令行模式正常启动了fs的docker容器. 但是当我们需要同时管理多个docker容器的时候,还是使用docker-c ...
- 三维模型3DTile格式轻量化压缩的遇到常见问题与处理方法分析
三维模型3DTile格式轻量化压缩的遇到常见问题与处理方法分析 三维模型的轻量化压缩是一项技术挑战,特别是在处理复杂的3DTile格式时.下面列举了一些处理过程中可能遇到的常见问题以及相应的处理方法: ...
- Salesforce LWC学习(四十九) RefreshView API实现标准页面更新,自定义组件自动捕捉更新
本篇参考: https://developer.salesforce.com/docs/platform/lwc/guide/data-refreshview.html https://develop ...
- CMake使用Boost
cmake_minimum_required(VERSION 2.8) set(Boost_INCLUDE_DIR /usr/local/src/boost_1_46_1) set(Boost_LIB ...