爬取 Web 应用程序时使用 Xdebug 测量代码覆盖率
Measure code coverage using Xdebug when crawls web application
我基于 ChromeDriver Selenium
构建我的爬虫,我想在我的自动爬虫爬取应用程序时测量该 Web 应用程序的代码覆盖率。
所以,我的问题是我如何使用 Xdebug 做到这一点(我是新手)。我在 PHP 上安装了 Xdebug,但我不知道如何开始?任何人都可以给我一些步骤吗,因为我没有找到任何对我有帮助的资源。
我没有直接的例子,但我会通过以下方式解决这个问题。 代码未经测试,可能需要更改才能工作,以此为起点
无论如何,您想做以下事情:
- 收集每个请求的代码覆盖率数据,并将其存储到文件
- 聚合每个运行的代码覆盖率数据,并合并它们
为每个请求收集代码覆盖率
传统上,代码覆盖率是为单元测试生成的,具有 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');
?>
如果我有时间,我会做一个关于这个的视频。
我基于 ChromeDriver Selenium
构建我的爬虫,我想在我的自动爬虫爬取应用程序时测量该 Web 应用程序的代码覆盖率。
所以,我的问题是我如何使用 Xdebug 做到这一点(我是新手)。我在 PHP 上安装了 Xdebug,但我不知道如何开始?任何人都可以给我一些步骤吗,因为我没有找到任何对我有帮助的资源。
我没有直接的例子,但我会通过以下方式解决这个问题。 代码未经测试,可能需要更改才能工作,以此为起点
无论如何,您想做以下事情:
- 收集每个请求的代码覆盖率数据,并将其存储到文件
- 聚合每个运行的代码覆盖率数据,并合并它们
为每个请求收集代码覆盖率
传统上,代码覆盖率是为单元测试生成的,具有 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');
?>
如果我有时间,我会做一个关于这个的视频。