Coder Social home page Coder Social logo

phpcodecoverage's Introduction

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则不用安装。

$ php -m | grep Xdebug

2.1.2 安装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

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输出目录

# 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
/*
 * 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';

4 使用

只需要三行代码,第一行引入Pcc类文件;第二行创建一个Pcc对象,参数是项目的名称;第三行运行Pcc代码。
vim test.php

<?php
include_once("/home/dev/svn/avatar/PHPCodeCoverage/Pcc.php");
$p = new Pcc('testProject');
$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

5 展示

5.1 命令行展示

5.1.1 查看pcc数据列表

执行如下命令,会按照时间倒序展示data目录中的所有.pcc文件。

$ php index.php

cli_data_list

5.1.2 查看pcc数据详情

执行如下命令。-a表示要请求的动作。-c表示要请求的pcc数据文件。

$ php index.php -a dataInfo -c testProject.af93270fdce10782281d7a0f4b77548c.pcc

cli_pcc_datainfo

5.1.3 查看php文件代码覆盖情况

执行如下命令。-p 表示要查看代码覆盖情况的php文件。行号后面带有+表示,以及字体是绿色,表示该行代码被覆盖。

 $ php index.php -a fileInfo -c testProject.af93270fdce10782281d7a0f4b77548c.pcc -p /home/dev/svn/avatar/PHPCodeCoverage/test.php

cli_php_info

5.1.4 查看命令行模式帮助文件

执行如下命令,可以查看命令行模式下的帮助信息

$ php index.php -a help

cli_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数据列表信息。 web_data_list

5.2.3 查看pcc数据详情

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

5.1.3 查看php文件代码覆盖情况

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

6 高级用法

6.1 addNeedFiles

添加只需要查看的文件。.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

6.2 addNeedDirs

添加你需要的目录文件。.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

6.3 addFilterFiles

过滤掉某些文件。.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

6.4 addFilterDirs

过滤掉某些目录统计信息。.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

6.5 setAllMode

这个模式下,一个项目只会生成一个.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

7 代码异常,如何追踪?

新一个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

phpcodecoverage's People

Contributors

cj58 avatar

Watchers

James Cloos avatar 程序员的文娱情怀 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.