I am using pytest to test my Python code.
To test for code coverage (C0 coverage) I run pytest --cov
and I can specify my desired coverage in my pyproject.toml
file like this:
[tool.coverage.report]
fail_under = 95
I get this result with a coverage a 96.30%:
---------- coverage: platform linux, python 3.8.13-final-0 -----------
Name Stmts Miss Cover
------------------------------------------------------------------------------------------------
.....................................
Required test coverage of 95.0% reached. Total coverage: 96.30%
To test for branch coverage (C1 coverage) I run pytest --cov --cov-branch
. I get this result with a coverage of 95.44%:
---------- coverage: platform linux, python 3.8.13-final-0 -----------
Name Stmts Miss Branch BrPart Cover
--------------------------------------------------------------------------------------------------------------
.....................................
Required test coverage of 95.0% reached. Total coverage: 95.44%
I get two different coverage values, so I am testing two different coverage instances. What I would like to do is be able to test for code coverage AND branch coverage with the same command, and also be able to specify two different required coverages.
For now, all I can do is execute pytest two times, with two disadvantages:
My final solution uses pytest
to execute the tests, coverage
to generate coverage reports and coverage-threshold
to interpret the results.
From coverage-theshold
's README:
A command line tool for checking coverage reports against configurable coverage minimums. Currently built for use around python's coverage.
Tools to install are: pytest
(you can also use another test runner), coverage
, coverage-threshold
.
I execute:
coverage run --branch -m pytest src/ # the --branch argument enables branch coverage
coverage json
coverage-threshold
My pyproject.toml
contains the following lines to configure:
[coverage-threshold]
line_coverage_min = 90
file_line_coverage_min = 90
branch_coverage_min = 80
file_branch_coverage_min = 80
In order:
line_coverage_min
sets a threshold for the line coverage.file_line_coverage_min
sets a threshold for the line coverage to be respected by each file.branch_coverage_min
sets a threshold for the branch coverage.file_branch_coverage_min
sets a threshold for the branch coverage to be respected by each file.The CLI options are:
> coverage-threshold --help
usage: coverage-threshold [-h] [--line-coverage-min LINE_COVERAGE_MIN]
[--branch-coverage-min BRANCH_COVERAGE_MIN]
[--combined-coverage-min COMBINED_COVERAGE_MIN]
[--file-line-coverage-min FILE_LINE_COVERAGE_MIN]
[--file-branch-coverage-min FILE_BRANCH_COVERAGE_MIN]
[--file-combined-coverage-min FILE_COMBINED_COVERAGE_MIN]
[--coverage-json COVERAGE_JSON] [--config CONFIG]
A command line tool for checking coverage reports against configurable coverage minimums
optional arguments:
-h, --help show this help message and exit
--line-coverage-min LINE_COVERAGE_MIN
minimum global average line coverage threshold
--branch-coverage-min BRANCH_COVERAGE_MIN
minimum global average branch coverage threshold
--combined-coverage-min COMBINED_COVERAGE_MIN
minimum global average combined line and branch coverage threshold
--file-line-coverage-min FILE_LINE_COVERAGE_MIN
the line coverage threshold for each file
--file-branch-coverage-min FILE_BRANCH_COVERAGE_MIN
the branch coverage threshold for each file
--file-combined-coverage-min FILE_COMBINED_COVERAGE_MIN
the combined line and branch coverage threshold for each file
--coverage-json COVERAGE_JSON
path to coverage json (default: ./coverage.json)
--config CONFIG path to config file (default: ./pyproject.toml)