首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

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

2012-02-10 
[百度分享]Python脚本覆盖率分析方法介绍(二)上篇回顾:[百度分享]Python脚本覆盖率分析方法介绍(一)Covera

[百度分享]Python脚本覆盖率分析方法介绍(二)
上篇回顾:[百度分享]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()。

[解决办法]
还有百度VIP这个头衔?百度分享又是什么?
[解决办法]
百度的员工吧
[解决办法]
为什么不写到一个帖子中?
[解决办法]
好东西,看看
[解决办法]
试试哈哈~~
[解决办法]
奔标题而来
[解决办法]
奔标题而来
[解决办法]
我来学习的。看过,谢谢分享
[解决办法]
来看看,学习学习。
[解决办法]
分支覆盖是在最新版本的Coverage中提供的。

[解决办法]
找了很就好啊
[解决办法]
学习了。对于我来说很先进
[解决办法]

热点排行