coverage gutters 不显示 python 覆盖率是因为 pytest-cov 未生成其识别的 xml 格式且路径不匹配;需显式指定 --cov-report=xml:coverage.xml、正确设置 --cov=src、确保 coverage.xml 位于项目根目录且非空,并将 pytestargs 配置为数组而非字符串。

Coverage Gutters 不显示 Python 覆盖率,不是插件坏了,而是 pytest-cov 没生成它认的格式,且路径没对齐。
为什么 Coverage Gutters 读不到覆盖率?
它只解析 coverage.xml 或 lcov.info,但 pytest --cov=. 默认生成的是二进制 .coverage 文件——完全被忽略。
- 必须显式加
--cov-report=xml:coverage.xml(不能只写--cov-report=xml,后者可能覆盖路径或生成在子目录) -
coverage.xml必须出现在项目根目录,且非空;用head -n 5 coverage.xml看是否以<?xml开头 - 如果源码在
src/下,--cov=.会统计整个目录(含tests/),应改为--cov=src
VSCode 的 pytestArgs 必须是数组,不是字符串
很多人把参数写成字符串:"--cov=. --cov-report=xml",VSCode 会把它当单个参数传给 pytest,报错 unrecognized arguments。
- 正确写法是数组:
"python.testing.pytestArgs": ["--cov=src", "--cov-report=xml:coverage.xml", "--cov-report=term-missing"] -
--cov-report=term-missing很实用:终端直接告诉你哪几行没覆盖,比等插件染色快得多 - 如果用了
pyproject.toml,确保[tool.coverage.run]里有source = ["src"],否则即使参数对了,统计范围仍是空的
路径不一致是染色失败的头号原因
打开 coverage.xml,搜索你正在编辑的文件名,看 <class name="xxx"></class> 下的 <source></source> 值,比如:<source>/home/user/project/src/utils.py</source>。而你在 VSCode 里打开的是 ./src/utils.py——前缀不匹配,就不会染色。
- 本地开发建议统一用相对路径:在
pyproject.toml或setup.cfg中配relative_files = true - 用 WSL / Docker 时,XML 里路径常是
/mnt/c/project/,可用sed -i 's|/mnt/c/|C:/|g' coverage.xml临时修正(Windows 主机) - VSCode 工作区路径必须和
coverage.xml中的<source></source>前缀完全一致,包括大小写、斜杠方向(/vs\)、开头有没有./
别依赖右键菜单刷新覆盖率——点击测试侧边栏里的 ▶️ 运行测试,Coverage Gutters 不会自动更新。它不监听测试执行,只读文件。路径和格式稍有偏差,就静默失效,而不是报错提醒。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











