Dot-Net

使用 .runsettings 將程序集排除在程式碼覆蓋範圍之外

  • January 22, 2013

在為包含多個項目的解決方案執行程式碼覆蓋率時,我注意到程式碼覆蓋率還包括我的測試程序集。

我發現一篇文章建議使用以下 .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 文件時,我看到程式碼覆蓋率只分析了我的解決方案中的許多程序集之一。

即使我刪除線

<ModulePath>.*Tests\.dll$</ModulePath> <!-- I put it here -->

只分析一個組件。我想避免將所有程序集添加到包含列表中,我只需要排除所有測試程序集。

為什麼 .runsettings 使程式碼覆蓋率只能看到我的 VS 解決方案中的一個程序集?

問題是時期。出於某種原因,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.
-->

引用自:https://stackoverflow.com/questions/14458246