aboutsummaryrefslogtreecommitdiff
path: root/languages/python/claude/rules
diff options
context:
space:
mode:
Diffstat (limited to 'languages/python/claude/rules')
-rw-r--r--languages/python/claude/rules/python-testing.md16
1 files changed, 16 insertions, 0 deletions
diff --git a/languages/python/claude/rules/python-testing.md b/languages/python/claude/rules/python-testing.md
index 4edde35..dedcce4 100644
--- a/languages/python/claude/rules/python-testing.md
+++ b/languages/python/claude/rules/python-testing.md
@@ -82,6 +82,22 @@ generation in-process.
See `testing.md` § Combinatorial Coverage for the general rule and when
to skip.
+## Measuring Coverage — `make coverage-summary`
+
+The bundle ships a coverage summary at `.claude/scripts/coverage-summary.py`
+and a Makefile fragment (`coverage-makefile.txt`) with `coverage` and
+`coverage-summary` targets. After `make coverage` runs the suite under
+coverage.py and writes a JSON report, `make coverage-summary` prints a
+file-weighted project number and the source files no test imported.
+
+The number to watch is that missing-file count. A module no test imports never
+appears in coverage.py's report, so a line-weighted total skips it silently and
+the suite looks healthier than it is. The summary counts every `*.py` under the
+source dir that's absent from the report as 0%, so an untested module drags the
+project number down where you can see it. It doesn't reimplement the per-file
+table — `coverage report` already prints that. Copy the fragment's targets into
+your own Makefile to adopt it; the bundle never edits your Makefile.
+
## Mocking Guidelines
### Mock these (external boundaries):