Filtering with dotCover
dotCover allows us to run coverage analysis on our code. However, there are times when we do not want to perform an analysis on certain areas. This could be our test assemblies, certain third-party assemblies or even specific parts of our own project. Since the analysis has an impact on the overall statistics and potentially can take longer, it is often interesting for us to filter certain assemblies or classes out.
The figure below shows the coverage report of the default MVC project (yes, yet another MVC example, but it ships in the box and probably the ONLY template with VS that comes with tests). In this case we’re using xUnit for tests, which is mostly to demonstrate that dotCover works with other frameworks, not only MSTest (personally I’ve moved on to MSpec, which dotCover also supports).
If we focus on the Coverage results we can see that there are some areas in grey, which indicate that the corresponding PDB files were missing so coverage could not take place. We can also see other assemblies that have been included in the results yet might not be of interest, such as the test assemblies.
In order to filter these out, we can use the Coverage Filters, which can be accessed via the dotCover menu in the IDE
By default, everything is set to be covered, as shown by the Everything entry in the Allow Filters tab (which most likely will be renamed to Included). Examining this entry (clicking on Edit) we can see that it is composed of three values:
- Module Mask indicates the project name
- Class Mask indicates the class name
- Function Mask indicates the method name
(All entries support wildcards as displayed by the * that appears)
We can now uses these patterns to exclude projects, assemblies, namespaces, classes and methods from out tests.
Excluding entire project
Click on Deny Filters tab (most likely will be renamed to Excluded) and click on Add, entering the following information:
Clicking OK and re-running the tests, we now see that the entire test assembly has been excluded
Excluding an entire Namespace
We can exclude entire namespaces by setting it in the Class Mask as shown below:
this will exclude all the classes inside the MvcApplication16.Models namespace. If we just wanted a specific class, we add it after Models instead of *.
Excluding a method
We can exclude a method, similar to how we’ve done it with the previous cases:
Adding a series of filters for test and auxiliary assemblies using the previous steps, we can end up with a cleaner and more accurate coverage report:
produced by adding the following filters:
Notice that by using the *.Tests (or alternatively as I call it *.Specifications), we can automatically exclude all our test projects from code coverage.
Note 1: Currently these settings are Global, that is, they apply to all projects. Most likely we’ll be changing it so that they are Solution and Global scoped. This way, common libraries can be excluded for all solutions, and specific projects and/or namespaces can be solution based.
Note 2: We’re also looking at adding functionality to make it easier to define these exclusions (a la Right-Click on Folder, add to Excluded list)
As always, we’re still in beta and feedback is more than welcome!