1.介绍
Coverage工具用于测量Python代码覆盖率。Coverage使用代码分析工具和python标准库提供的trace函数确认哪一行代码可以执行和那一行代码已经被执行,因此被测试代码不能复写trace函数。
2.版本
Coverage.py支持如下Python版本:
·CPython 2.6, 2.7 and 3.3到3.7.
·PyPy2 5.6和PyPy3
5.5.
·Jython 2.7.1,可运行无报告.
·IronPython 2.7.7,可运行无报告.
3.安装
Coverage.py可以采用pip install
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 arg2为my_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参数,但要记住—branch是coverage的子命令,需要放在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'defbubble(data):"""冒泡排序程序:paramdata::return:
"""foriinrange(len(data)-1):forjinrange(len(data)-1-i):ifdata[j] > data[j+1]:
data[j], data[j+1] = data[j+1], data[j]returndataif__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文件可以查看覆盖率数据。

本文详细介绍了Python的代码覆盖率工具Coverage.py的使用,包括它支持的Python版本、安装方式、基本指令、运行方法、常见警告、数据存储、报告生成以及实例演示。通过Coverage.py,开发者可以测量代码执行的覆盖率,提升测试质量。

2984

被折叠的 条评论
为什么被折叠?



