Loading

PHP代码覆盖率(1)

PHP代码覆盖率统计

环境:MACOS M1

  1. 安装PHP
> arch -x86_64 brew install php@7.4
# 安装成功后输入php 提示 找不到php ,软链一下重新打开终端测试
> brew link --overwrite --force php@7.4
  1. 安装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文件路径

  1. 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分别设置,现在统一用这个设置就可以
  1. 搭建简单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;
}

  1. 开启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

覆盖率报告:

增量分析:

posted @ 2023-02-09 10:37  Miracleeeeeee  阅读(20)  评论(0)    收藏  举报