我基于
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 代码覆盖率也有一个方法。它看起来像:
<?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');
?>
如果我有时间,我会制作一个视频。