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



我正在使用一个自定义的runsettings文件来控制检查哪些项目的代码覆盖率。我使用了微软提供的默认模板,到目前为止,我可以毫无问题地排除我想要的项目。我的下一个操作是从代码覆盖范围中排除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进行修饰,因此它们都应该被排除在外。然而,当我运行代码覆盖率时,它们不会被忽略,因此代码覆盖率会报告一大块未覆盖的代码。我已经对正则表达式进行了多次实验,试图让它正确地选择属性,但都无济于事。

我非常感谢关于如何:-使此属性排除生效-一个不需要我排除整个项目或使运行设置文件非通用的替代方案(我们希望在没有特定编辑的情况下在所有项目中重复使用此基础文件)

仅供参考-虽然我知道还有其他代码覆盖工具,但我的目标是让VisualStudio能够正常工作,因此在这种情况下,关于切换到另一个工具的建议对我没有帮助。

谢谢你的想法。我最后添加了以下行:

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

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

问题似乎是RegEx中的周期。如果你以.的身份逃离它们,它就会开始工作。不知道为什么这很重要,因为如果它真的是RegEx,句点应该匹配任何字符,包括句点。

因此,为了使原始模板发挥作用,您需要将其更改为以下内容:

<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>
MSDN有一个页面,描述了如何在这里自定义代码覆盖率分析。

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

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

<!-- 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>

我可以通过将属性命名设置为:来实现此设置

<Attributes>
<Exclude>
<Attribute>.*GeneratedCodeAttribute$</Attribute>
</Exclude>
</Attributes>

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

相关内容

  • 没有找到相关文章

最新更新