PHPCodeCoverage(PCC)是一个基于xdebug检测php代码覆盖的工具,它能够应用于功能测试,接口测试,单元测试等任何php代码环境,同时当程序出现异常时,它能够快速的追踪到代码的出错点。它能够通过Web页面和Cli终端两种途经展示代码覆盖的结果。PCC开源项目位置:https://github.com/cj58/PHPCodeCoverage 。
由于PHPCodeCoverage是基于xdebug,所以必须安装xdebug。如果如下命令,检测出php模块包含Xdebug则不用安装。
$ php -m | grep Xdebug# wget http://www.xdebug.org/files/xdebug-2.2.5.tgz # tar zxvf xdebug-2.2.5.tgz # cd xdebug-2.2.5 # phpize # ./configure --with-php-config=/usr/local/php5/bin/php-config # make # make install
vim /etc/php.ini
[xdebug]
zend_extension="/usr/local/php5/lib/php/extensions/no-debug-non-zts-20121212/xdebug.so"
xdebur.cli_color=1
xdebug.force_display_errors = 1
xdebug.profiler_enable = on
xdebug.default_enable = on
xdebug.trace_output_dir="/tmp/xdebug"
xdebug.trace_output_name = trace.%c.%p
xdebug.profiler_output_dir="/tmp/xdebug"
xdebug.profiler_output_name="cachegrind.out.%s"
xdebug.show_exception_trace = Off
xdebug.collect_vars = On
xdebug.collect_return = On
xdebug.max_nesting_level = 10000
xdebug.dump_globals= on
xdebug.show_local_vars=on
xdebug.collect_params=2
# mkdir /tmp/xdebug # chmod -R 777 /tmp/xdebug
#创建PHPCodeCoverage项目目录
# mkdir -p /home/dev/svn/avatar/PHPCodeCoverage
#下载源码
# wget https://github.com/cj58/PHPCodeCoverage/archive/master.zip
#解压
# unzip master.zip
#将代码拷贝到项目目录
# cp PHPCodeCoverage-master/* /home/dev/svn/avatar/PHPCodeCoverage -r
配置PHPCodeCoverage的数据目录,默认是./data目录。也可以建立/tmp/pcc/data。主要是为了确保后面web用户能够对data目录有操作权限。
# mkdir -p /home/dev/svn/avatar/PHPCodeCoverage/data
# chmod -R 777 /home/dev/svn/avatar/PHPCodeCoverage/data
修改配置目录 vim config.php
<?php /* * this file is config for PHPCodeCoverage * * @link https://github.com/cj58/PHPCodeCoverage * @author cj * @copyright 2017 cj * */ $configs = array(); //data dir for pcc //$configs['dataDir'] = '/tmp/pcc/data'; $configs['dataDir'] = dirname(__FILE__).'/data'; return $configs;
只需要三行代码,第一行引入Pcc类文件;第二行创建一个Pcc对象,参数是项目的名称;第三行运行Pcc代码。
vim demo.php
<?php include_once("/home/dev/svn/avatar/PHPCodeCoverage/Pcc.php"); $p = new Pcc('demoProject'); $p->run(); //..... you want Coverage Code,start function testInterface($testCase) { switch($testCase) { case '1': $out = '$testCase = 1'; break; case '2': $out = '$testCase = 2'; break; default: $out = '$testCase <> 1 && $testCase <> 2'; break; } } testInterface(1); //....you want Coverage Code,end //.... ?>
$ php test.php
每次执行test.php文件,都会在data目录下面生成一个.pcc数据文件。这个文件保存了代码覆盖的全部数据。
data_list
执行如下命令,会按照时间倒序展示data目录中的所有.pcc文件。
$ php index.php
执行如下命令。-a表示要请求的动作。-c表示要请求的pcc数据文件。
$ php index.php -a dataInfo -c testProject.af93270fdce10782281d7a0f4b77548c.pcc
执行如下命令。-p 表示要查看代码覆盖情况的php文件。行号后面带有+表示,以及字体是绿色,表示该行代码被覆盖。
$ php index.php -a fileInfo -c testProject.af93270fdce10782281d7a0f4b77548c.pcc -p /home/dev/svn/avatar/PHPCodeCoverage/test.php
执行如下命令,可以查看命令行模式下的帮助信息
$ php index.php -a help
在nginx.conf加入以下配置信息。 vim /Data/apps/nginx/conf/nginx-web.conf
server {
listen 80;
server_name dev.pcc.net;
root /home/dev/svn/avatar/PHPCodeCoverage;
index index.html index.htm index.php;
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
#fastcgi_param SCRIPT_FILENAME $documentroot$fastcgi_script_name;
fastcgi_index index.php;
include fastcgi.conf;
}
}
重启nginx服务。并将将dev.pcc.net的host信息指向你项目所在代码的服务器ip。
在浏览器中输入,http://dev.pcc.net 。即可查看pcc数据列表信息。 web_data_list
点击某一个.pcc文件,即可查看详情。当点击+Expand时候,会展开当前目录下所有覆盖的php文件;点击-Folded后,会进入目录检索模式。
点击+Expand效果如下图:
web_pcc_datainfo
点击-Folded效果如下图:
web_pcc_datainfo2
点击某一个.php文件,即可查看代码覆盖情况。背景行是绿色的表示被覆盖。由于使用了highlight.js来高亮php代码,为了浏览器的兼容性。推荐使用谷歌,火狐,360极速模式(webkit)等浏览器。 web_php_info
添加只需要查看的文件。.pcc文件中只会保存你期望的php文件代码覆盖信息。代码如下
<?php include_once("/home/dev/svn/avatar/PHPCodeCoverage/Pcc.php"); $p = new Pcc('testProject'); $p->addNeedFiles(array('test.php')); $p->run(); //....your code that you want be Coverage
添加你需要的目录文件。.pcc文件中只会保留你期望目录的php代码覆盖信息。
<?php include_once("/home/dev/svn/avatar/PHPCodeCoverage/Pcc.php"); $p = new Pcc('testProject'); $p->addNeedDirs(array('/home/dev/svn/avatar/PHPCodeCoverage/testDir')); $p->run(); //....your code that you want be Coverage
过滤掉某些文件。.pcc文件中将不在包含这些文件的代码覆盖信息。
<?php include_once("/home/dev/svn/avatar/PHPCodeCoverage/Pcc.php"); $p = new Pcc('testProject'); $p->addFilterFiles(array('pcc.php')); $p->run(); //....your code that you want be Coverage
过滤掉某些目录统计信息。.pcc文件将不保存这个目录下面的代码覆盖信息。
<?php include_once("/home/dev/svn/avatar/PHPCodeCoverage/Pcc.php"); $p = new Pcc('testProject'); $p->addFilterDirs(array('/home/dev/svn/avatar/PHPCodeCoverage/testDir')); $p->run(); //....your code that you want be Coverage
这个模式下,一个项目只会生成一个.pcc文件(testProject.All.pcc)。每次都会合并上一次的testProject.All.pcc代码覆盖情况。这种模式,可以很方便的创建多条用例,来检测对某段多分支的代码的覆盖情况。
<?php include_once("/home/dev/svn/avatar/PHPCodeCoverage/Pcc.php"); $p = new Pcc('testProject'); $p->setAllMode(); $p->run(); //....your code that you want be Coverage
新一个testError.php。这段代码会报错: Division by zero与 Call to a member function isNull()
vim testError.php
<?php $m = 1; $f = 1 / 0; $s = $m->isNull(); $a = 1; ?>
vim test.php 去include_once('testError.php');
<?php include_once("/home/dev/svn/avatar/PHPCodeCoverage/Pcc.php"); $p = new Pcc('testProject'); $p->run(); include_once('testError.php'); //..... you want Coverage Code,start function testInterface($testCase) { switch($testCase) { case '1': $out = '$testCase = 1'; break; case '2': $out = '$testCase = 2'; break; default: $out = '$testCase <> 1 && $testCase <> 2'; break; } } testInterface(1); //....you want Coverage Code,end //.... ?>
test.php的代码覆盖情况。include_once('testError.php');这一行卡住。
web_testerror_1
testError.php覆盖情况如下图,$s = $m->isNull()这一行卡住。可以看到$a = 1;没有被覆盖。
web_testerror_2