Python 测试覆盖率 coverage

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可以在所有命令上使用。它采用逗号分隔的选项列表,每个选项都指示要记录的操作方面:

配置文件

默认的配置文件名是.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 即可。