Chinaunix首页 | 论坛 | 博客
  • 博客访问: 221283
  • 博文数量: 70
  • 博客积分: 1415
  • 博客等级: 上尉
  • 技术积分: 920
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-08 11:53
文章分类

全部博文(70)

文章存档

2011年(1)

2010年(69)

我的朋友

分类: Python/Ruby

2010-11-12 08:01:56

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()。
阅读(773) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-01-04 20:13:05

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com