爬取 Web 应用程序时使用 Xdebug 测量代码覆盖率

Measure code coverage using Xdebug when crawls web application

我基于 ChromeDriver Selenium 构建我的爬虫,我想在我的自动爬虫爬取应用程序时测量该 Web 应用程序的代码覆盖率。

所以,我的问题是我如何使用 Xdebug 做到这一点(我是新手)。我在 PHP 上安装了 Xdebug,但我不知道如何开始?任何人都可以给我一些步骤吗,因为我没有找到任何对我有帮助的资源。

我没有直接的例子,但我会通过以下方式解决这个问题。 代码未经测试,可能需要更改才能工作,以此为起点

无论如何,您想做以下事情:

  1. 收集每个请求的代码覆盖率数据,并将其存储到文件
  2. 聚合每个运行的代码覆盖率数据,并合并它们

为每个请求收集代码覆盖率

传统上,代码覆盖率是为单元测试生成的,具有 PHPUnit。 PHPUnit 使用单独的库 PHP Code Coverage 来收集、合并和生成针对每次测试收集的覆盖率的报告。您可以单独使用此库。

为了收集数据,我会做 composer require phpunit/php-code-coverage 然后创建一个 auto_prepend 文件,其中包含如下内容:

<?php
require 'vendor/autoload.php';

use SebastianBergmann\CodeCoverage\Filter;
use SebastianBergmann\CodeCoverage\Driver\Selector;
use SebastianBergmann\CodeCoverage\CodeCoverage;
use SebastianBergmann\CodeCoverage\Report\Html\Facade as HtmlReport;

$filter = new Filter;
$filter->includeDirectory('/path/to/directory');

$coverage = new CodeCoverage(
    (new Selector)->forLineCoverage($filter),
    $filter
);

$coverage->start($_SERVER['REQUEST_URI']);

function save_coverage()
{
    global $coverage;
    $coverage->stop();
    $data = $coverage->getData();

    file_put_contents('/tmp/path/crawler/' . bin2hex(random_bytes(16)), serialize($data) . '.serialized', $data->get );
}

register_shutdown_function('save_coverage');
?>

(我从 php-code-coverage README.md 的介绍中复制了大部分内容)

您需要使用 php.ini 配置此 prepend_file:auto_prepend_file

当您现在抓取您的网站时,您应该将每个请求的代码覆盖率文件放入 /tmp/path/crawler/,但首先要确保该目录存在。

合并代码覆盖率

对于这一步,您需要编写一个脚本来加载每个生成文件(参见 glob()),并将它们合并在一起。

PHP Code Coverage 对此也有 method。它看起来像:

<?php
require 'vendor/autoload.php';

use SebastianBergmann\CodeCoverage\Filter;
use SebastianBergmann\CodeCoverage\Driver\Selector;
use SebastianBergmann\CodeCoverage\CodeCoverage;
use SebastianBergmann\CodeCoverage\Report\Html\Facade as HtmlReport;

$filter = new Filter;
$filter->includeDirectory('/path/to/directory');

$coverage = new CodeCoverage(
    (new Selector)->forLineCoverage($filter),
    $filter
);

foreach ( glob('/tmp/path/crawler/*.serialize') as $file)
{
    $data = unserialize( file_get_contents( $file ) );

    $fileCoverage = new CodeCoverage(
        (new Selector)->forLineCoverage($filter),
        $filter
    );
    $fileCoverage->setData( $data );
    $coverage->merge( $fileCoverage );
}

/* now generate the report, as per the README.md again */
(new HtmlReport)->process($coverage, '/tmp/code-coverage-report');
?> 

如果我有时间,我会做一个关于这个的视频。