Когда покрытие кода тестами не 100%, при рефакторинге сложно отслеживать его изменения. Раньше я либо забивал на это, либо копировал секцию с покрытием и сравнивал дифф вручную в VS Code. Вот такие диффы приходилось отсматривать (тут пример игрушечный: я добавил всего один тест!):
13c13
< chatbotfront/api/rest/system.py 9 1 89% 14
---
> chatbotfront/api/rest/system.py 9 0 100%
62c62
< tests/api/test_system.py 3 0 100%
---
> tests/api/test_system.py 7 0 100%
92,93c92,93
< TOTAL 2388 105 96%
< ==================================== 208 passed in 44.62s =====================================
---
> TOTAL 2392 104 96%
> ==================================== 209 passed in 44.35s =====================================
Чтобы сделать такие проверки проще и человечнее, написал утилиту cmp-cov. Она сравнивает текущее покрытие с сохранённым baseline. Пример использования:
❯ uv run pytest --cov && uvx cmp-cov save-baseline
#...pytest output...
Saved baseline 'default' for /Users/lev/web/chat/bot/front
path: /Users/lev/.cache/cmp-coverage/%2FUsers%2Flev%2Fweb%2Fchat%2Fbot%2Ffront/default/coverage.xml
sources: 85 files in /Users/lev/.cache/cmp-coverage/%2FUsers%2Flev%2Fweb%2Fchat%2Fbot%2Ffront/default/sources
total: 95.69%Добавил тест, запустил заново — на этот раз c командой diff:
❯ uv run pytest --cov && uvx cmp-cov diff
#...pytest output...
Project: /Users/lev/web/chat/bot/front
Baseline: 'default' (/Users/lev/.cache/cmp-coverage/%2FUsers%2Flev%2Fweb%2Fchat%2Fbot%2Ffront/default/coverage.xml)
Saved: 2026-04-27 17:16:58
Total: 95.69% → 95.69% (+0.00)
↑ uncovered → covered (1 lines, 1 runs):
chatbotfront/api/rest/system.py:14
+ new covered (4 lines, 1 runs):
tests/api/test_system.py:7-10Теперь ясно видно, что изменилось в покрытии.
Из похожего есть diff-cover, но он показывает покрытие только для строк, изменённых в git diff. Мне же нужно сравнивать покрытие до и после, когда меняется сам код.
Исходный код: github.com/vrslev/cmp-cov.
Попробовать можно так: uvx cmp-cov save-baseline, поменяйте код, затем uvx cmp-cov diff.