资讯专栏INFORMATION COLUMN

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

marser / 3548人阅读

摘要:被测脚本只有正常退出或者以信号退出才能出发,才能得到覆盖率结果。如果直接或者用其他信号终止进程,覆盖率结果将会丢失参考文章脚本覆盖率分析方法介绍。

关于Coverage

Coverage是Python代码覆盖率分析工具,有关它的介绍和安装方法请见:
Python代码覆盖率分析工具Coverage

用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终止后,才出现统计结果:

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可以直接点击进入代码文件查看。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37618.html

相关文章

  • 使用Coverage分析WSGI项目代码盖率

    摘要:由于构造函数不支持参数,必须使用配置文件。使用文件作为的配置文件一般的项目都是多进程,这需要分析子进程的覆盖率,需要用到配置文件。这里文档说在构造函数里使用参数可以限制,实测,没有用会删除文件,保证不会影响下次统计的结果。 关于Coverage Coverage是Python代码覆盖率分析工具,有关它的介绍和安装方法请见:Python代码覆盖率分析工具Coverage 用Python启...

    YFan 评论0 收藏0
  • Python代码盖率分析工具Coverage

    摘要:简介是一种用于统计代码覆盖率的工具,通过它我们可以检测测试代码的有效性,即测试对被测代码的覆盖率如何。支持分支覆盖率统计,可以生成报告。 Coverage简介 Coverage是一种用于统计Python代码覆盖率的工具,通过它我们可以检测测试代码的有效性,即测试case对被测代码的覆盖率如何。Coverage支持分支覆盖率统计,可以生成HTML/XML报告。XML报告可以集成入Jenk...

    zombieda 评论0 收藏0
  • Chrome DevTools 代码盖率功能详解

    摘要:本文会介绍新增的代码覆盖率功能如何收集数据如何基于它收集的数据来改进应用的性能。动态分析是指在应用运行状态下收集代码执行数据的过程,换句话说,覆盖率数据就是在代码执行过程中通过标记收集到的。 showImg(https://segmentfault.com/img/remote/1460000009013741); 共 1812 字,读完需 3 分钟。工欲善其事必先利其器,前端周刊本周...

    robin 评论0 收藏0
  • 通过demo学习OpenStack开发所需基础知识 -- 单元测试

    摘要:本文将进入单元测试的部分,这也是基础知识中最后一个大块。本文将重点讲述和中的单元测试的生态环境。另外,在中指定要运行的单元测试用例的完整语法是。中使用模块管理单元测试用例。每个项目的单元测试代码结构可 本文将进入单元测试的部分,这也是基础知识中最后一个大块。本文将重点讲述Python和OpenStack中的单元测试的生态环境。 单元测试的重要性 github上有个人画了一些不同语言的学...

    douzifly 评论0 收藏0
  • 2021年软件测试工具总结——单元测试工具

    摘要:单元测试框架作为的标准库,是其他单元测试框架的基础。可以和和配合使用编写单元测试。官网地址单元测试覆盖率工具单元测试中还需要用到代码覆盖率工具。代码覆盖率统计工具用来发现没有被测试覆盖的代码,完善单元测试的覆盖率。 在应用程序中,单元是具有一个或多个输入和单个输出的软件中最小可测试部分。单元...

    qingshanli1988 评论0 收藏0

发表评论

0条评论

marser

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<