您的位置:首页 > 编程语言 > Python开发

使用Coverage分析Python web项目的代码覆盖率

2016-03-15 10:34 776 查看

http://www.thinksaas.cn/group/topic/396057/

用Python启动的web服务可以方便地使用Coverage分析其覆盖率,假设一个web服务,它的启停命令如下:

sudo python xxx/main.py --port=8888 --logging=none > /dev/null 2>&1 &
ps auxf|grep xxx/main.py |grep -v grep |awk '{print $2}'|sort -r| sudo xargs kill

像这样用python启动的服务可以使用Coverage命令行启动,用kill -2的关闭,即可统计代码覆盖率。

启停命令

使用如下启停命令:

sudo coverage run --parallel-mode --branch --include="yyy/*"xxx/main.py --port=8888 --logging=none > /dev/null 2>&1 &
ps auxf|grep xxx/main |grep -v grep |awk '{print $2}'|sort -r|sudo xargs kill -2

与原来的命令区别在启动命令用coverage run和一组参数替代python,停止命令用kill -2杀进程

解释一下启动命令参数:

--parallel-mode:使Coverage监测被测代码子进程的覆盖率,如果被测代码是多进程的,必须使用此参数;

--branch:统计分支代码覆盖率,加上这个参数可使统计更精确,具体区别参见文档:http://coverage.readthedocs.org/en/latest/branch.html

--include: 限定要统计代码的路径,如果不限定,Coverage会把请求涉及到的所有代码,包括系统库和Tornado框架的代码都分析一遍,会大大拉低代码覆盖率;

各参数具体可参见:http://coverage.readthedocs.org/en/latest/cmd.html

停止命令,必须使用kill -2。 这是因为Coverage在实现上使用了atexit模块注册一个回调函数,在Python退出时将内存中的覆盖率结果写到文件中。被测脚本只有正常退出或者以SIGINT 2信号退出才能出发atexit,才能得到覆盖率结果。如果直接kill(SIGTERM 15)或者用其他信号终止进程,覆盖率结果将会丢失(参考文章:Python脚本覆盖率分析方法介绍)。

CTRL+C发的即是SIGINT 2信号,所以前台启动的服务用CTRL+C停止后可以出结果

Coverage结果收集

服务必须以coverage run启动,并以kill -2终止后,才出现统计结果:
<code>
xxx@xxx:/xxx/$ ll
total 2708
drwxr-xr-x 11 root root 4096 Sep 25 11:46 ./
drwxr-xr-x 6 root root 4096 Sep 25 08:30 ../
-rw-rw-rw- 1 root root 284691 Sep 25 11:46 .coverage.xxx.15845.747211
-rw-rw-rw- 1 root root 284917 Sep 25 11:45 .coverage.xxx.15846.592706
-rw-rw-rw- 1 root root 284274 Sep 25 11:45 .coverage.xxx.15847.688607
-rw-rw-rw- 1 root root 284583 Sep 25 11:45 .coverage.xxx.15858.136003
-rw-rw-rw- 1 root root 284274 Sep 25 11:46 .coverage.xxx.15867.746159
-rw-rw-rw- 1 root root 284691 Sep 25 11:46 .coverage.xxx.15876.004083
-rw-rw-rw- 1 root root 283820 Sep 25 11:46 .coverage.xxx.15886.921243

每个.coverage.xxx文件代表一个子进程的覆盖率,文件名格式为.coverage.<机器名>.<进程号>.<随机数>。

测试结束后,需要合并测试结果,生成报告:

coverage combine
coverage report -m
coverage html
coverage xml
coverage erase


combine会合并7个.coverage.xxx文件成1个.coverage,因为最后Coverage统计的是.coverage的结果。

report/html/xml:直接在终端显示报告/生成html报告/生成xml报告。

erase会删除.coverage文件,保证不会影响下次统计的结果。

生成的报告非常清晰,html和xml可以直接点击进入代码文件查看。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: