Python test coverage
SonarQube supports the reporting of test coverage information as part of the analysis of your Python project.
However, SonarQube does not generate the coverage report itself. Instead, you must set up a third-party tool to produce the report as part of your build process. You then need to configure your analysis to tell the SonarScanner where the report is located so that it can pick it up and send it to SonarQube, where it will be displayed on your project dashboard along with the other analysis metrics.
To enable coverage, you need to:
- Adjust your build process so that the coverage tool runs before the scanner report generation step runs.
- Make sure that the coverage tool writes its report file to a defined path in the build environment.
- Configure the scanning step of your build so that the scanner picks up the report file from that defined path.
The details of setting up coverage within your build process depend on which tools you are using. In our example we use:
- Tox, to configure the tests
- Pytest, to execute the tests
- Coverage, (the Coverage.py tool,) to measure code coverage, and
- GitHub Actions, to perform the build. Alternatively, we could start the test by invoking the Coverage.py tool (the command
coverage) with the
pytestinvocation as an argument, like this:
Note that we specify
relative_files = True in the
tox.ini file to ensure that your coverage results are correctly parsed.
The following shows how to configure the GitHub Actions build file for your Python project so that it works in conjunction with the
tox.ini configuration file described above to generate code coverage. Your
build.yml file should look something like this:
First of all, install all of your project dependencies and then invoke
tox to run your tests and generate a coverage report file.
If, as here, you do not specify an output file, the scanner will look for report paths located under the default
If you are using a different package manager or a different testing tool these details will be different.
The essential requirements are that the tool produces its report in the Cobertura XML format and writes it to a place from which the scanner can then pick it up.
The next step is to add
sonar.python.coverage.reportPaths to your analysis parameters. This parameter must be set to the path of the report file produced by your coverage tool. In this example, that path is set to the default produced by Coverage.py. It is set in the
sonar-project.properties file, located in the project root:
As with other analysis parameters,
sonar.python.coverage.reportPaths can be set in multiple places:
- In the
sonar-project.propertiesfile, as mentioned above.
- On the command line of the scanner invocation using the
--defineswitch, for example:
- In the SonarQube interface under Your Project > Project Settings > General Settings > Languages > Python > Tests and Coverage for project-level settings, and Administration > Configuration > General Settings > Languages > Python > Tests and Coverage for global settings (applying to all projects).
© 2008-2023, SonarSource S.A, Switzerland. Except where otherwise noted, content in this space is licensed under a Creative Commons Attribution-NonCommercial 3.0 United States License. SONARQUBE is a trademark of SonarSource SA. All other trademarks and copyrights are the property of their respective owners.