是否有任何代码覆盖率工具可以让我逐行排除代码?

时间:2015-08-14 14:48:45

标签: .net unit-testing jenkins code-coverage

我想要的,来自.NET覆盖工具,并且无法找到......

能够运行单元测试,并跟踪哪些单元测试执行了哪些代码行,以及哪些代码行根本没有执行。 能够生成交互式报告,允许用户按装配,文件,命名空间,分类等查看覆盖率的统计摘要;并深入查看源代码级别,以确切了解哪些行已被覆盖且未被覆盖

能够运行测试并从Jenkins生成报告,并将报告包含在Jenkins为每个构建显示的信息中。 能够逐行标记源代码,因为不需要覆盖。 能够使报告清楚地表明每行源代码都已被覆盖,或标记为不需要覆盖。

我一直在寻找免费的覆盖工具,并且对我们感到满意。我最近开始阅读dotCover,它看起来确实提供了我需要的更多东西。但是根据我在文档中读到的内容,它提供了通过文件,类或函数从代码覆盖要求中排除代码的机制。但如果它能够逐行排除代码,我就错过了它。

从本质上讲,我所寻找的是传递失败。 90%的覆盖率,或80%的覆盖率,或95%的覆盖率,对我来说毫无意义。 80%的覆盖率可能意味着20%的代码不需要覆盖,99.9%的覆盖率可能意味着只有一个迫切需要测试的关键功能尚未经过测试。

我看到的方式分为三类:

  1. 测试涵盖的代码
  2. 已被标记为无需测试的代码
  3. 未被测试覆盖且未被标记为不需要测试的代码
  4. 在单元测试运行之后,如果类别3中没有代码,或者如果存在失败,我想要的是通行证。

    我需要能够将代码标记为不需要按行进行测试,而不仅仅是通过函数进行测试,因为当我查看覆盖率报告中的函数时,我很常见通过测试执行的功能的某些控制流程。最常见的是异常或错误处理。有时,创建测试以产生测试这些控制流所需的错误或异常所需的工作量可能很大,有时测试揭示问题的可能性很小。

    在这些情况下,我希望能够将代码标记为已经检查过,并且已经确定不需要测试。当我以这种方式标记代码时,我希望代码不被测试覆盖,以免构建失败。

    有没有人知道这样做的任何.NET覆盖工具?

1 个答案:

答案 0 :(得分:1)

OpenCover将允许您按行(序列点)跟踪覆盖范围,如果您使用-coverbytest,则可以确定线路被击中时正在运行的测试。

没有按行排除功能,因为OpenCover会在程序集运行时检测程序集,并且不知道实际的代码行。您可以编写自己的工具,通过解析代码,然后在使用ReportGenerator生成报告之前从结果中删除任何序列点来删除要排除的行的结果。

然而,人们可以争辩说,没有代码是不可测试的,你只需要以不同的方式重构它。通常这种代码是人们说他们无法测试的,因为他们无法强制例外。

public void Method()
{
  try
  {
    // do something
  }
  catch (Exception ex)
  {
    // respond to exception
  }
}

但要测试这一切,你需要做的就是将其分解为更小的部分

internal void TryCatch<T>(Action doAction, Action<T> catchAction) where T : Exception { 
  try { doAction(); } catch (T ex) { catchAction(ex); }
}

internal void DoMethod() {
  // do something
}

internal void CatchMethod(Exception ex){
  // respond to exception
}

public void Method() {
  TryCatch<Exception>(DoMethod, CatchMethod);
}

现在每件作品都是可以单独测试的,如果您愿意,不需要隐藏任何代码。例如在TryCatch<T>()的情况下,您可以进行测试,如果doAction抛出异常,则调用catchException操作,或者您可以从覆盖范围中排除该方法,因为它非常简单。

我很少采用这种模式方式,除非我真的需要测试在某些条件下调用catch块。