Python下测试覆盖率用的比较多的是 coverage。
coverage
官方文档:https://coverage.readthedocs.io/
安装
方法1:pip安装
pip install coverage
方法2:下载安装包安装
https://pypi.org/project/coverage/
使用
pytest
coverage run -m pytest
unittest
coverage run -m unittest discover
nosetest
coverage run -m nose arg1 arg2
参数
使用--source=.
来指定当前路径
命令
coverage report -m
打印当前测试覆盖率结果。
coverage html
在执行目录下生成一个 htmlcov 文件夹,可以打开该文件夹的 index.html 文件查看当前测试覆盖率结果。
coverage run
运行Python程序并收集覆盖率数据。
coverage combine
合并多个数据覆盖率数据。
coverage erase
清除当前目录下所收集的测试覆盖率数据。
coverage xml
生成xml报告文件。
coverage json
生成json报告文件。
coverage annotate
用覆盖率结果数据来注释源文件。
coverage debug
获取debug信息。
coverage help
帮助。
coverage run
在默认情况下,这个命令会测量所有除了标准库的代码。
coverage run test_xxx.py arg1 arg2
运行单个测试文件。
coverage run -m packagename.modulename arg1 arg2
运行指定一个可导入的模块名
--branch
参数,可以进行分支覆盖测量。
若程序中的某一行能够跳转到多个下一行(例如if语句),那么coverage会跟踪实际访问过哪些目标,并且标记出没有被访问的代码。相应的html报告中,未执行的分支以黄色显示,右侧注释也会显示未执行的分支行号。
--source
参数,可以配置要测量的源,该值是用逗号或换行符分隔的目录或包名称的列表。如果指定,将仅测量这些目录或软件包中的源文件。这里只会考虑可以正常导入的文件。
值得注意的是,这里的source执行的时候实际上就是import,所以不支持xxx*
这种匹配模式
--include
或者--omit
参数可以进一步选择要测量的文件,--include
用于指定测量的文件,--omit
用于指定不测试的文件。具体文件参数遵从Linux语法规则。
例如:
[run]
omit =
# omit anything in a .local directory anywhere
*/.local/*
# omit everything in /usr
/usr/*
# omit this single file
utils/tirefire.py
--concurrency
参数,默认情况下 coverage 可以测量多线程程序,但是如果程序有更复杂的并发性,比如说同时使用了 multiprocessing,greenlet,eventlet或gevent库,可以指定--concurrency
参数,参数的值multiprocessing
, thread
, greenlet
, eventlet
, 或者gevent
。
--parallel-mode
参数,可以测量多个计算机或者多进程的程序。这样会在测试期间将数据分开,最后使用combine
合并即可。
--context
参数,测量静态上下文。帮助文档 https://coverage.readthedocs.io/en/coverage-5.2.1/contexts.html#contexts
coverage report
-m
可以显示未测量的语句的行号。
--skip-covered
可以跳过显示100%覆盖率的文件。
--no-skip-covered
查看所有文件。
--skip-empty
跳过所有文件
--precision
以百分比表示的小数点后显示的位数,默认为无。
--sort
对报告按列的名称进行排序。
--include
和--omit
同上,可以使用来过滤。
--fail-under
提供一个值,如果小于这个值,会以状态码2退出。
coverage html
-d
参数指定输出目录,默认为“ htmlcov”。
--skip-covered
可以跳过显示100%覆盖率的文件。
--skip-empty
跳过所有文件。
--precision
以百分比表示的小数点后显示的位数,默认为无。
--contexts
如果记录了上下文,这个参数可以来选择要报告的上下文,--show-contexts
将用运行它们的上下文来注释行。
coverage debug
coverage debug sys
config
: 显示coverage的配置
sys
: 显示系统配置
data
: 显示收集的覆盖率数据的摘要
premain
: 显示调用堆栈的调用范围
--debug
可以在所有命令上使用。它采用逗号分隔的选项列表,每个选项都指示要记录的操作方面:
callers
: 在每个调试消息上标注调用者到该点的堆栈跟踪信息。config
: 开始之前,转储所有配置 值。dataio
: 在读取或写入任何数据文件时记录。dataop
:记录何时将数据添加到CoverageData对象。multiproc
: 记录多处理进程的开始和停止。pid
: 注释所有警告,并使用进程和线程ID调试输出。plugin
: 打印有关插件操作的信息。process
: 显示流程创建信息,以及当前目录中的更改。self
: 用打印消息的对象注释每个调试消息。sql
: 记录用于记录数据的SQL语句。sys
: 在开始之前,请转储所有系统和环境信息,就像coverage debug sys一样。trace
: 打印有关是否跟踪文件的所有决定。对于未跟踪的文件,还会给出原因。
配置文件
默认的配置文件名是.coveragerc
,可以使用--rcfile=FILE
命令行参数或者配置COVERAGE_RCFIL
环境变量来配置。
示例文件:
# .coveragerc to control coverage.py
[run]
branch = True
[report]
# Regexes for lines to exclude from consideration
exclude_lines =
# Have to re-enable the standard pragma
pragma: no cover
# Don't complain about missing debug-only code:
def __repr__
if self\.debug
# Don't complain if tests don't hit defensive assertion code:
raise AssertionError
raise NotImplementedError
# Don't complain if non-runnable code isn't run:
if 0:
if __name__ == .__main__.:
ignore_errors = True
[html]
directory = coverage_html_report
具体的参数值:https://coverage.readthedocs.io/en/coverage-5.2.1/config.html
pytest-cov
pytest-cov
这个是 pytest 的 coverage 插件,使用的还是coverage。
官方文档:http://pytest-cov.rtfd.org/
pip安装:pip install pytest-cov
可以在pytest后面带参数 --cov-config=./.coveragec --cov-report html --cov=./
生成在当前目录下测量的HTML报告。生成的HTML报告保存的默认文件夹为 htmlcov,打开里面的index.html即可查看覆盖率报告。
其中 --cov-config=./.coveragec
参数将读取当前目录下的 .coveragec
作为配置文件,创建.coveragerc
即可。
--cov-report html
参数指的是生成 html报告, --cov=
后面接的路径指定source路径,如果单独使用 --cov
则读取配置文件的source路径
下面的配置文件表示启用分支覆盖测量,并忽略测量 migrations中的内容。
[run]
branch = True
omit =
*/migrations/*
更多具体的配置文件参数值:https://coverage.readthedocs.io/en/coverage-5.2.1/config.html
一般在项目中只需要使用 pytest-cov 即可。