.net 使用.runsettings从代码覆盖范围中排除程序集

.net 使用.runsettings从代码覆盖范围中排除程序集,.net,visual-studio,unit-testing,code-coverage,vs-unit-testing-framework,.net,Visual Studio,Unit Testing,Code Coverage,Vs Unit Testing Framework,在为包含多个项目的解决方案运行代码覆盖率时,我注意到代码覆盖率还包括我的测试程序集 我发现一篇文章建议使用以下.runsettings模板: *Tests\.dll$ 真的 真的 真的 假的 ^std::* ^ATL::* *:u GetTestMethodInfo* ^Microsoft::VisualStudio::CppCodeCoverageFramework::* ^Microsoft::VisualStudio::CppUnitTestFramework::* 。*::您只能指定一

在为包含多个项目的解决方案运行代码覆盖率时,我注意到代码覆盖率还包括我的测试程序集

我发现一篇文章建议使用以下.runsettings模板:


*Tests\.dll$
真的
真的
真的
假的
^std::*
^ATL::*
*:u GetTestMethodInfo*
^Microsoft::VisualStudio::CppCodeCoverageFramework::*
^Microsoft::VisualStudio::CppUnitTestFramework::*
。*::您只能指定一个*
^System.Diagnostics.DebuggerHiddenAttribute$
^System.Diagnostics.DebuggerNonUserCodeAttribute$
^System.Runtime.CompilerServices.CompilerGeneratedAttribute$
^System.CodeDom.Compiler.GeneratedCodeAttribute$
^System.Diagnostics.CodeAnalysis.ExcludeFromCodeOverageAttribute$
.*\\atlmfc\\*
.*\\vctools\\*
.*\\public\\sdk\\*
.*\\microsoft SDK\\*
.*\\vc\\include\\*
*微软*
^B77A5C561934E089$
^B03F5F7F11D50A3A$
^31BF3856AD364E35$
^89845DCD8080CC91$
^71E9BCE111E9429C$
^8F5047C4E9E73B6$
^E361AF139669C375$
现在的问题是,只要我检查TEST\TEST settings菜单中的.runsettings文件,我就会看到代码覆盖率只分析解决方案中许多程序集中的一个

即使我拆下这条线

 <ModulePath>.*Tests\.dll$</ModulePath> <!-- I put it here -->
*测试\.dll$
只分析一个部件。我希望避免将所有程序集添加到包含列表,我只需要排除所有测试程序集


为什么.runsettings使代码覆盖率只能看到我的VS解决方案中的一个程序集?

在相关说明中,我之所以看到这篇文章,是因为我有点清楚地考虑了include和exclude路径的正则表达式性质。对于我的WPF应用程序,我想排除Caliburn.Micro上的覆盖率分析。所以我写了

<ModulePath>Caliburn.Micro.dll</ModulePath>
因为它正在查找路径,而不仅仅是模块名称,所以您需要模块前面的。*来忽略它–也就是说,您希望在任何给定的文件路径上忽略它。

。出于某种原因,正则表达式被它扼杀了。您可以通过如下方式逃逸周期来绕过它:

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

*MyCompany\.Namespace\.Project\.dll$
*ThirdParty\.Namespace\.Project\.dll$
此外,空的include是有效的,表示包含了所有模块。Microsoft提供的示例注释说明:

<!--
About include/exclude lists:
Empty "Include" clauses imply all; empty "Exclude" clauses imply none.
Each element in the list is a regular expression (ECMAScript syntax).
See http://msdn.microsoft.com/library/2k3te2cs.aspx.
An item must first match at least one entry in the include list to be included.
Included items must then not match any entries in the exclude list to remain included.
-->

不幸的是,我无法得到其他对我有用的答案,但我得到了以下结果:

*\\MyProject\.Test\.dll$

由于我在其他任何地方都找不到这个答案,我花了一段时间才弄明白,
ModulePath
是完整路径,您可能在路径中的其他地方匹配您的模式

例如,如果您有一个项目
Foo
和一个项目
Foo.Tests
,并且它们被构建到自己的目录中,您将得到
Foo.Tests\bin\Release\Foo.dll
Foo.Tests\bin\Release\Foo.Tests.dll
。这是测试程序集将引用的dll,因此这是使用的路径<代码>Foo\bin\Release\Foo.dll未被测试程序集直接引用

如果尝试排除
*测试。*
它将匹配两条路径,并且不会产生覆盖率

为了只排除文件名中带有“test”的程序集,而忽略其路径,我使用

<Exclude>
  <ModulePath>.*\\[^\\]*test[^\\]*\.dll</ModulePath>
</Exclude>

.\\\[^\\]*测试[^\\]*\.dll

我在使
可靠工作(使用ASP.NET Core 2.1)方面遇到了各种各样的问题

最后,我发现使用
更简单、更可靠,并且完全符合我的需要。您仍然可以利用关于使用regex的建议

我包括我的解决方案路径,并排除所有测试项目所在的\tests子文件夹。RunSettings xml文件中CodeCoverage元素的示例:

<CodeCoverage>
  <Sources>
    <Include>
      <Source>.*\\My\.Solution\.Name\.Space\\.*</Source> <!-- ie: include *\My.Solution.Name.Space\* -->
    </Include>
    <Exclude>
      <Source>.*\\My\.Solution\.Name\.Space\\Tests\\.*</Source> <!-- ie: exclude *\My.Solution.Name.Space\Tests\* -->
    </Exclude>
  </Sources>
  <!-- removed for brevity -->
<CodeCoverage>

.\\My\.Solution\.Name\.Space\\.*
.\\My\.Solution\.Name\.Space\\Tests\\.*

有关详细信息,请参见:

这是visual studio中最破碎的部分,多年来一直如此。

说您可以删除此文件中的每个条目(因为使用了默认值)。试着从一个空文件开始,一个接一个地添加一个区域。我面临一个类似的问题,一个更简单的文件。使用默认的runsettings文件,我可以获得代码覆盖率。当我试图排除第三方库(例如)时,运行代码覆盖率分析会导致。。。没有什么。没有错误,没有警告,什么都没有。注释排除,一切都会重新开始。只需添加@habakuk提供的MSDN链接的英文(en-us)版本,您的解决方案就是正确的。它不是一个简单的通配符或正则表达式,而是一个路径,因此.*是强制的,否则您应该知道.dll的完整路径,这在TFS Azure中是不可能的。“如果您尝试排除.*测试。*它将匹配这两个路径,并且不会产生覆盖率。”它确实存在这个问题。你的回答节省了我的时间。谢谢,这需要更多的选票。这些答案中有很多完全忽略了“完整路径”方面,即聚焦
<Exclude>
  <ModulePath>.*\\[^\\]*test[^\\]*\.dll</ModulePath>
</Exclude>
<CodeCoverage>
  <Sources>
    <Include>
      <Source>.*\\My\.Solution\.Name\.Space\\.*</Source> <!-- ie: include *\My.Solution.Name.Space\* -->
    </Include>
    <Exclude>
      <Source>.*\\My\.Solution\.Name\.Space\\Tests\\.*</Source> <!-- ie: exclude *\My.Solution.Name.Space\Tests\* -->
    </Exclude>
  </Sources>
  <!-- removed for brevity -->
<CodeCoverage>