【问题标题】:Use attribute to omit code from coverage analysis in Visual Studio在 Visual Studio 中使用属性从覆盖分析中省略代码
【发布时间】:2010-11-20 08:08:16
【问题描述】:

我有一些类,出于某种原因,不能或不需要进行单元测试。我想从我的覆盖率指标中排除这些类,以便更好地了解我真正关心的类的覆盖率。现在我必须在事后排除结果。我想做的是使用属性将这些类标记为已排除,以便一开始就不包含它们。 有什么方法可以用一个属性来装饰一个类,该属性会自动将其从覆盖率分析中排除? VS 覆盖率分析或 nCover 都可以。

FWIW,这些是我可以通过检查代码是否正确来保证自己的类。大多数情况下,它们是围绕我引入的现有框架类的包装类,以便能够模拟框架类。由于包装器被嘲笑,他们没有得到测试。没关系,因为他们所做的只是包装我关心的框架类的方法。

【问题讨论】:

  • 问题是你无法获得个别方法的覆盖率数据,所以你想删除你不关心的方法上的覆盖率数据以获得更合适的整体测量?
  • 是的。有些方法不需要或不容易测试——例如,创建包装类以启用围绕框架类的单元测试。我不希望这些让我关心的课程的统计数据混乱。

标签: visual-studio attributes code-coverage ncover


【解决方案1】:

从 VS2010 开始,我们有 ExcludeFromCodeCoverageAttribute。评论者注意到这可以在 NCover 以及 DotCover + NUnit 中使用。示例用法:

[ExcludeFromCodeCoverage]
public class myUntestableClass
{ }

另见link。他们建议使用 VSInstr 作为命令行工具,它有 /EXCLUDE 选项(不是很方便)。

【讨论】:

  • 是的,它也适用于 dotcover 和 vs 代码分析。
【解决方案2】:

使用 NCover,您可以创建一个属性,然后告诉 NCover 忽略该属性。

在我们的项目中,我们已经定义了这个属性(没有命名空间,所以很容易使用):

public class CoverageExcludeAttribute : Attribute { }

我们使用 NAnt,所以我们有一个看起来像这样的目标:

<target name="unittests" description="run nunit tests" >        
    <ncover
        ....
        excludeAttributes="CoverageExcludeAttribute"
    />
</target>

NCover FAQ 中的问题 9 描述了这种方法。我们的解决方案以此为基础。

或者,您可以使用 NCoverExplorer 的排除功能从最终报告中排除命名空间和程序集。这只是从报告中删除数据,但最终结果是相同的。

我们使用这两种技术。

【讨论】:

  • 谢谢。这正是我一直在寻找的。我主要将 nCover 与 TestDriven.Net 结合使用,看起来它可以开箱即用地启用 CoverageExcludeAttribute。
  • 最新版本与 ExcludeFromCodeCoverage 属性一起使用,所以我已经切换到使用它。
【解决方案3】:

我在几个诊断属性DebuggerNonUserCodeAttributeDebuggerHiddenAttribute 上找到了some information,这表明使用这些属性会导致VS 中的覆盖率分析器将这些属性排除在结果之外。我已经使用 DebuggerNonUserCodeAttribute 进行了尝试,它似乎可以工作。对于我正在考虑的大多数课程,我可能可以忍受这一点,尽管我不喜欢无法进入这些课程的副作用。对于包装类来说,这应该不是问题,但对于本质上难以测试且我需要调试器访问的类,它可能最终会如此。

不过,我仍在寻找替代品。

【讨论】:

  • 这正是我想要的。感谢您的跟进!
猜你喜欢
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 2023-04-08
  • 2015-07-29
  • 1970-01-01
相关资源
最近更新 更多