4 Coverage
Build it yourself. Read the tutorial is the other way to read this part.
This walk goes through rahuldave/cheesecracker on GitHub. This part starts from the code at step-03. The code before this part
If you start at this part, make your clone as Get the project says, and then run this command. It puts in your clone the files that this part starts from. A file that the project deleted before this part stays, so delete it if git check lists it:
git fetch --quiet --tags --force origin; git rm -rq --cached --ignore-unmatch -- :/ && git restore --source step-03 --staged --worktree -- :/just setupTwenty-one tests pass, and we still do not know which lines of the app they run. Coverage counts the lines of the
package api that run during the tests, and lists the lines that no test ran.
4.1 pytest-cov, to measure what the tests run
A line that no test runs can break with no test failing. pytest-cov adds the
option --cov to pytest. The option prints a table with each file and the share of its lines that ran. It is a tool
of the tests, so it goes into the group test.
uv add --group test pytest-covThe check runs the unit tests alone, with coverage of the package api.
uv run pytest tests/unit --cov=api -qThe table shows utils.py at 100% and service.py at 0%. The unit tests call power(), and never the app.
Check your files against this move. The command prints nothing when they match, and otherwise shows what differs:
git check 54de20e8055eIf you are stuck, this command puts the files of this move in place of yours. A file that you made yourself stays:
git fetch --quiet --tags --force origin; git restore --source step-03 --staged -- :/ && git restore --source 54de20e8055e --staged --worktree -- :/What changed
pyproject.toml: pytest-cov, in the grouptest. 1 line added. It comes fromuv add --group test pytest-cov. The file- look at
"pytest-cov>=7.1.0",
- look at
uv.lock: the exact versions of pytest-cov, and of coverage, which it uses. 115 lines added. It comes fromuv add --group test pytest-cov. The file
The diff that uv add --group test pytest-cov makes in pyproject.toml
@@ -20,6 +20,7 @@ test = [
"httpx2>=2.13.1",
"pytest>=9.1.1",
"pytest-asyncio>=1.4.0",
+ "pytest-cov>=7.1.0",
]
[tool.pytest.ini_options]4.2 just cov shows which lines the tests run
The recipe cov runs every test with coverage, and adds the column Missing, with the numbers of the lines that no
test ran.
Apply the patch to justfile, from the top of the project:
curl -fsSL https://github.com/rahuldave/cheesecracker/commit/bfb9c783c67c31254ce8136784738c0f2fc17fb5.diff | git apply --include=justfileRead the recipe cov at the end of the justfile.
just cov -qThe total is 95%. service.py misses line 31, the answer of /health, because no test asks for it.
Check your files against this move. The command prints nothing when they match, and otherwise shows what differs:
git check bfb9c783c67cIf you are stuck, this command puts the files of this move in place of yours. A file that you made yourself stays:
git fetch --quiet --tags --force origin; git restore --source 54de20e8055e --staged -- :/ && git restore --source step-04 --staged --worktree -- :/What changed
justfile: the recipecov. 4 lines added. The file- look at
uv run pytest --cov=api --cov-report=term-missing "$@"
- look at
The patch to justfile
@@ -40,3 +40,7 @@ stop:
done
echo "stop: the server still answers after 30 seconds" >&2
exit 1
+
+# Run the tests, and show which lines of the package api they ran. Extra arguments go to pytest: just cov tests/unit
+cov *args:
+ uv run pytest --cov=api --cov-report=term-missing "$@"This part ends at the code at step-04. The code after this part