[百度分享]Python脚本覆盖率分析方法介绍(二)

rethee 2010-11-11 01:10:51
加精
上篇回顾:[百度分享]Python脚本覆盖率分析方法介绍(一)

Coverage3.3.1基本功能介绍
Coverage是一个用于统计python代码覆盖率的工具,支持HTML报告生成,最新版本支持对分支覆盖率进行统计。
获取地址:http://pypi.python.org/pypi/coverage
官方站点:http://nedbatchelder.com/code/coverage/

进阶功能
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()。
...全文
1632 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
Teng_s2000 2010-12-29
  • 打赏
  • 举报
回复
lclhurricane 2010-12-28
  • 打赏
  • 举报
回复
学习了。对于我来说很先进
软件开发者 2010-12-27
  • 打赏
  • 举报
回复
找了很就好啊
jinfengvip 2010-12-27
  • 打赏
  • 举报
回复
分支覆盖是在最新版本的Coverage中提供的。
robin41209 2010-12-27
  • 打赏
  • 举报
回复
来看看,学习学习。
qqqq123qwer 2010-12-27
  • 打赏
  • 举报
回复
飘过。百度不是好怂
q107770540 2010-12-25
  • 打赏
  • 举报
回复
奔标题而来
wing7742 2010-12-25
  • 打赏
  • 举报
回复
奔标题而来
xqfei18 2010-12-25
  • 打赏
  • 举报
回复
我来学习的。看过,谢谢分享
a514919394 2010-12-24
  • 打赏
  • 举报
回复
试试哈哈~~
dzy1980 2010-12-24
  • 打赏
  • 举报
回复
好东西,看看
fibbery 2010-11-13
  • 打赏
  • 举报
回复
为什么不写到一个帖子中?
playmud 2010-11-12
  • 打赏
  • 举报
回复
百度的员工吧
iambic 2010-11-11
  • 打赏
  • 举报
回复
还有百度VIP这个头衔?百度分享又是什么?

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧