PHP代码覆盖率(1)
PHP代码覆盖率统计
环境:MACOS M1
- 安装PHP
> arch -x86_64 brew install php@7.4
# 安装成功后输入php 提示 找不到php ,软链一下重新打开终端测试
> brew link --overwrite --force php@7.4
- 安装xdebug

# 下载php7.4支持的xdebug版本
https://github.com/xdebug/xdebug/releases/tag/3.1.0
# 下载完成后执行安装
> sudo ./pecl install /Users/miracle/Downloads/xdebug-3.1.0.tar.gz
# php -m 查看是否安装成功,存在Xdebug 则安装成功
安装成功后会生成xdebug.so文件路径

- php.ini 配置xdebug
# 找到php.ini文件
> php --ini
# 配置一下信息 MACOS 需注意,不需要设置xdebug路径
[xdebug]
;根据自己修改目录
zend_extension ="/usr/local/Cellar/php@7.4/7.4.28/pecl/20190902/xdebug.so"
xdebug.idekey="PHPSTORM"
; 端口ID,phpstorm 设置须一致
xdebug.client_host=localhost
xdebug.client_port=9003
;开启xdebug支持,不同的mode的不同的用途,详细说明请看官方文档
xdebug.mode = debug ;如果要多个模式一起开启,就用`,`分隔开就行
xdebug.profiler_append = 0
xdebug.profiler_output_name = cachegrind.out.%p
;这里与原来不同了,原来如果要开启trace或profile,用的是enable_trace,enable_profile等字段
xdebug.start_with_request = default
xdebug.trigger_value=StartProfileForMe ;这里就是原来的profile_trigger_value,trace_trigger_value
xdebug.output_dir = /tmp ;输出文件路径,原来是output_profiler_dir,trace_dir分别设置,现在统一用这个设置就可以
- 搭建简单demo项目
#1. 从github上拉低于9.0版本lumen,因为你用的PHP版本是7.4
https://github.com/laravel/lumen/releases/tag/v7.0.0
#2. composer.json中添加"phpunit/phpcov": "*"库
"require-dev": {
"fzaninotto/faker": "^1.9.1",
"mockery/mockery": "^1.3.1",
"phpunit/phpcov": "*"
},
# 3. 安装依赖compser install (没有compser自行百度安装)
# 4. 编写一个简单的demo示例
# web.php
$router->get('/login','ExampleController@login');
# ExampleController.php
public function login()
{
$username = $_GET['username'];
$password = $_GET['password'];
if($username=='root'and$password=='root'){
echo 'success';
}else{
echo 'fail' ;
};
if($username=='haha'and$password=='haha'){
echo '111';
}else{
echo '2222';
}
return $username;
}
- 开启phpcov
#1. 创建coverage.php 文件,名字随便起,路径任意放
<?php
use SebastianBergmann\CodeCoverage\Filter;
use SebastianBergmann\CodeCoverage\Driver\Selector;
use SebastianBergmann\CodeCoverage\CodeCoverage;
$filter = new Filter;
$filter->includeDirectory('../app');
$coverage = new CodeCoverage(
(new Selector)->forLineCoverage($filter),
$filter
);
$coverage->start('test');
// ...
register_shutdown_function('__coverage_stop', $coverage); #注册关闭方法
function __coverage_stop(CodeCoverage $coverage)
{
$coverage->stop(); #停止统计
$cov = '<?php return unserialize(' . var_export(serialize($coverage), true) . ');'; #获取覆盖结果,注意使用了反序列化
file_put_contents(dirname(__FILE__) . '/report/cov/site.' . date('U') . '.' . uniqid() . '.cov', $cov); #将结果写入到文件中
}
# 2. 入口文件 public/index.php 中引入 coverage.php
require '../coverage/coverage.php';
$app->run();
# 3. 启动项目
php -S localhost:8000 -d display_errors=1 -t public
# 4. 请求接口:http://localhost:8000/login/?username=root&password=root
/coverage/report下会生成.cov文件,如果提示找不到文件,需要手动创建report文件夹
# 5. 生成覆盖率报告 第一个参数为需要生成html目录(html可以不存在自动生成), 第二个参数为cov文件路径
./vendor/bin/phpcov merge --html ./coverage/report/html ./coverage/report/cov
覆盖率报告:

增量分析:


浙公网安备 33010602011771号