使用 OpenCover 获取 .NET 测试的代码覆盖率。






4.85/5 (15投票s)
介绍
OpenCover 是一款免费的、开源的、用于 .NET 2.0 及更高版本的代码覆盖率工具,可在 .NET 平台上运行。它支持顺序覆盖、分支覆盖,并提供按测试覆盖的功能。虽然 OpenCover 仅支持命令行,但使用 ReportGenerator 可以可视化丰富的结果 HTML UI。
我们的目标是演示如何使用此实用工具来了解您的测试覆盖率。
背景
OpenCover 目前是 .NET 平台上同类产品中唯一积极开发和维护的开源工具,但它并非第一个,其他一些工具包括:
NCover
- 可能是最知名的 .NET 代码覆盖率商业工具,最初是一个 开源 项目。
Coverage.eye
- 源自微软,曾在 gotdotnet 上提供,该存储库/示例已消失,似乎没有完整的镜像(只有 Wayback Machine 上的文本)。
PartCover
- 这似乎是为了响应 NCover 转向商业化而创建的,尽管它被积极使用,但存在一些限制,例如仅支持 32 位。原始的存储库 已不再由其原始开发人员维护,现在在github 上进行维护。
使用 OpenCover
为 OpenCover 做准备
以下步骤详细介绍了如何从 NuGet 下载 OpenCover(和其他支持的工具)。
OpenCover 可以通过其 bitbucket 镜像进行 zip 或 msi 下载,但为了本文的方便,我们将使用 OpenCover nuget 包。
- 创建新解决方案
- 为该解决方案“启用 NuGet 包还原”。
- 使用“管理解决方案的 NuGet 包”添加以下包:
OpenCover
ReportGenerator
NUnit.Runners
完成后,您应该有一个包含 .nuget 文件夹的解决方案,该文件夹包含一个 packages.config 文件,看起来如下:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="NUnit.Runners" version="2.6.3" />
<package id="OpenCover" version="4.5.1923" />
<package id="ReportGenerator" version="1.9.1.0" />
</packages>
下一步
- 创建一个名为 Sample 的 C# 项目(类库)。
- 创建一个名为 Sample.Test 的 C# 项目(类库),并引用 Sample 项目。
- 使用 NuGet 添加以下包:
NUnit
现在添加一个简单的类和方法,以及一个将执行该方法的测试。
在 Sample 项目中添加以下类:
public class Target
{
public static void DoSomething()
{
try
{
Console.WriteLine("I ran!");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
在 Sample.Test 项目中添加以下类:
using NUnit.Framework;
[TestFixture]
public class TargetTest
{
[Test]
public void DoSomethingTest()
{
Target.DoSomething();
}
}
使用 OpenCover 运行测试
OpenCover 不直接执行您的测试,而是需要执行另一个应用程序来执行您的测试,在这种情况下,我们使用的是 NUnit。
首先,让我们创建一个批处理文件,我们可以从中通过命令行执行我们的测试。
..\..\..\packages\NUnit.Runners.2.6.3\tools\nunit-console.exe sample.test.dll /noshadow
此批处理文件可以添加到 Sample.Test 项目中(将“复制到输出目录”设置为“始终复制”)。
现在我们可以使用 OpenCover 执行此批处理文件,同样,我们可以将其作为批处理文件添加到我们的 Sample.Test 项目中,以便我们可以在命令行上执行它。
..\..\..\packages\OpenCover.4.5.1923\OpenCover.Console.exe -target:runtests.bat -register:user -filter:+[Sample]*
参数是:
-target:
- 用于指定 OpenCover 要执行的目标进程。
-register:user
- 用于注册 OpenCover 用于检测您的程序集的 COM 对象。
-filter:
- 用于控制 OpenCover 将收集哪些程序集的覆盖率数据。该过滤器能够包含和排除程序集和类,实际上与 PartCover 使用的过滤器格式相同。过滤器是 OpenCover 中更复杂的功能之一,更详细的信息可在 OpenCover 随附的文档或使用情况 Wiki 中找到。
执行后,OpenCover 将生成一个 XML 文件(默认为 results.xml),其中包含与该测试运行相关的所有数据。为了可视化这些数据,我们可以使用 ReportGenerator 生成丰富的 HTML 输出。ReportGenerator 也可以在命令行上运行。
..\..\..\packages\ReportGenerator.1.9.1.0\reportgenerator.exe -reports:results.xml -targetdir:coverage
如果我们打开生成的覆盖率输出(coverage\index.htm),我们可以看到目标代码覆盖率的可视化。
7 | namespace Sample | ||
8 | { | ||
9 | public class Target | ||
10 | { | ||
11 | public static void DoSomething() | ||
1 | 12 | { | |
13 | try | ||
1 | 14 | { | |
1 | 15 | Console.WriteLine("I ran!"); | |
1 | 16 | } | |
0 | 17 | catch (Exception ex) | |
0 | 18 | { | |
0 | 19 | Console.WriteLine(ex.Message); | |
0 | 20 | } | |
1 | 21 | } | |
22 | } | ||
23 | } |