pytest-cov:给 pytest 测试加上覆盖率报告
文章目录
- pytest-cov:给 pytest 测试加上覆盖率报告
- 1、这玩意儿是干嘛的
- 2、比直接用 coverage run 强在哪
- 3、安装和基本用法
- 4、适合哪些人用
pytest-cov:给 pytest 测试加上覆盖率报告
pytest-cov 在 GitHub 上已经拿到 2,043 Star 了。
这是个 pytest 插件,用途很单一:在跑测试的时候顺手把代码覆盖率算出来,输出成报告。对写 Python 项目的人来说,测试和覆盖率基本是标配,pytest-cov 就是把这两件事串在了一起。
1、这玩意儿是干嘛的
pytest 本身是个 Python 测试框架,写测试、跑测试、生成报告都很顺手。但测完了,你总得知道哪些代码跑过、哪些没跑过吧?pytest-cov 就是干这个的。
它底层用的是 coverage.py,但做成了插件形式,直接挂到 pytest 里面。跑测试的时候加一行参数,覆盖率报告就跟着出来了,不用单独跑 coverage 命令。
2、比直接用 coverage run 强在哪
有人可能觉得,直接用coverage run -m pytest不也一样吗?还真不完全一样。
pytest-cov 做了几件事,是直接用 coverage 搞不定的:
第一,自动处理 .coverage 文件。多个测试进程跑下来,coverage 数据能自动合并,不用你手动擦除再拼接。
第二,支持详细的覆盖率上下文。加个--cov-context=test,每条测试用例的名称都会记录在上下文里,包括参数化测试的每个参数组合。排查哪条测试覆盖了哪行代码,这个信息很有用。
第三,跟 pytest-xdist 兼容。你开多进程跑测试,或者上远程解释器,覆盖率数据照样能汇总,不会丢。
第四,sys.path 的行为跟直接跑 pytest 保持一致。用coverage run的时候,当前工作目录会被塞进 sys.path,pytest-cov 不会有这个问题。
3、安装和基本用法
安装一条命令:
pip install pytest-cov如果要在分布式环境下跑,顺便把 pytest-xdist 也装上:
pip install pytest-xdist跑测试的时候加上 coverage 参数:
pytest --cov=myproj tests/这里--cov=myproj指定要统计覆盖率的模块,tests/是测试目录。终端会直接输出类似这样的报告:
-------------------- coverage: ... --------------------- Name Stmts Miss Cover ---------------------------------------- myproj/__init__ 2 0 100% myproj/myproj 257 13 94% myproj/feature4286 94 7 92% ---------------------------------------- TOTAL 353 20 94%需要把多次测试的覆盖率拼在一起,加--cov-append就行。默认情况下,每次跑测试前 .coverage 文件会被清空,保证数据干净。
从 pytest-cov 6.3 升级上来的要注意:老版本用 .pth 文件来支持子进程的覆盖率测量,7.0 版本之后这个机制被移除了,改靠 coverage 自己的 patch 选项来实现。
4、适合哪些人用
- 用 pytest 写单元测试,想看覆盖率报告的 Python 开发者
- 项目上了 pytest-xdist 分布式测试,需要汇总覆盖率数据的团队
- 想在 CI 流水线里自动生成覆盖率报告、对代码质量有要求的工程
这插件没有花哨的功能,就是把 pytest 和 coverage 接好,让你少写几行命令,少踩几个坑。
生成覆盖率报告、对代码质量有要求的工程
这插件没有花哨的功能,就是把 pytest 和 coverage 接好,让你少写几行命令,少踩几个坑。
