一 安装php环境
二 统计php代码覆盖率
1 需要安装xdebug
安装步骤:
http://www.jb51.net/article/116419.htm
测试环境
配置步骤
|
1
2
3
4
5
6
7
8 |
git clone git:
//github
.com
/xdebug/xdebug
.gitcd
xdebugfind
/ -name phpize/usr/bin/phpize // 生成configure 文件find
/ -name php-config.
/configure
--
enable
-xdebug --with-php-config=
/usr/local/php/bin/php-configmakemake
install |
注意此处./configure 可能会报错,是因为linux 5之后不支持 ( 了,需要转义 \( --- 应该是php版本的问题,可以联系公司运维也可以自己转义下
开启扩展
|
1
2
3
4 |
find
/ -name php.inivi
/usr/local/php/etc/php
.ini添加 extension=xdebug.so[Xdebug]
service restart php-fpm |
成功验证:①在linux输入php -version,如下:

② 访问index.php(phpinfo())

2 安装composer
curl -sS https://getcomposer.org/installer | phpphp composer.phar --version Composer version 1.6.5 2018-05-04 11:44:59
3 安装phpcov 和 phpunit
此处选了phpunit 6.5.0 和phpcov 4.0.8,编辑composer.json文件(phpcov是根据phpunit自动匹配的,php和phpunit对应关系可百度或看底部)
|
1
2
3
4
5
6
7 |
#composer.json{
"name"
:
"root/php-code-coverage"
,
"require-dev"
: {
"phpunit/phpunit"
:
"6.5.0"
,
"phpunit/phpcov"
:
"*"} |
执行命令安装 php composer.phar install
安装完成后校验 如下即可(phpunit和phpcov一定要在这个目录下使用)
|
1
2
3
4
5
6
7
8
9 |
vendor
/
bin[root@mt
-
jry
-
01
bin
]
# lllrwxrwxrwx
1
root root
24
Jul
13
10
:
22
phpcov
-
> ..
/
phpunit
/
phpcov
/
phpcovlrwxrwxrwx
1
root root
26
Jul
13
10
:
21
phpunit
-
> ..
/
phpunit
/
phpunit
/
phpunit[root@mt
-
jry
-
01
bin
]
# .vendor/bin/phpunit --versionPHPUnit
6.5
.
0
by Sebastian Bergmann
and
contributors.[root@mt
-
jry
-
01
bin
]
# .vendor/bin/phpcov --versionphpcov
4.0
.
5
by Sebastian Bergmann. |
4 编写测试代码
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 |
#userinfo.php<?phpinclude_once(
"*****/prepend.php"
); $
id
=
$_POST[
"user_id"
];if
($
id
!
=
10086
){
exit();}$userinfo
=
array(
'username'
=
>
'jason'
,
'password'
=
>
'123456'
,);$result
=
array(
'code'
=
>
10000
,
'message'
=
>
"success"
,
'data'
=
>$userinfo,
);echo json_encode($result); |
|
1
2
3
4
5
6
7 |
#prepend.php<?phprequire_once dirname(__FILE__).
'/vendor/autoload.php'
;
# 在composer生成的vender同级目录use SebastianBergmann\CodeCoverage\CodeCoverage;$coverage
=
new CodeCoverage;$coverage
-
>
filter
()
-
>addDirectoryToWhitelist(
'/var/www/html/userinfo.php'
);
# 白名单<br>$coverage->filter()->removeDirectoryFromWhitelist('/var/www/html/userinfo.php'); # 从白名单中移除文件夹<br>$coverage->filter()->removeFileFromWhitelist('/var/www/html/userinfo.php'); # 从白名单中移除文件 |
|
1
2
3
4
5
6
7
8
9
10
11
12 |
$coverage
-
>start(
'<Site coverage>'
);
#开始统计register_shutdown_function(
'__coverage_stop'
,$coverage);
#注册关闭方法 function __coverage_stop(CodeCoverage $coverage){
$coverage
-
>stop();
#停止统计
$cov
=
'<?php return unserialize('
. var_export(serialize($coverage), true) .
');'
;
#获取覆盖结果,注意使用了反序列化
/
/
echo $cov;
file_put_contents(dirname(__FILE__).
'/cov/site.'
. date(
'U'
) .
'.'
.uniqid().
'.cov'
, $cov);
#将结果写入到文件中}若多个域名或者接口请求要在同一个prepend文件里分别统计,在新建$coverage前加
if
条件即可,如if
(strpos($_SERVER[
'HTTP_HOST'
],
'
)
=
=
=
true){} |
5 测试
执行命令
|
1
2 |
[root@mt
-
jry
-
01
html]
# curl -d "user_id=10086" "127.0.0.1/userinfo.php"{
"code"
:
10000
,
"message"
:
"success"
,
"data"
:{
"username"
:
"jason"
,
"password"
:
"123456"
}} |
查看prepend.php统计目录cov下
-rw-r--r-- 1 apache apache 4609 Jul 13 14:45 site.1531464305.5b484a71c0a1c.cov
生成xml或者html报告命令如下:
|
1
2 |
./vendor/bin/phpcov merge --clover cov/coverage.xml cov/ -vvv # 在cov目录下生成xml报告./vendor/bin/phpcov merge --html=
"cov/coverage_html"
cov/ -vvv # 在cov目录下生成html报告 |
6 查看报告结果

8 工程配置
在实际项目中有三种配置方式
|
1
2
3
4
5
6
7
8 |
location ~ .*\.php?${
fastcgi_pass 127.0.0.1:9200;
fastcgi_index index.php;
include common/fastcgi.conf;
fastcgi_param MY_ENV pre;
fastcgi_param PHP_VALUE
'auto_prepend_file=/www/data/phpcoverage/prepend.php'
;} |
7 问题:
① 开始使用的phpcov 2.0.2 & phpunit 4.8.7 生成的报告数据全为0 - phpunit4 不能支持 php7,对应版本见⑦
② 开始总是报错PHP Fatal error: Uncaught Error: Class 'SebastianBergmann\CodeCoverage\CodeCoverage' not found in
是因为没有引用vender目录,在prepend.php里加一句require_once dirname(__FILE__).'/vendor/autoload.php'; 即可
③ 配置nginx
④ 请求域名没有生成site文件:请求权限不够,不能在对应目录下写文件
chmod 777 -R 域名请求是apache权限,如果与cov文件夹权限不一致则不可写入
⑤ 生成覆盖率文件有要统计的代码文件,但是命中情况count全为0,有两种可能
A xdebug的collect_param 与collect_return没打开,导致未收集到数据,需要在php.ini里配置
B 如果在php.ini里配置了auto_prepend_file=‘**/prepend.php’,则只有用指定目录下的prepend.php文件才能生成覆盖率数据,否则覆盖行全为0
⑥ 将xml报告集成到jenkins
注意:go 和 c++ 的xml报告可以用 Cobertura 统计到jenkins展示,php 的要用Clover PHP 插件统计,phpcov生成的xml格式Cobertura解析不了会报错
⑦ php 和 phpunit 的对应关系 https://phpunit.de/supported-versions.html

⑧ 问题:观察每日构建的覆盖率,在代码未更新,用例未更新的前提下,覆盖率降低
原因:猜测是 xdebug 统计抽风,因为 xdebug 负责收集统计代码,phpunit phpcov只是汇总整理为可读报告。
解决:暂不能解决,可观察xdebug和phpcoverage官网有类似问题
⑨ jenkins 配置
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 |
cur_path=`pwd`echo ${cur_path}# 删除历史cov文件,保证覆盖率干净find /www/data/phpcoverage/admin_cov/ -name
"site*"
| xargs rm -rfrm -rf ${cur_path}/reports/*#在工程入口文件引入 prepend 文件sed -i
'2cinclude_once("/www/data/phpcoverage/prepend.php");'
/www/my_project/index.php# 更新自动化用例并执行用例source /www/data/project3/venv/bin/activategit checkout mastergit pullpython run.py# 统计html和xml报告,html更易读,xml更直观反映历史情况cd /www/data/phpcoverage./vendor/bin/phpcov merge --clover ${cur_path}/reports/coverage.xml admin_cov/ -vvv./vendor/bin/phpcov merge --html=
"${cur_path}/reports/coverage_html"
admin_cov/ -vvv# 从入口文件删除引用sed -i
'2c//'
/www/my_project/index.php |
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69990585/viewspace-2746570/ ,如需转载,请注明出处,否则将追究法律责任。