Coverage3.3.1基本功能介绍
Coverage是一个用于统计python代码覆盖率的工具,支持HTML报告生成,最新版本支持对分支覆盖率进行统计。
获取地址:
官方站点:
进阶功能
Coverage还提供了很多有用的特性/功能,这里介绍几个比较有用的。
(1)数据文件合并combine
默认情况下,覆盖率数据会被写入到当前目录的.coverage文件中,但在有些情况下需要产生多个.coverage文件(比如多进程并发执行自动化测试,使用coverage –p产生形如.coverage.hostname.pid的多个数据文件),最后进行合并分析总的覆盖率,这时候就可以使用combine功能,合并成一个.coverage文件。
(2)分支覆盖分析branch
分支覆盖是在最新版本的Coverage中提供的。
API模式下,只需在创建coverage对象时制定branch=True即可,cov = coverage.coverage(branch = True);
命令行模式只能通过修改.coveragerc来打开分支覆盖功能。
(3)排除特定代码exclude
代码中可能有一部分代码是出于debug用途的,或者处在不会被触及的分支,在这种情况下,在统计覆盖率的时候可能不希望这些代码被统计在内,可以通过Coverage提供的exclude功能在统计的时候排除这些代码。
简单的排除方法是在需要被排除的代码行或者分支后面添加注释,内容为”#pragma no cover”,这样被注释的分支和代码行就会在统计中被排除。
另外可以使用正则表达式来匹配需要排除的代码行,通过coverage.exclude(regex)或者在.coveragerc中添加exclude_lines来指定。
(4).coveragerc
如上所述,一部分功能在命令行模式下只能通过修改.coveragerc来打开,如branch覆盖,exclude正则表达式等等:
# .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
经验分享
对于单元测试和直接退出的脚本,以上介绍的方式能很好的工作,但是对于后台服务类,程序中有一个mainLoop的python脚本,情况会有些许不同。
假设我们有一个脚本程序:
#mock_server.py
import time
a = 0
while True:
a += 1
if a>30:
a = 0
time.sleep(1)
我们用coverage run mock_server.py &>log &启动,一段时间后kill该进程,再用coverage report查看,会发现覆盖率结果是空的。
百思不得其解下只好查看coverage源代码,原来,coverage在实现上使用了atexit模块注册一个回调函数,在python退出时将内存中的覆盖率结果写到文件中,所以被测脚本只有正常退出或者以SIGINT 2信号退出,才能得到覆盖率结果,如果直接kill(SIGTERM 15)或者用其他信号终止进程,覆盖率结果将会丢失。
所以,要解决覆盖率丢失的问题,一种方法是在测试完毕后使用kill -2来结束进程,使atexit能捕捉到退出的信号;
或者,可以使用coverage的API方式,安装一个自定义的signal handler,捕捉其他信号,在程序退出的时候做一次coverage.save()。
阅读(799) | 评论(1) | 转发(0) |