如何使用Visual Studio 2012中的runsettings文件从代码覆盖中排除服务引用?

时间:2012-11-24 19:46:09

标签: unit-testing visual-studio-2012 mstest code-coverage visual-studio-test-runner

我正在使用自定义runsettings文件来控制检查代码覆盖率的项目。我使用了Microsoft提供的默认模板,并且到目前为止能够排除我想要的项目而没有任何问题。我的下一步操作是从代码覆盖中排除在添加服务引用时由Visual Studio创建的自动生成的Web代理类。

这看起来应该适用于默认的runsettings模板,因为它有一个看起来像这样的部分:

<Attributes>
    <Exclude>
        <!-- Don’t forget "Attribute" at the end of the name -->
        <Attribute>^System.Diagnostics.DebuggerHiddenAttribute$</Attribute>
        <Attribute>^System.Diagnostics.DebuggerNonUserCodeAttribute$</Attribute>
        <Attribute>^System.Runtime.CompilerServices.CompilerGeneratedAttribute$</Attribute>
        <Attribute>^System.CodeDom.Compiler.GeneratedCodeAttribute$</Attribute>
        <Attribute>^System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute$</Attribute>
    </Exclude>
</Attributes>

添加服务引用时创建的所有类都使用GeneratedCodeAttribute进行修饰,因此应该排除它们。但是,当我运行代码覆盖时,它们不会被忽略,因此代码覆盖率会报告大量未覆盖的代码。我已经多次尝试使用正则表达式,试图让它正确地选择属性而无济于事。

我很欣赏有关如何: - 让此属性排除工作 - 一种替代方案,不要求我排除整个项目或使runsettings文件非通用(我们希望在没有特定编辑的情况下在所有项目中重复使用此基本文件)

仅供参考 - 虽然我知道还有其他代码覆盖工具,但我的目标是使Visual Studio工作,因此在这种情况下,关于切换到其他工具的建议对我没有帮助。

4 个答案:

答案 0 :(得分:12)

感谢您的想法。我最后添加了以下几行:

<Source>.*\\Service References\\.*</Source>
<Source>.*\\*.designer.cs*</Source>

得到了我需要的结果。我仍然感到沮丧,我不知道为什么这个文件的其他部分不被接受。

答案 1 :(得分:12)

问题似乎是RegEx中的期间。如果你将它们作为\.转义它就会开始工作。不确定为什么重要,因为如果它真的是一个RegEx,则期限应该与any character相匹配,包括一段时间。

因此,要使原始模板有效,您需要将其更改为以下内容:

<Attributes>
    <Exclude>
        <Attribute>^System\.Diagnostics\.DebuggerHiddenAttribute$</Attribute>
        <Attribute>^System\.Diagnostics\.DebuggerNonUserCodeAttribute$</Attribute>
        <Attribute>^System\.Runtime\.CompilerServices\.CompilerGeneratedAttribute$</Attribute>
        <Attribute>^System\.CodeDom\.Compiler\.GeneratedCodeAttribute$</Attribute>
        <Attribute>^System\.Diagnostics\.CodeAnalysis\.ExcludeFromCodeCoverageAttribute$</Attribute>
    </Exclude>
</Attributes>

另外,只是为了通知您,<ModulePaths>过滤器存在您可以使用的相同问题:

<ModulePaths>
    <Include>
        <ModulePath>.*MyCompany\.Namespace\.Project\.dll$</ModulePath>
    </Include>
    <Exclude>
        <ModulePath>.*ThirdParty\.Namespace\.Project\.dll$</ModulePath>
    </Exclude>
</ModulePaths>

答案 2 :(得分:4)

MSDN有一个页面,介绍如何自定义代码覆盖率分析here

在页面底部有一个示例设置文件,其中显示了如何排除属性,这与上面的内容相符。

您可以尝试一些他们提到的其他排除方法,例如按路径排除:

<!-- Match the path of the source files in which each method is defined: -->
<Sources>
    <Exclude>
        <Source>.*\\atlmfc\\.*</Source>
        <Source>.*\\vctools\\.*</Source>
        <Source>.*\\public\\sdk\\.*</Source>
        <Source>.*\\microsoft sdks\\.*</Source>
        <Source>.*\\vc\\include\\.*</Source>
    </Exclude>
</Sources>

答案 3 :(得分:3)

我可以通过将属性命名设置为:

来使此设置生效
<Attributes>
  <Exclude>
    <Attribute>.*GeneratedCodeAttribute$</Attribute>
  </Exclude>
</Attributes>

不确定原因,但必须有完整属性名称的一部分与正则表达式不匹配。