使用属性在Visual Studio中忽略覆盖率分析中的代码

tva*_*son 18 attributes code-coverage ncover visual-studio

我有一些课程,由于某种原因,不能或不需要进行单元测试.我想从我的覆盖率指标中排除这些类,以便我能更好地了解我真正关心的类的覆盖范围.现在我必须在事后排除结果.我想要做的是使用一个属性将这些类标记为排除,以便它们不包括在内. 有没有办法用一个属性来装饰一个类,它会自动将它从覆盖率分析中排除? VS覆盖率分析或nCover都可以使用.

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

Shr*_*ike 27

从VS2010开始,我们有ExcludeFromCodeCoverageAttribute.评论者注意到这在NCover和DotCover + NUnit中都有效.用法示例:

[ExcludeFromCodeCoverage]
public class myUntestableClass
{ }
Run Code Online (Sandbox Code Playgroud)

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


tva*_*son 7

我发现了一些诊断属性DebuggerNonUserCodeAttributeDebuggerHiddenAttribute的一些信息,这些属性表明使用这些属性会导致VS中的coverage分析器将这些属性从结果中删除.我已经使用DebuggerNonUserCodeAttribute尝试了它,它似乎工作.对于我正在考虑的大多数课程,我可以忍受这个,尽管我不喜欢不能进入这些课程的副作用.对于包装类来说这应该不是问题,但是对于本身很难测试的类而言我可能最终会这样,我需要调试器访问.

不过,我仍然在寻找其他选择.


小智 5

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

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

public class CoverageExcludeAttribute : Attribute { }
Run Code Online (Sandbox Code Playgroud)

我们使用NAnt,所以我们有一个如下所示的目标:

<target name="unittests" description="run nunit tests" >        
    <ncover
        ....
        excludeAttributes="CoverageExcludeAttribute"
    />
</target>
Run Code Online (Sandbox Code Playgroud)

NCover FAQ中的问题9 描述了这种方法.我们的解决方案基于此.

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

我们使用这两种技术.