使用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 和 HTML
Oct 09 PHP
PHPShop存在多个安全漏洞
Oct 09 PHP
php mssql 数据库分页SQL语句
Dec 16 PHP
PHP 执行系统外部命令 system() exec() passthru()
Aug 11 PHP
php 服务器调试 Zend Debugger 的安装教程
Sep 25 PHP
PHP 一个页面执行时间类代码
Mar 05 PHP
php 在线导入mysql大数据程序
Jun 11 PHP
详解PHP文件的自动加载(autoloading)
Feb 04 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
Oct 12 PHP
PHP按一定比例压缩图片的方法
Oct 12 PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
May 20 PHP
php5.6.x到php7.0.x特性小结
Aug 17 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 gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
2010/05/15 PHP
PHP回调函数概念与用法实例分析
2017/11/03 PHP
Yii2.0实现的批量更新及批量插入功能示例
2019/01/29 PHP
轻松实现Bootstrap图片轮播
2020/04/20 Javascript
jQuery获取剪贴板内容的方法
2016/06/16 Javascript
js提示框替代系统alert,自动关闭alert对话框的实现方法
2016/11/07 Javascript
jQuery实现手机上输入后隐藏键盘功能
2017/01/04 Javascript
关于在mongoose中填充外键的方法详解
2017/08/14 Javascript
vue首次赋值不触发watch的解决方法
2018/09/11 Javascript
从组件封装看Vue的作用域插槽的实现
2019/02/12 Javascript
layui自定义插件citySelect实现省市区三级联动选择
2019/07/26 Javascript
Vue实现点击显示不同图片的效果
2019/08/10 Javascript
js前端如何写一个精确的倒计时代码
2019/10/25 Javascript
JS实现拼图游戏
2021/01/29 Javascript
JavaScript canvas仿代码流瀑布
2020/02/10 Javascript
微信小程序使用 vant Dialog组件的正确方式
2020/02/21 Javascript
前端使用crypto.js进行加密的函数代码
2020/08/16 Javascript
[01:03:47]VP vs NewBee Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
[47:43]完美世界DOTA2联赛PWL S3 Magama vs GXR 第二场 12.19
2020/12/24 DOTA
简单实现python爬虫功能
2015/12/31 Python
Python实现的NN神经网络算法完整示例
2018/06/19 Python
解决python写入带有中文的字符到文件错误的问题
2019/01/31 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
浅析pandas 数据结构中的DataFrame
2019/10/12 Python
TensorFlow tf.nn.max_pool实现池化操作方式
2020/01/04 Python
python可迭代对象去重实例
2020/05/15 Python
python实现马丁策略回测3000只股票的实例代码
2021/01/22 Python
Nike法国官方网站:Nike.com FR
2018/07/22 全球购物
I.T集团香港官方商城:ITeSHOP.com Hong Kong
2019/02/15 全球购物
澳大利亚最便宜的网上药房:Chemist Warehouse
2020/01/30 全球购物
AJAX的全称是什么
2012/11/06 面试题
护理专业毕业生推荐信
2013/10/31 职场文书
2014年秘书工作总结
2014/11/25 职场文书
2015年社区居委会工作总结
2015/05/18 职场文书
远程教育培训心得体会
2016/01/09 职场文书
win10重装系统后上不了网怎么办 win10重装系统网络故障的解决办法
2022/07/23 数码科技