Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using .runsettings to exclude assemblies from code coverage

Tags:

When running code coverage for my solution which contains multiple projects, I noticed that Code Coverage includes also my test assemblies.

I found an article which suggests the following template for .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> 

Now the problem is that as soon as I check my .runsettings file in the TEST\Test settings menu, I see Code Coverage analyzes only one of many assemblies in my solution.

Even if I remove the line

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

only one assembly is analyzed. I would like to avoid adding all my assemblies to the Include list, I just need to exclude all the test assemblies.

Why does .runsettings make code coverage see only one of the assemblies in my VS solution?

like image 790
JustAMartin Avatar asked Jan 22 '13 12:01

JustAMartin


People also ask

How do you exclude projects from code coverage?

To exclude test code from the code coverage results and only include application code, add the ExcludeFromCodeCoverageAttribute attribute to your test class. To include assemblies that aren't part of your solution, obtain the . pdb files for these assemblies and copy them into the same folder as the assembly .

How do I enable analyze code coverage in Visual Studio 2022?

Starting in Visual Studio 2022 Update 2, you can enable faster code coverage test results by selecting Tools > Options > Environment > Preview Features, then selecting Code coverage experience improvements, and then restarting Visual Studio.

How do I check code coverage in Visual Studio using resharper?

Ctrl+U D commands. You can use this command to run coverage analysis of unit tests from the editor, from the Solution Explorer, or from unit tests sessions.


2 Answers

The issue is the period. For some reason the RegEx is choking on that. You can get around it by escaping the period as follows:

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

Also, the empty includes are valid and imply that all Modules are included. The comments of the Microsoft provided sample state that:

<!-- 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. --> 
like image 200
Hullah Avatar answered Sep 28 '22 16:09

Hullah


On a related note, I ran into this post because I was bit thinking clearly about the regular expression nature of the include and exclude paths. For my WPF application, I wanted to exclude coverage analysis on Caliburn.Micro. So I had written

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

Clearly, the period is messing me up. This question does not suffer from that problem, but I bet I’m not the only one to overlook this simple fact. For any other readers, please also take note that * is not a wildcard – it is the regular expression “any number of” operator. You do not want *.Caliburn, but rather .*Caliburn Thus this simple statement solved my problem:

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

Because it is looking for a path, not just a module name, you need the .* in front of the module to ignore it – that is, you want to ignore it at any given file path.

like image 21
sfuqua Avatar answered Sep 28 '22 17:09

sfuqua