在为包含多个项目的解决方案运行代码覆盖时,我注意到Code Coverage还包括我的测试程序集。
我发现了一篇文章,建议使用.runsettings的以下模板:
<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
<DataCollectionRunSettings>
<DataCollectors>
<DataCollector friendlyName="Code Coverage" uri="datacollector://Microsoft/CodeCoverage/2.0" assemblyQualifiedName="Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector, Microsoft.VisualStudio.TraceCollector, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<Configuration>
<CodeCoverage>
<ModulePaths>
<Include>
<!-- Do not specify any includes. This will attempt to include all binaries -->
</Include>
<Exclude>
<!-- Exclude modules that aren't to be processed, by their name / path -->
<ModulePath>.*Tests\.dll$</ModulePath> <!-- I put it here -->
</Exclude>
</ModulePaths>
<UseVerifiableInstrumentation>True</UseVerifiableInstrumentation>
<AllowLowIntegrityProcesses>True</AllowLowIntegrityProcesses>
<CollectFromChildProcesses>True</CollectFromChildProcesses>
<CollectAspDotNet>False</CollectAspDotNet>
<!--
Additional paths to search for symbol files. Symbols must be found for modules to be instrumented.
If symbols are alongside the binaries, they are automatically picked up. Otherwise specify the here.
Note that searching for symbols increases code coverage runtime. So keep this small and local.
<SymbolSearchPaths>
<Path>C:\Users\User\Documents\Visual Studio 11\Projects\ProjectX\bin\Debug</Path>
<Path>\\mybuildshare\builds\ProjectX</Path>
</SymbolSearchPaths>
-->
<Functions>
<Exclude>
<Function>^std::.*</Function>
<Function>^ATL::.*</Function>
<Function>.*::__GetTestMethodInfo.*</Function>
<Function>^Microsoft::VisualStudio::CppCodeCoverageFramework::.*</Function>
<Function>^Microsoft::VisualStudio::CppUnitTestFramework::.*</Function>
<Function>.*::YOU_CAN_ONLY_DESIGNATE_ONE_.*</Function>
</Exclude>
</Functions>
<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>
<Sources>
<Exclude>
<Source>.*\\atlmfc\\.*</Source>
<Source>.*\\vctools\\.*</Source>
<Source>.*\\public\\sdk\\.*</Source>
<Source>.*\\microsoft sdks\\.*</Source>
<Source>.*\\vc\\include\\.*</Source>
</Exclude>
</Sources>
<CompanyNames>
<Exclude>
<CompanyName>.*microsoft.*</CompanyName>
</Exclude>
</CompanyNames>
<PublicKeyTokens>
<Exclude>
<PublicKeyToken>^B77A5C561934E089$</PublicKeyToken>
<PublicKeyToken>^B03F5F7F11D50A3A$</PublicKeyToken>
<PublicKeyToken>^31BF3856AD364E35$</PublicKeyToken>
<PublicKeyToken>^89845DCD8080CC91$</PublicKeyToken>
<PublicKeyToken>^71E9BCE111E9429C$</PublicKeyToken>
<PublicKeyToken>^8F50407C4E9E73B6$</PublicKeyToken>
<PublicKeyToken>^E361AF139669C375$</PublicKeyToken>
</Exclude>
</PublicKeyTokens>
</CodeCoverage>
</Configuration>
</DataCollector>
</DataCollectors>
</DataCollectionRunSettings>
</RunSettings>
现在的问题是,只要我在TEST \ Test设置菜单中检查我的.runsettings文件,我就会看到Code Coverage只分析我解决方案中的许多程序集中的一个。
即使我删除了
行 <ModulePath>.*Tests\.dll$</ModulePath> <!-- I put it here -->
仅分析了一个装配体。我想避免将所有程序集添加到Include列表中,我只需要排除所有测试程序集。
为什么.runsettings使代码覆盖只能看到我VS解决方案中的一个程序集?
答案 0 :(得分:22)
The issue is the period。出于某种原因,RegEx对此感到窒息。您可以通过以下方式逃避周期:
<ModulePaths>
<Include>
<ModulePath>.*MyCompany\.Namespace\.Project\.dll$</ModulePath>
</Include>
<Exclude>
<ModulePath>.*ThirdParty\.Namespace\.Project\.dll$</ModulePath>
</Exclude>
</ModulePaths>
此外,空包含有效并暗示包含所有模块。微软提供的示例说明:
<!--
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.
-->
答案 1 :(得分:13)
在相关的说明中,我遇到了这篇文章,因为我有点想清楚包含和排除路径的正则表达式性质。对于我的WPF应用程序,我想排除Caliburn.Micro上的覆盖率分析。所以我写了
<ModulePath>Caliburn.Micro.dll</ModulePath>
显然,这段时间让我感到困惑。这个问题不会受到这个问题的影响,但我敢打赌,我不是唯一一个忽视这个简单事实的人。对于任何其他读者,请注意*不是通配符 - 它是正则表达式“任意数量”的运算符。你不想要*.Caliburn
,而是.*Caliburn
因此这个简单的陈述解决了我的问题:
<ModulePath>.*Caliburn.*</ModulePath>
因为它正在寻找路径,而不仅仅是模块名称,所以你需要在模块前面使用。*来忽略它 - 也就是说,你想在任何给定的文件路径上忽略它。
答案 2 :(得分:1)
由于我无法在其他任何地方找到这个答案,这只花了我一段时间才弄明白,[A-Za-z0-9-.]
是完整的路径,你可能会在路径的其他地方匹配你的模式。
例如,如果您有一个项目ModulePath
和一个项目Foo
,并且它们是根据自己的目录构建的,那么最终会得到Foo.Tests
和Foo.Tests\bin\Release\Foo.dll
。这是测试程序集将引用的dll,因此这是使用的路径。测试程序集不直接引用Foo.Tests\bin\Release\Foo.Tests.dll
。
如果您尝试排除Foo\bin\Release\Foo.dll
,它将匹配两个路径并且不会产生任何覆盖。
仅使用&#34; test&#34;排除程序集在他们的文件名中,忽略了他们的路径,我使用了
.*tests.*
答案 3 :(得分:0)
很遗憾,我无法得到其他答案,但我按照https://msdn.microsoft.com/en-us/library/jj159530.aspx的说法完成了这项工作:
<ModulePath>.*\\MyProject\.Test\.dll$</ModulePath>
答案 4 :(得分:0)
我遇到各种问题,无法使clickable
可靠地工作(使用ASP.NET Core 2.1)。
最后,我发现使用<ModulePaths>
既简单又可靠,并且完全按照我的需要工作。您仍然可以使用正则表达式的建议。
我包括我的解决方案路径,并排除我所有测试项目所在的\ tests子文件夹。 RunSettings xml文件中CodeCoverage元素的示例:
<Sources>
更多信息,请访问:Customising Code Coverage on MS Docs