Better code coverage, one commit at a time.
Differential coverage
Tell Me More

A new code coverage

More than just prettified reports. An effective way to get your coverage up!

coverage report screenshot

Visualize what is left to be tested and spot dead code in a heartbeat!
When coverage drops, Couverture tells you where! No guessing, no plugins!


A coverage report that measures changes in coverage between two branches.


Coverage information unrelated to your pull request is discarded.


Straightforward and clutter-free coverage reports for all your pull requests.

github commit status

Building for multiple targets? It is all here in your pull request!

Try it out

Setup in 3 easy steps

Be covered in no time!

Enable your repositories

Sign-up, link your Github account and enable repositories for which you want differential code coverage.

Upload coverage data

After your CI service runs your tests, upload the generated coverage files to our servers. See how.

View differential coverage on PRs

Couverture publishes differential coverage reports directly on your pull requests.


So easy, it all fits on one page!


Sign-in with your Google account. That's right, we skipped the sign-up step to make your life easier (but especially ours so we don't have to store your passwords). If you don't have a Google account, then you know what to do next.

Enable repositories

We currently support Github repositories. Once signed-in you can list your Github repos for which you want to enable differential code coverage reports.

Upload coverage reports

Now it's time to upload your coverage reports. We currently support Cobertura reports, an XML file format. Almost all programming languages have tools to generate Cobertura reports. Oh, and here's a sample curl command to run after your tests have generated the Cobertura report.

$ JOB_NAME=py27                                    # name of the build / stage
$ COVERAGE_FILE=coverage.xml                       # the coverage report to upload
$ REPO_OWNER=couverture
$ REPO_NAME=playground
$ COMMIT=b2417c722d6d60bad5ee55f5a263e2f907dff3f3  # commit being built
$ PULL_REQUEST=3                                   # optional pull request number

$ curl \
    --header "X-Couverture-Pull-Request: $PULL_REQUEST" \
    --data-binary @$REPORT_FILE \

JOB_NAME: The name of the job or build. Your project may produce more than one coverage report, for example for one for Python 2.7, one for Python 3.4, and one for Javascript. The job names could then be py27, py35 and js but it's really up to you.

COVERAGE_FILE: The coverage report generated by your test suite, in the Cobertura file format.

REPO_OWNER, REPO_NAME: The owner and name of the enabled repository.

COMMIT: The commit that triggered the build.

PULL_REQUEST: If the pull request number is provided then Couverture will generate a differential coverage report and publish it on the pull request. Otherwise it is assumed that the commit was pushed outside of the context of a pull request (e.g. direct commit to master) and Couverture will save the coverage report for this commit in case a pull request is opened against it.

Differential coverage reports

Now there's really nothing else to do but to wait for Couverture to generate and publish a differential coverage report to your pull request. The coverage report status will either be SUCCEEDED or FAILED and the commit status of your pull request will be reflected appropriately. There are two possible reason in case of failure: 1) the coverage has dropped or 2) coverage has improved but not all code changes are covered.

Your report may warn you that the base coverage was not found. This means that no coverage reports was uploaded for the branch you are trying to merge into and may cause the differential report to not display some coverage changes.

Frequently Asked Questions

Thanks for asking!

How mature is Couverture?

Couverture is currently in beta so if you see something, say something! By email is best, you will be thanked warmly.

Does it work with non-GitHub providers?

Not right now. If you are interested to use Couverture with other providers such as Bitbucket or GitLab, let us know by email as it will help priotarize what to focus on next.

Can I use Couverture with my private repos?

Not yet, but this will likely be a paid feature eventually. Interested? Let us know by email. The higher the demand, the faster it will happen.

Which coverage reports are supported?

Cobertura reports, an XML file format, are the only reports we currently support. Want more? Let us know which format you would like to see supported! Note that tools may be available to convert your coverage reports to cobertura.

Is my programming language supported?

Very likely! Most programming languages have tools to generate coverage reports in the cobertura format.

What does "couverture" mean?

It's a French word and it translates to "blanket" in English. Random factoid: Couverture is also a form of chocolate with a high proportion of cocoa butter, used in dipping and coating to make food even more delicious.

How can we get in touch?

Twitter, Email, or Slack. Either one, we stay on top of it and respond in a reasonable amount of time.