combine python coverage files?
Question:
I’m wondering if it’s possible to combine coverage.xml
files into 1 file to see global report in HTML output.
I’ve got my unit/functional tests
running as 1 command and integration tests
as the second command. That means my coverage for unit/functional tests
are overridden by unit tests
.
That would be great if I had some solution for that problem, mainly by combining those files into 1 file.
Answers:
You can’t combine .xml files, but you can combine the raw data files. Your workflow would look like this:
$ COVERAGE_FILE=.coverage_func coverage run the_functional_tests.py
$ COVERAGE_FILE=.coverage_inte coverage run the_integration_tests.py
$ coverage combine
$ coverage xml
I found a different solution. I used combine
feature (read here)
So I run my coverage like: coverage run -p
and then I do coverage combine
.
If you want to keep the old reports, you can use --keep
.
That’s all. It generates 1 combined report.
You can achieve same result by using appending option. Suppose you ran the coverage on three python scripts.After first coverage use -a for appending.
coverage run first.py
coverage run -a second.py
coverage run -a third.py
Print the report
coverage report -m
Output:Report
Name Stmts Miss Cover Missing
----------------------------------------------
first.py 97 1 99% 95
second.py 1 0 100%
third.py 10 0 100%
----------------------------------------------
TOTAL 108 1 99%
If your source code is in a directory called my_project
, you can also do this if you have included pytest
and pytest-cov
in your virtual environment:
pytest --cov-report html --cov=my_project unit_tests
pytest --cov-report html --cov=my_project --cov-append functional_tests
The --cov-append
will add the functional test coverage info to the coverage file that was created when you ran the unit tests.
I had similar case where I had multiple packages and each of them had its tests and they were run using own testrunner. so I could combine all the coverage xml by following these steps.
-
Indivisually generate the coverage report.
You would need to naviagte to each package and generate the report in that package. This would create .coverage
file. You can also add [run]parallel=True
in your .coveragerc
to create coverage file appended with machine name and processid.
-
Aggregate all the reports.
You need to copy all the .coverage
files to for these packages to a seaparte folder. You might want to run a batch or sh script to copy all the coverage files.
-
Run combine.
Now naviagte tp the folder when you have all the report files and then run coverage combine
. This will delete all the coverage files and combine it to one .coverage
file. Now you can run coverage html
and coverage xml
.
I’m wondering if it’s possible to combine coverage.xml
files into 1 file to see global report in HTML output.
I’ve got my unit/functional tests
running as 1 command and integration tests
as the second command. That means my coverage for unit/functional tests
are overridden by unit tests
.
That would be great if I had some solution for that problem, mainly by combining those files into 1 file.
You can’t combine .xml files, but you can combine the raw data files. Your workflow would look like this:
$ COVERAGE_FILE=.coverage_func coverage run the_functional_tests.py
$ COVERAGE_FILE=.coverage_inte coverage run the_integration_tests.py
$ coverage combine
$ coverage xml
I found a different solution. I used combine
feature (read here)
So I run my coverage like: coverage run -p
and then I do coverage combine
.
If you want to keep the old reports, you can use --keep
.
That’s all. It generates 1 combined report.
You can achieve same result by using appending option. Suppose you ran the coverage on three python scripts.After first coverage use -a for appending.
coverage run first.py
coverage run -a second.py
coverage run -a third.py
Print the report
coverage report -m
Output:Report
Name Stmts Miss Cover Missing
----------------------------------------------
first.py 97 1 99% 95
second.py 1 0 100%
third.py 10 0 100%
----------------------------------------------
TOTAL 108 1 99%
If your source code is in a directory called my_project
, you can also do this if you have included pytest
and pytest-cov
in your virtual environment:
pytest --cov-report html --cov=my_project unit_tests
pytest --cov-report html --cov=my_project --cov-append functional_tests
The --cov-append
will add the functional test coverage info to the coverage file that was created when you ran the unit tests.
I had similar case where I had multiple packages and each of them had its tests and they were run using own testrunner. so I could combine all the coverage xml by following these steps.
-
Indivisually generate the coverage report.
You would need to naviagte to each package and generate the report in that package. This would create.coverage
file. You can also add[run]parallel=True
in your.coveragerc
to create coverage file appended with machine name and processid. -
Aggregate all the reports.
You need to copy all the.coverage
files to for these packages to a seaparte folder. You might want to run a batch or sh script to copy all the coverage files. -
Run combine.
Now naviagte tp the folder when you have all the report files and then runcoverage combine
. This will delete all the coverage files and combine it to one.coverage
file. Now you can runcoverage html
andcoverage xml
.