# PHPCodeCoverage
**Repository Path**: y1y2/PHPCodeCoverage
## Basic Information
- **Project Name**: PHPCodeCoverage
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-02-13
- **Last Updated**: 2026-02-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 1 功能介绍
PHPCodeCoverage(PCC)是一个基于xdebug检测php代码覆盖的工具,它能够应用于功能测试,接口测试,单元测试等任何php代码环境,同时当程序出现异常时,它能够快速的追踪到代码的出错点。它能够通过Web页面和Cli终端两种途经展示代码覆盖的结果。PCC开源项目位置:https://github.com/cj58/PHPCodeCoverage 。
# 2 安装
## 2.1 安装xdebug
### 2.1.1 检测出php模块是否包含xdebug
由于PHPCodeCoverage是基于xdebug,所以必须安装xdebug。如果如下命令,检测出php模块包含Xdebug则不用安装。
```Bash
$ php -m | grep Xdebug
```
### 2.1.2 安装xdebug
```Bash
# 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
```
### 2.1.2 php中配置xdebug
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
### 2.1.3 创建xdebug输出目录
```Bash
# mkdir /tmp/xdebug
# chmod -R 777 /tmp/xdebug
```
## 2.2 安装PHPCodeCoverage
```
#创建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
```
# 3 配置
配置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
vim demo.php
```php
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数据文件。这个文件保存了代码覆盖的全部数据。

# 5 展示
## 5.1 命令行展示
### 5.1.1 查看pcc数据列表
执行如下命令,会按照时间倒序展示data目录中的所有.pcc文件。
```
$ php index.php
```

### 5.1.2 查看pcc数据详情
执行如下命令。-a表示要请求的动作。-c表示要请求的pcc数据文件。
```
$ php index.php -a dataInfo -c testProject.af93270fdce10782281d7a0f4b77548c.pcc
```

### 5.1.3 查看php文件代码覆盖情况
执行如下命令。-p 表示要查看代码覆盖情况的php文件。行号后面带有+表示,以及字体是绿色,表示该行代码被覆盖。
```
$ php index.php -a fileInfo -c testProject.af93270fdce10782281d7a0f4b77548c.pcc -p /home/dev/svn/avatar/PHPCodeCoverage/test.php
```

### 5.1.4 查看命令行模式帮助文件
执行如下命令,可以查看命令行模式下的帮助信息
```
$ php index.php -a help
```

## 5.2 Web展示
### 5.2.1 配置web-service
在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。
### 5.2.2 查看pcc数据列表
在浏览器中输入,http://dev.pcc.net 。即可查看pcc数据列表信息。

### 5.2.3 查看pcc数据详情
点击某一个.pcc文件,即可查看详情。当点击+Expand时候,会展开当前目录下所有覆盖的php文件;点击-Folded后,会进入目录检索模式。
点击+Expand效果如下图:

点击-Folded效果如下图:

### 5.1.3 查看php文件代码覆盖情况
点击某一个.php文件,即可查看代码覆盖情况。背景行是绿色的表示被覆盖。由于使用了highlight.js来高亮php代码,为了浏览器的兼容性。推荐使用谷歌,火狐,360极速模式(webkit)等浏览器。

# 6 高级用法
## 6.1 addNeedFiles
添加只需要查看的文件。.pcc文件中只会保存你期望的php文件代码覆盖信息。代码如下
```php
addNeedFiles(array('test.php'));
$p->run();
//....your code that you want be Coverage
```
## 6.2 addNeedDirs
添加你需要的目录文件。.pcc文件中只会保留你期望目录的php代码覆盖信息。
```php
addNeedDirs(array('/home/dev/svn/avatar/PHPCodeCoverage/testDir'));
$p->run();
//....your code that you want be Coverage
```
## 6.3 addFilterFiles
过滤掉某些文件。.pcc文件中将不在包含这些文件的代码覆盖信息。
```php
addFilterFiles(array('pcc.php'));
$p->run();
//....your code that you want be Coverage
```
## 6.4 addFilterDirs
过滤掉某些目录统计信息。.pcc文件将不保存这个目录下面的代码覆盖信息。
```php
addFilterDirs(array('/home/dev/svn/avatar/PHPCodeCoverage/testDir'));
$p->run();
//....your code that you want be Coverage
```
## 6.5 setAllMode
这个模式下,一个项目只会生成一个.pcc文件(testProject.All.pcc)。每次都会合并上一次的testProject.All.pcc代码覆盖情况。这种模式,可以很方便的创建多条用例,来检测对某段多分支的代码的覆盖情况。
```php
setAllMode();
$p->run();
//....your code that you want be Coverage
```
# 7 代码异常,如何追踪?
新一个testError.php。这段代码会报错: Division by zero与 Call to a member function isNull()
vim testError.php
```php
isNull();
$a = 1;
?>
```
vim test.php 去include_once('testError.php');
```php
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');这一行卡住。

testError.php覆盖情况如下图,$s = $m->isNull()这一行卡住。可以看到$a = 1;没有被覆盖。
