Testing coverage#
Code coverage tells you how much of your code is ran by your tests. While this is a crude metrics and does not ensure that your tests are good, at least it points your towards blind spots in your tests!
So coverage, one more tool for testing? Fortunately there is a test coverage plugin for pytest: pytest-cov.
Adding pytest-cov#
The first thing is to add the dependency:
[project.optional-dependencies]
# add dependencies used for testing here
test = ["pytest", "pytest-cov"]
Then, let's add some parameters to coverage:
# https://coverage.readthedocs.io/en/6.4/config.html
[tool.coverage.report]
exclude_lines = [
"pragma: no cover",
"if TYPE_CHECKING:",
"@overload",
"except ImportError",
"\\.\\.\\.",
"raise NotImplementedError()",
]
[tool.coverage.run]
source = ["src"]
Finally, let's grab the dependencies using the test dependency group:
Run your tests with coverage#
Now you can check coverage report using the following pytest command:
$ pytest --color=yes --cov --cov-report=html --cov-report=term-missing
====================== test session starts =========================
platform darwin -- Python 3.10.10, pytest-7.3.0, pluggy-1.0.0
rootdir: /Users/joran.deschamps/git/pydev/pydev-tutorial
configfile: pyproject.toml
testpaths: tests
plugins: cov-4.0.0
collected 17 items
tests/test_swallow.py ................. [100%]
--------- coverage: platform darwin, python 3.10.10-final-0 ----------
Name Stmts Miss Cover Missing
--------------------------------------------------------------
src/pydev_tutorial/__init__.py 7 2 71% 7-8
src/pydev_tutorial/swallow.py 26 2 92% 40, 43
--------------------------------------------------------------
TOTAL 33 4 88%
Coverage HTML written to dir htmlcov
======================= 17 passed in 0.14s ========================
This should have created a htmlcov directory. Open index.html and click on the files name to see which lines are missing in the test coverage!
In __init__.py, there are:
This can be excluded using the exclude_lines in pyproject.toml. But in general you don't want to exclude lines just because we didn't test for them!
What lines are missing in swallow.py?
Check the missing lines and implement tests to reach 100% coverage!