首页 文章

是否有任何代码覆盖工具允许我逐行排除代码?

提问于
浏览
2

我想要的,从.NET覆盖工具,并没有找到...

能够运行单元测试,并跟踪哪些单元测试已执行的代码行,以及哪些代码行根本没有执行 . 能够生成交互式报告,允许用户通过程序集,文件,命名空间,classe等查看覆盖率的统计摘要,并深入查看源代码级别以查看确切的行和未涵盖的行 .

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

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

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

我看到它的方式有三类:

  • 测试涵盖的代码

  • 已被标记为不需要测试的代码

  • 未被测试覆盖的代码,并且未被标记为不需要测试

在单元测试运行之后,如果类别3中没有代码,或者如果存在失败,我想要的是通行证 .

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

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

有谁知道这样做的任何NET覆盖工具?

1 回答

  • 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 操作,或者您可以将该方法从coverage中排除,因为它非常简单 .

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

相关问题