# Setting Up Test Coverage Profiling for C#

In order to use the Test Gap analysis, you’ll need to upload test coverage to Teamscale.

Uploading Coverage

If you already have existing coverage files have a look at Uploading Test Coverage to Teamscale.


In our general .NET TGA tutorial we outline the steps needed to set up TGA for a concrete sample project.

# Visual Studio / TFS / MSTest Code Coverage

By default, TFS / Azure DevOps will make a .coverage file available to you if you enable code coverage collection in your builds. This guide shows you how to get that coverage to show up in Teamscale.

Since the original .coverage file is in binary format, it needs to be converted to XML before the upload to Teamscale happens. To perform the conversion, Microsoft's CodeCoverage.exe utility tool can be used. It is available as part of the Microsoft.CodeCoverage nuget package.

To convert your result.coverage file to result.xml, you can call the CodeCoverage.exe tool like this:

CodeCoverage.exe analyze /output:result.xml result.coverage

Afterwards, you can upload the resulting XML file to Teamscale. Please refer to the article on external uploads for details. In the REST API of the upload, specify VS_COVERAGE as value of the format parameter.

Merging Coverage

You can also use the above tool to merge multiple .coverage files into one .xml file, which will lead to faster upload processing.

# Manual tests

There are many C# profilers for which no special mapping files are needed. We do, however, have a custom low-overhead profiler. It is specially suited for the Test Gap analysis as it only records which methods were executed, not which particular lines. This allows it to have virtually no impact on performance. We have successfully used it to profile in several production environments. Since only minimal information is recorded at runtime, Teamscale needs the PDB files generated during the build to interpret the coverage files.

# How to Set Up Test Gap Analysis (TGA) with Mapping Files

Teamscale allows you to upload the PDB files ahead of time, e.g., when they are created during the build process. Then, when uploading coverage files, it will use the mapping files to interpret the coverage information. Since every time you build your application, new mapping files are generated, Teamscale needs to know, which mapping files to use when you upload coverage. Thus, during the upload of the mapping files, you must provide a version string (any unique string will do, e.g., a revision number). You must again provide the exact same version string when uploading coverage files that belong to those mapping files.

# Uploading PDB files

The following is an example of how to upload PDB files using curl:

curl --request POST \
--user bob:e434mikm35d \
--form "file=@./assembly.pdb" \

The branch:timestamp must be the branch name and commit timestamp in milliseconds of the commit which was processed by the build to generate the mapping file.

# Uploading coverage results

The following is an example of how to upload CQSE profiler coverage files using curl:

curl --request POST \
--user bob:e434mikm35d \
--form "report=@./coverage.txt" \