Introduction to PartCover - a short manual

PartCover - a code coverage tool

Update: you should now use OpenCover, which is a newer code-coverage tool by the author of PartCover.

PartCover is a code coverage tool for .NET. There’s a SourceForge project that is a bit dormant but does have an installer for the latest version and a github fork with more recent code development.

Unfortunately it’s not documented well (misleadingly, even) so here’s a short tutorial.

Installation

You can download the installer from SourceForge project and install the usual way. This post is based on build 4.0.10705 (latest at this time).

After you install, you can just copy DLLs and EXEs to any location and run it from there. I keep the binaries in the source repository so that I can run code coverage tests from my test scripts without the need to have PartCover installed.

A note about 64-bit Windows

The 4.0 version can’t handle 64-bit mode. While .NET applications consist of platform-independent bytecode, when the bytecode is executed, it can be JIT-ed in 32-bit mode (the only option on 32-bit Windows and possibility in 64-bit Windows) or 64-bit mode. For that reason, both PartCover and the application being tested need to be forced into 32-bit mode.

For PartCover, run [most recent Windows SDK]\bin\CorFlags.exe PartCover.exe /32BIT+ /Force

For your application, you need to compile it in 32-bit mode. When using csc compiler, use /platform:x86. In Visual Studio IDE, set Platform Target in Build tab of project properties to x86 (default is Any CPU).

In my project, I have a special target for code coverage that compiles with /platform:x86 flag.

Running PartCover

The basic flow is:

  • run your executable under PartCover.exe
  • inspect the results (generated by PartCover.exe as an XML file)

Basic option for PartCover:

  • --target : name of the the .NET executable to test
  • --output : name of the XML file with results
  • --include <[Assembly]class> : which assemblies/classes to include in code coverage. Can be used multiple times
  • --exclude <[Assembly]class> : which assemblies/classes to exclude from code coverage. By default [mscorlib]* and [System*]* are excluded. Can be used multiple times

An example invocation:

PartCover --target bin\UnitTests.exe --include [NachoDB]* --include [UnitTests]* --output partcover.xml

What it means:

  • we run code coverage on bin\UnitTests.exe .NET executable and all the assemblies it uses
  • the executable uses NachoDB.dll assembly, so ask for code coverage (--include) of all classes in NachoDB and UnitTests assemblies. As you can see, you can use ’*’ as a simple regular expression matcher with the expected meaning
  • the results of code coverage are saved in partcover.xml file

Looking at the results

PartCover includes PartCover.Browser application that can be used to configure and run code coverage tests and browse the results.

To browse existing results use File/Open Report... menu and open partcover.xml file. Also, use Views/View Coverage Details menu - results are not useful without it.

On the left you’ll see a list of assemblies with their classes and methods. When you click on a method, on the right you’ll see source code of that method annotated with code coverage information (lines with green background have been executed):

PartCover GUI browser

Alternatively, you can adapt for your purposes my python script that generates set of html files with the results of code coverage.

Alternatives

There are alternatives, but not great ones.

Visual Studio

Expensive edition of Visual Studio has a code coverage built in. However, it’s a total disaster in usability and I was unable to get it to work.

What I expected is that it works like code profiling: I choose the binary, arguments and environment variables, run it, the results show up.

Visual Studio has other ideas. It seems that if I want to do code coverage from UI, I have to create a project specifically for that. It’s insane and I didn’t even try.

There is a way to do it from command line, by instrumenting the binaries with a cmd-line tool and running it with code coverage service process running (a byzantine and over-complicated setup, if you ask me). I tried this method following posts scattered on the internet but I ended up with empty code coverage results and no error message to tell me what’s wrong. Thank you, Microsoft, for wasting my time.

NCover

NCover used to be free and open-source tool but is now commercial. The few screenshots they have on their website look good but they won’t give you a trial version unless you give them your e-mail address and I wont.

Resources