您是否已覆盖?使用 NCover 衡量 .NET 代码质量





2.00/5 (1投票)
本文介绍如何使用 NCover 衡量自动化测试的有效性,展示如何跟踪覆盖率随时间的变化,并提出提高测试有效性的策略。
本文将向您介绍 NCover,这是 .NET 框架首屈一指的代码覆盖率工具。自 4 年前创建以来,NCover 已被全球超过 100,000 名开发人员使用。
代码质量是开发人员和软件架构师几十年来一直在努力解决的永恒主题。普遍的智慧是,软件缺陷发现得越早,修复成本就越低。
大多数软件开发方法都侧重于在开发周期的早期尽可能多地发现缺陷。敏捷开发是提高软件质量的绝佳方法。敏捷开发的核心原则之一是构建一个自动化测试库,代码每次更改时都必须通过这些测试。开发团队多年来一直采用这种方法。事实证明,它在提高质量的同时,对小型和大型团队都有效。
假设您正在使用敏捷方法,并且已经编写了一套自动化测试。一旦开始分析结果,就会出现一些显而易见的问题:
- 我的代码有哪些部分未经过测试?
- 如何减少未经测试的代码量?
- 我的代码随时间推移是变得更具测试性还是更不具测试性?
对于软件开发团队来说,回答这些问题可能意味着一个高质量项目与一场灾难之间的区别。 NCover 可以回答这些问题。
代码覆盖率分析在运行单元测试时应用于代码,它向开发人员显示了测试执行了其代码的哪些部分,并提供了单元测试渗透率的具体衡量标准。通过跟踪这些统计数据随时间的变化,您可以获得开发周期中代码质量的具体衡量标准。
什么是代码覆盖率?
代码覆盖率分析是衡量正在运行的程序代码被执行了多少。具体来说,代码覆盖率通常显示每行代码的执行次数。代码覆盖率分析通常被描述为显示每行代码的执行次数,但实际上存在许多覆盖率指标,如函数覆盖率、语句覆盖率、分支覆盖率、退出点覆盖率和条件覆盖率。NCover 支持序列点覆盖率(一种特殊的语句覆盖率)和分支覆盖率。
NCover 对覆盖率的定义如下:
- 序列点覆盖率 – 序列点覆盖率关注程序中调试器可以暂停执行的点的数量。通常这对应于一行代码,但有些编译器允许您在表达式中的多个位置暂停,因此序列点可能略高于行或语句的数量。
- 分支覆盖率 – 分支覆盖率关注方法的执行路径,并确定代码可以做出“分支”决策的数量。这对应于 if、while、for、foreach、switch 等语句。分支点用于将方法分割成连续的代码块。然后使用这些代码块来计算覆盖率。
那么,为什么会使用这两种覆盖率形式呢?
分支覆盖率是更准确的覆盖率度量,因为它考虑了方法的复杂性。由于分支覆盖率是从底层操作码生成的,因此它通常不能干净地映射到源代码。这意味着很难根据分支覆盖率报告来确定如何编写测试以提高覆盖率。另一方面,由于序列点直接引用调试符号,因此很容易将序列点与源代码关联起来。关键在于:
- 使用分支覆盖率作为衡量质量的标准,但
- 使用序列点覆盖率来确定哪些代码语句需要更多测试。
何时应使用代码覆盖率?
简而言之,越早越好。迭代开发环境的核心是持续集成服务器。每次开发人员将代码提交到版本控制系统时(或按计划定期进行),构建服务器都应签出最新代码,对产品进行完整构建,运行测试套件,并报告测试成功/失败和代码覆盖率指标。如果您还没有使用持续构建服务器,ThoughtWorks 的 CruiseControl.NET 是一个绝佳的(免费)选择。持续构建过程有助于及早检测代码错误,代码覆盖率的即时报告也向团队中的每个人清楚地表明测试质量是在提高还是在下降。
如何实现代码覆盖率?
NCover 在测试运行时通过在后台对代码进行插桩来进行分析。如果使用 NUnit 作为单元测试工具,只需在 NUnit 命令行前面加上 NCover 命令。
NUnit 命令行
nunit-console MyTests.dll
带 NCover 的 NUnit
NCover.Console nunit-console MyTests.dll
生成代码覆盖率数据很容易,但分析才是真正开始改进测试的地方。我们随 NCover 一起提供 NCoverExplorer,用于此目的。NCoverExplorer 会突出显示未覆盖的代码行,并对您的覆盖率数据进行统计分析。它甚至可以运行程序并为您收集覆盖率数据,因此许多开发人员从未接触过 NCover 的命令行版本。NCover 还包括一个 HTML 报告功能,供希望直接从其持续集成服务器生成包括突出显示代码的分析报告的团队使用。