使用XDebug调试及单元测试覆盖率分析


Posted in PHP onJanuary 27, 2011

今天我就就自己对XDebug使用的一些体验做一小段分享。XDebug也是因为需要是用来生成覆盖率分析文件才安装的,刚接触不久,平时用的也不是很频繁,但是这个的确是一个好工具,如果想要依赖它来分析程序的性能还是需要自己亲手去试试。具体它有多好,请听我一一道来。

<?XML:NAMESPACE PREFIX = O />

 

<!--[if !supportLists]-->一、<!--[endif]-->安装篇(XDebug PHPUnit)

A:安装XDebug:

Xdebug网下载xdebug  dll文件,存放到php加载的ext目录下(可以选择重命名,比如php_xdebug.dll,然后打开php.ini文件,添加配置

[xdebug]

   zend_extension_ts = php_xdebug.dll

   xdebug.profiler_enable = on

   xdebug.trace_output_dir = D:\PHPAPP\XDebug

   xdebug.profiler_output_dir=D:\PHPAPP\XDebug

 

xdebug需要采用zend引擎加载的方式加载,所以用zend_extension_ts或是zend_extension,  tsthread_safety, 目前5.3以上才支持zend_extension加载,<5.3的用zend_extension_ts加载(或者你可以查看phpinfo是否启用了zts),然后重启apache,查看phpinfo,就发现XDebug选项了。

使用XDebug调试及单元测试覆盖率分析

可以看到xdebug.profiler_enablexdebug.profiler_output_dirxdebug.trace_output_dir这三个是我们刚刚配置的项,可以安装自己的需要配置剩余项,xdebug.profiler_enable:开启性能分析,

开启这个之后会在xdebug.profiler_output_dir这个目录下生成cachegrind.out.XXX的分析文件,如果指定了xdebug.profiler_output_name这个,则输出来的文件就会是指定的名字.xxx的格式(此方法不适合分析,原因稍后说明),

xdebug.trace_options:这个是开启跟踪项,

     开启该项之后,会在xdebug.trace_output_dir下生产跟踪文件,注意该项会影响运行速度,因为他需要记录跟踪过程中的一系列事件。

      关于XDebug还有一点需要注意的:XDebug是调试的,也就是说配置了XDebug那程序运行的就是一个Debug状态,所以这时候zend_optimizer就不能用了,总不能让程序即调试状态又处于优化状态哈。

     更多关于XDebug的,大家去网上发掘吧~~然后一起探讨哈

友情提醒:对于使用集成环境的同学,比如Wamp,它拥有两个PHP.ini配置文件,一个在Apache下,一个在PHP下,Apache下是影响web的,而PHP下是影响命令行的,所以····(感谢俊哥的提醒)

 

B:安装PHPUnit:

关于PHPUnit的安装过程,网上也已经很多了,之前自己为了终于安装成功之后也小写了篇安装篇(http://user.qzone.qq.com/414073277/blog/1292122868),所以这里就不再赘述了,网上的一些安装教程大都能完成安装。就简单说下过程:

PHPUnit安装用的是pear的安装方式,所以如果机子没有安装过pear包需要先安装下,一般在php安装的时候在其安装目录下都有一个go-pear.bat文件,直接执行即可完成安装,【这里安装需要注意扩展exif,这个扩展会用到mbstring扩展中的方法,所以mbstring的加载顺序需要再exif之上。】完成pear的安装之后就可以执行pear,查看pear的命令参数,

使用XDebug调试及单元测试覆盖率分析

然后依次执行:

pear channel-discover pear.phpunit.de   

pear install ?alldeps phpunit/PHPUnit

需要注意的是现在最新版的phpunit3.5的··但是这个只有pear的版本是1.6以上及PHP5.2.X才会安装得到最新版·否则是安装的是第一次的版本(不过不影响使用)。

安装好后就可以执行phpunit查看相关信息:

使用XDebug调试及单元测试覆盖率分析

可以看到有—coverage-html ?coverage-clover ?coverage-source这三个选项·就是因为在XDebug安装成功之后才能用,这三个对于导出覆盖率文件可是很重要的选项。

 

<!--[if !supportLists]-->二、<!--[endif]-->PHPUnit 单元测试覆盖率分析

单元测试,最重要的指标之一就是覆盖率。这点虽然Zend Studio上可以很清晰的看出来,可是要导出成一分文档就不太好使了,所以这时候XDebug就又可以帮上忙了,使用的时候也挺简单,调用命令即可:

phpunit ?coverage-html D:\PHPAPP\XDebug\  YouTest

这样就会将生成的覆盖文件(html格式的)放在D:\PHPAPP\XDebug\目录下了,

使用XDebug调试及单元测试覆盖率分析

然后就可以在放置的目录下找到一堆的html文件,运行下index.html

使用XDebug调试及单元测试覆盖率分析

就可以看到这样的图了,英文字母很简单··意思也明了就不解释了,说明一点:

测试结果说明:一共有5种,上图的例子出现了两种。

   .   :代表正确

   F    :代表断言错误

   E   :代表PHP程序错误或是异常

   I    代表没有实现的方法

   S   :  代表是跳过的方法

生产的覆盖文件说明:

Classes: 只有一个类中的所有方法都被覆盖的时候,这个类才算是被测试完的

Functions/Methods :只有一个方法或是函数的所有有效的语句代码都被执行到了才算这个方法或是函数是被测试完的

Lines:   总行数将会不饱行注释,空行,<?php ?> 标签, 及类及方法的声明。

使用phpunit ?coverage-clover D:\PHPAPP\XDebug\first.xml  YouTest

生产的将会是一个xml格式的文件,这个格式的文件效果不明显,没有html格式的好,这边的效果被我删掉了所以么有效果图可看,第三个覆盖文件的参数我没测试过,大家有兴趣可以试试。

 

<!--[if !supportLists]-->三、<!--[endif]-->程序执行性能分析

XDebug除了有效的帮助分析单元测试覆盖率之外,还可以帮组分析程序执行的瓶颈所在,开启分析的功能:

xdebug.profiler_enable = on

 xdebug.profiler_output_dir=D:\PHPAPP\XDebug

设置上面两项,然后执行你要分析的程序,就会在上面的目录下看到cachegrind.out.XXX的文件,这个文件直接打开就是一些记录,需要借助第三方的cachegrind查看工具才行,一个好用的工具是winCacheGrind,查看起来很方便。

使用XDebug调试及单元测试覆盖率分析

可以看到执行的总时间,及每个函数执行的时间。

因为这个工具在打开文件的时候,只能打开cachegrind.out.*的文件,所以待分析的文件必须是这个名字的,所以为了省去重命名,这也就是为啥我说不建议修改xdebug.profiler_output_name这个选项的原因。

 

<!--[if !supportLists]-->四、<!--[endif]-->XDebug库函数

XDebug除了上述方式外,还有自己的一些函数库提供,可以在你程序的代码段任何地方执行,具体的请看http://xdebug.org/docs/all_functions

 

XDebug的功能,还不止这些,因为他的选项·好大的一页,所以还是去http://xdebug.org/docs/这里看看官方的说明。靠谱!

PHP 相关文章推荐
php+dbfile开发小型留言本
Oct 09 PHP
实用函数10
Nov 08 PHP
解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别
Jun 24 PHP
phpstorm编辑器乱码问题解决
Dec 01 PHP
PHP下载远程文件到本地存储的方法
Mar 24 PHP
Symfony2使用Doctrine进行数据库查询方法实例总结
Mar 18 PHP
php使用CutyCapt实现网页截图保存的方法
Oct 03 PHP
PHP中in_array的隐式转换的解决方法
Mar 06 PHP
可兼容php5与php7的cURL文件上传功能实例分析
May 11 PHP
laravel5.1框架model类查询的实现方法
Oct 08 PHP
如何在centos8自定义目录安装php7.3
Nov 28 PHP
PHP7 字符串处理机制修改
Mar 09 PHP
仿AS3实现PHP 事件机制实现代码
Jan 27 #PHP
PHP 命名空间实例说明
Jan 27 #PHP
PHP中利用substr_replace将指定两位置之间的字符替换为*号
Jan 27 #PHP
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
Jan 27 #PHP
PHP中通过加号合并数组的一个简单方法分享
Jan 27 #PHP
PHP中删除变量时unset()和null的区别分析
Jan 27 #PHP
PHP企业级应用之常见缓存技术篇
Jan 27 #PHP
You might like
PHP实现类似于C语言的文件读取及解析功能
2017/09/01 PHP
PHP有序表查找之二分查找(折半查找)算法示例
2018/02/09 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
2018/06/01 PHP
PHP实现数组根据某个单元字段排序操作示例
2018/08/01 PHP
jQuery EasyUI API 中文文档 - Tabs标签页/选项卡
2011/10/01 Javascript
利用jQuery和CSS将背景图片拉伸
2015/10/16 Javascript
javascript for-in有序遍历json数据并探讨各个浏览器差异
2015/11/30 Javascript
JS运动相关知识点小结(附弹性运动示例)
2016/01/08 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
2016/05/05 Javascript
jQuery网页定位导航特效实现方法
2016/12/19 Javascript
利用nodejs监控文件变化并使用sftp上传到服务器
2017/02/18 NodeJs
100行代码理解和分析vue2.0响应式架构
2017/03/09 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
jQuery判断邮箱格式对错实例代码讲解
2017/04/12 jQuery
微信小程序页面生命周期详解
2018/01/31 Javascript
浅谈微信小程序之官方UI框架we-ui使用教程
2018/08/20 Javascript
vue 对象添加或删除成员时无法实时更新的解决方法
2019/05/01 Javascript
vue-cli3 配置开发与测试环境详解
2019/05/17 Javascript
JavaScript面向对象中接口实现方法详解
2019/07/24 Javascript
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
2009/04/09 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
2017/12/14 Python
Python决策树之基于信息增益的特征选择示例
2018/06/25 Python
Python3.5内置模块之time与datetime模块用法实例分析
2019/04/27 Python
python获取点击的坐标画图形的方法
2019/07/09 Python
Django框架 querySet功能解析
2019/09/04 Python
wxpython实现按钮切换界面的方法
2019/11/19 Python
AmazeUI 等分网格的实现示例
2020/08/25 HTML / CSS
俄罗斯运动鞋商店:Sneakerhead
2018/05/10 全球购物
中层干部考核评语
2015/01/04 职场文书
2015年乡镇环保工作总结
2015/04/22 职场文书
全国劳模先进事迹材料(2016精选版)
2016/02/25 职场文书
Python机器学习之逻辑回归
2021/05/11 Python
pytorch中的numel函数用法说明
2021/05/13 Python
详解Python类和对象内容
2021/06/22 Python
《勇者辞职不干了》上卷BD发售宣传CM公开
2022/04/08 日漫
CSS中使用grid布局实现一套模板多种布局
2022/07/15 HTML / CSS