65.9K
CodeProject 正在变化。 阅读更多。
Home

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

2013 年 11 月 3 日

CPOL

3分钟阅读

viewsIcon

123724

downloadIcon

1374

介绍 

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 包。  

  1. 创建新解决方案
  2. 为该解决方案“启用 NuGet 包还原”。
  3. 使用“管理解决方案的 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>   

下一步 

  1. 创建一个名为 Sample 的 C# 项目(类库)。 
  2. 创建一个名为 Sample.Test 的 C# 项目(类库),并引用 Sample 项目。 
  3. 使用 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()
 112         {
 13             try
 14            {
 15                 Console.WriteLine("I ran!");
 16             }
 17             catch (Exception ex)
 18             {
 19                 Console.WriteLine(ex.Message);
 20             }
 21         }
 22     }
 23 } 

正如您所看到的,理解您的测试实际覆盖了哪些代码非常简单。

对于一个真实世界的例子,OpenCover 实际上被用来收集它自己测试的覆盖率,结果可以在 OpenCover 的构建管道上看到。  

历史   

2013 年 11 月 3 日 - 原始文章  

 

© . All rights reserved.