使用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实现的仿阿里巴巴实现同类产品翻页
Dec 11 PHP
用PHP将网址字符串转换成超链接(网址或email)
May 25 PHP
php关于array_multisort多维数组排序的使用说明
Jan 04 PHP
ThinkPHP表单自动验证实例
Oct 13 PHP
Codeigniter检测表单post数据的方法
Mar 21 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
Apr 03 PHP
ThinkPHP路由详解
Jul 27 PHP
php实现的AES加密类定义与用法示例
Jan 29 PHP
Laravel框架自定义公共函数的引入操作示例
Apr 16 PHP
PHP 文件写入和读取操作实例详解【必看篇】
Nov 04 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
Nov 09 PHP
PHP引擎php.ini参数优化深入讲解
Mar 24 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
杏林同学录(三)
2006/10/09 PHP
优化使用mysql存储session的php代码
2008/01/10 PHP
php Undefined index和Undefined variable的解决方法
2008/03/27 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
2014/03/13 PHP
iis6手工创建网站后无法运行php脚本的解决方法
2017/06/08 PHP
28个JS验证函数收集
2010/03/02 Javascript
通过判断JavaScript的版本实现执行不同的代码
2010/05/11 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
2013/12/02 Javascript
jquery 快速回到页首的方法
2013/12/05 Javascript
js鼠标点击图片切换效果代码分享
2015/08/26 Javascript
由浅入深讲解Javascript继承机制与simple-inheritance源码分析
2015/12/13 Javascript
jQuery formValidator表单验证
2016/01/07 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
JS 日期与时间戮相互转化的简单实例
2016/06/22 Javascript
详细探究ES6之Proxy代理
2016/07/22 Javascript
解决VUE框架 导致绑定事件的阻止冒泡失效问题
2018/02/24 Javascript
全站最详细的Vuex教程
2018/04/13 Javascript
Vue项目webpack打包部署到Tomcat刷新报404错误问题的解决方案
2018/05/15 Javascript
python33 urllib2使用方法细节讲解
2013/12/03 Python
Python中的引用和拷贝浅析
2014/11/22 Python
python实现逻辑回归的方法示例
2017/05/02 Python
Django实现单用户登录的方法示例
2019/03/28 Python
使用python搭建服务器并实现Android端与之通信的方法
2019/06/28 Python
django 2.2和mysql使用的常见问题
2019/07/18 Python
Python对wav文件的重采样实例
2020/02/25 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
2020/05/11 Python
css 元素选择器的简单实例
2016/05/23 HTML / CSS
编写函数,将一个3*3矩阵转置
2013/10/09 面试题
高级工程师岗位职责
2013/12/15 职场文书
校园达人秀策划书
2014/01/12 职场文书
护士自我评价范文
2014/01/25 职场文书
老兵退伍标语
2014/10/07 职场文书
贷款担保书
2015/01/20 职场文书
本溪水洞导游词
2015/02/11 职场文书
健康教育主题班会
2015/08/14 职场文书
利用python进行数据加载
2021/06/20 Python