Python覆盖率

python覆盖率工具的入门读物

1.       介绍

Coverage工具用于测量Python代码覆盖率。Coverage使用代码分析工具和python标准库提供的trace函数确认哪一行代码可以执行和那一行代码已经被执行,因此被测试代码不能复写trace函数。

2.       版本

Coverage.py支持如下Python版本:

·    CPython 2.6, 2.7 and 3.33.7.

·    PyPy2 5.6 PyPy3 5.5.

·    Jython 2.7.1, 可运行无报告.

·    IronPython 2.7.7, 可运行无报告.

3.       安装

Coverage.py可以采用pip install coverage 指令进行安装,或在https://pypi.python.org/pypi/coverage下载需要的安装包进行安装。

4.       指令

·    run – 运行Python脚本并测试脚本代码覆盖率。

·    report – 报告脚本运行的覆盖率结果。

·    html –生成html格式的代码覆盖率报告文件。

·    xml – 生成xml格式的代码覆盖率报告文件。

·    annotate – 用覆盖结果注释源文件。

·    erase – 删除之前收集的覆盖率数据。

·    combine – 将多个覆盖率文件合并成一个。

·    debug – 调试模式。

Coverage.py使用多种指令实现覆盖率测量任务。可以采用--help子指令来查看指令的具体用法,例如coverage run –help

5.       运行

$ coverage run my_program.py arg1 arg2
blah blah ..your program's output.. blah blah

使用run指令指定要测试的覆盖率文件来进行覆盖率测量,arg1 arg2my_program.py脚本的命令行参数。

$ coverage run -m packagename.modulename arg1 arg2
blah blah ..your program's output.. blah blah

你也可以使用-m来制定要测试的覆盖率模块来进行覆盖率测量。

$ coverage run --branch my_program.py arg1 arg2
blah blah ..your program's output.. blah blah

如果你想要统计脚本的分支覆盖率,可以加入—branch参数,但要记住—branchcoverage的子命令,需要放在run命令之后,my_program.py之前,一面当成my_program.py脚本的输入参数来处理。

6.       警告

运行覆盖率统计脚本时可以出现如下警告提示:

·    “Trace function changed, measurement is likely wrong: XXX (trace-changed)”

Coverage进行代码覆盖率测量以来Python内建的trace函数,如果被测量脚本里存在trace函数覆盖Python内建trace函数,测量将被中断。

·    “Module XXX has no Python source (module-not-python)”

Coverage进行代码覆盖率测试时需要关联Python代码的源文件,coverage通过源代码文件来定位覆盖行与分支位置。

·    “Module XXX was never imported (module-not-imported)”

要测量的模块没有被正确导入。

·    “No data was collected (no-data-collected)”

要测量的模块被正确导入,但测量的模块没有被执行,因此Coverage无法收集被测量模块的数据。

·    “Module XXX was previously imported, but not measured (module-not-measured)”

要测量的模块在Coverage运行之前被导入,导致Coverage不能对被测量模块进行正确的处理,需要确保被测量模块导入在Coverage运行之后。

·    “–include is ignored because –source is set (include-ignored)”

Both --include and --source were specified while running code. Both are meant to focus measurement on a particular part of your source code, so --include is ignored in favor of --source.

7.       数据

Coverage测量的覆盖率数据默认存储在“.coverage”文件,可以设置COVERAGE_FILE环境变量改变默认的文件名。

$ coverage erase

Erase指令可以清空数据文件里的内容。

$ coverage combine

Combine指令可以合并多个机器不同进程的数据文件。

8.       报告

Coverage提供report, html, annotate, and xml命令用于生成报告。 --include  –omit子命令用于指定白名单与黑名单。当源文件找不到时可以使用--ignore-errors子命令强制生成报告。--fail-under子命令可以设置覆盖率的最低阈值,当覆盖率低于指定阈值时命令行将接收到状态码2

9.       实例

我们新建一个sort.py文件,写入如下代码:

#coding=utf-8

__author__ = 'damao'

def bubble(data):
   
"""
   
冒泡排序程序
   
:param data:
   
:return:
    """
   
for i in range(len(data)-1):
       
for j in range(len(data)-1-i):
           
if data[j] > data[j+1]:
                data[j], data[j+
1] = data[j+1], data[j]
   
return data

if __name__ == '__main__':
    data = [
5, 3, 8, 6, 1, 4, 7, 2]
    bubble(data)

我们进入sort.py文件所在目录执行coverage run sort.py运行覆盖率统计程序,会在目录生成.coverage文件。.coverage文件是文本文件我们可以使用文本编辑器进行编辑,不过要注意文件格式随着coverage工具的版本可能会改变。

我们使用coverage report指令生成覆盖率报告,想生成带分支的覆盖率报告可以使用coverage run --branch sort.py从新生成.coverage文件,再执行coverage report指令。

Name      Stmts   Miss Branch BrPart  Cover

-------------------------------------------

sort.py      10      0      8      1    94%

我们还可以使用coverage html指令生成网页格式的覆盖率报表,默认生成在htmlcov文件夹下,使用浏览器打开sort_py.html文件可以查看覆盖率数据。
attachments-2018-01-tqeqYfXg5a703c6660d2d.png

  • 发表于 2018-01-30 17:36
  • 阅读 ( 530 )

0 条评论

请先 登录 后评论
不写代码的码农
大猫

警长

1 篇文章

作家榜 »

  1. hey girl 181 文章
  2. 王前前 137 文章
  3. 柠檬 118 文章
  4. lamking 105 文章
  5. 云少 105 文章
  6. 腾讯移动品质中心TMQ 98 文章
  7. humortony 82 文章
  8. 开心的阳光 41 文章