当前位置: 欣欣网 > 码农

单元测试必备:Asp.Net Core代码覆盖率实战,打造可靠应用!

2024-04-24码农

引言

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

核心组件

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

什么是 Coverlet

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

什么是 ReportGenerator ?

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

代码覆盖率实战

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

  • 创建 xUnit 测试项目 然后看一下 csproj XML 文件

  • <ItemGroup>
    <PackageReferenceInclude="coverlet.collector"Version="6.0.0" />
    <PackageReferenceInclude="Microsoft.NET.Test.Sdk"Version="17.8.0" />
    <PackageReferenceInclude="xunit"Version="2.5.3" />
    <PackageReferenceInclude="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 [3] 等大家可以自行选择

    下面用命令行来演示一下

    导航到 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 工具生成报表,我们可以将覆盖率数据转换为易读的报表形式,帮助团队更直观地了解测试覆盖情况,进一步优化测试策略和提高代码质量。

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

  • 单元测试代码覆盖率 [4]

  • 本文完整源代码 [5]

  • 参考资料

    [1]

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

    [2]

    ReportGenerator : https://github.com/danielpalme/ReportGenerator

    [3]

    netconfig: https://dotnetconfig.org/

    [4]

    单元测试代码覆盖率: https://learn.microsoft.com/zh-cn/dotnet/core/testing/unit-testing-code-coverage?tabs=windows

    [5]

    本文完整源代码: https://github.com/Dong-Ruipeng/dotNetParadise-xUnit