17

Quando si esegue la copertura del codice per la mia soluzione che contiene più progetti, ho notato che la copertura del codice include anche i miei gruppi di test.Uso di .runsettings per escludere assemblee dalla copertura del codice

ho trovato un articolo che suggerisce il seguente modello per .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> 

Ora il problema è che, non appena verifico il mio file .runsettings nel menu delle impostazioni di test TEST \, vedo Code Coverage analizza solo uno dei molti assembly nella mia soluzione.

Anche se rimuovere la linea

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

unico assieme viene analizzato. Vorrei evitare di aggiungere tutti i miei assembly alla lista Include, ho solo bisogno di escludere tutti gli assembly di test.

Perché le impostazioni di risposta rendono la copertura del codice vedere solo uno degli assembly nella mia soluzione VS?

+0

http: // msdn.microsoft.com/de-de/library/vstudio/jj635153.aspx dice che è possibile rimuovere ogni voce in questo file (come valori di default sono usati). Prova ad iniziare con un file vuoto e aggiungi una regione dopo l'altra. – habakuk

+1

Sto affrontando un problema simile, con un file molto più semplice. Con il file delle impostazioni di default, sono in grado di ottenere la copertura del codice. Quando ho provato a escludere una libreria di terze parti (ad esempio), quindi l'esecuzione dell'analisi della copertura del codice risulta in ... niente. Nessun errore, nessun avvertimento, solo niente. Commenta l'esclusione e tutto funziona di nuovo. – sfuqua

+0

semplicemente aggiungendo la versione inglese (in uso) del collegamento MSDN fornito da @habakuk http://msdn.microsoft.com/en-us/library/vstudio/jj635153.aspx – kmoormann

risposta

21

The issue is the period. Per qualche ragione il RegEx soffoca su questo. È possibile ottenere intorno ad esso fuggendo il periodo come segue:

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

Inoltre, il vuoto include sono validi e implicano che tutti i moduli sono inclusi. I commenti di Microsoft disponibile State di esempio:

<!-- 
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 per aggiungere il commento Microsoft che spiega esattamente come funzionano l'inclusione e l'esclusione. Grazie. –

13

Su una nota correlata, mi sono imbattuto in questo post perché stavo un po 'pensando chiaramente alla natura di espressione regolare dei percorsi di inclusione ed esclusione. Per la mia applicazione WPF, volevo escludere l'analisi della copertura su Caliburn.Micro. Così avevo scritto

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

Chiaramente, il periodo mi sta incasinando. Questa domanda non soffre di questo problema, ma scommetto che non sono il solo a trascurare questo semplice fatto. Per qualsiasi altro lettore, si prega di prendere nota che * non è un carattere jolly - è l'espressione regolare "qualsiasi numero di" operatore. Se non si desidera *.Caliburn, ma piuttosto .*Caliburn Così questa semplice affermazione Ha risolto il problema:

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

Perché è alla ricerca di un percorso, non solo un nome di modulo, è necessario il * fronte del modulo di ignorare. esso - cioè, si desidera ignorarlo in qualsiasi percorso di file specificato.

+1

La soluzione è quella giusta.Non è un semplice carattere jolly o un'espressione regolare, ma è un percorso, quindi il simbolo * è obbligatorio, altrimenti è necessario conoscere il percorso completo del file .dll, che è impossibile da TFS Azure. – Raffaeu

Problemi correlati