17

爲包含多個項目的解決方案運行代碼覆蓋率時,我注意到代碼覆蓋率也包含我的測試程序集。使用.runsettings從代碼覆蓋範圍中排除程序集

我發現這表明了.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> 

現在的問題是,當我檢查我的.runsettings文件中的TEST \測試設置菜單中,我看到的代碼覆蓋率只分析我解決方案中的許多程序集中的一個。

即使我刪除行

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

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

爲什麼.runsettings使代碼覆蓋率只看到我的VS解決方案的組件之一?

+0

的http:// msdn.microsoft.com/de-de/library/vstudio/jj635153.aspx表示您可以刪除此文件中的每個條目(如使用默認值)。嘗試從一個空文件開始,然後在另一個區域之後添加一個區域。 – habakuk

+1

我正面臨類似的問題,文件更簡單。使用默認的runsettings文件,我可以獲得代碼覆蓋率。當我嘗試排除第三方庫(例如)時,然後運行代碼覆蓋率分析結果...沒有任何結果。沒有錯誤,沒有警告,只是沒有。評論排除在外,一切都可以再次運作。 – sfuqua

+0

只需添加@habakuk提供的MSDN鏈接的英文(en-us)版本http://msdn.microsoft.com/en-us/library/vstudio/jj635153.aspx – kmoormann

回答

21

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

+1,用於添加Microsoft評論,該評論準確解釋了「包含」和「排除」如何工作。謝謝。 –

13

在一個相關的說明,我就遇到了這個職位,因爲我清楚的一點思考的包括和排除路徑的正則表達式的性質。對於我的WPF應用程序,我想排除Caliburn.Micro上的覆蓋率分析。所以我寫了

<ModulePath>Caliburn.Micro.dll</ModulePath> 

很明顯,這個時期正在搞亂我。這個問題並不存在這個問題,但我敢打賭,我不是唯一忽視這個簡單事實的人。對於其他讀者,請注意*不是通配符 - 它是「任意數量」運算符的正則表達式。你不想*.Caliburn,而是.*Caliburn因此,這個簡單的語句解決我的問題:

<ModulePath>.*Caliburn.*</ModulePath> 

因爲它正在尋找一個路徑,而不僅僅是一個模塊的名稱,你需要的*在模塊的前面,不容忽視。它 - 也就是說,你想在任何給定的文件路徑上忽略它。

+1

您的解決方案是正確的。它不是一個簡單的通配符或正則表達式,而是一個Path,因此。*是強制性的,否則您應該知道TFS Azure不可能的.dll的完整路徑。 – Raffaeu

相關問題