如何直接使用PHP_CodeCoverage库?

How to use the PHP_CodeCoverage library directly?

我试图让 PHP_CodeCoverage 库在最简单的情况下工作以创建 HTML 代码覆盖率报告,但失败了。我安装了 PHP 和 Xdebug。我宁愿不指定我正在使用的那些版本,因为我希望有一些简单的东西我忽略了,但我会根据要求提供这些细节。现在,我只想说,我正在使用它们的非常新的版本。

为了尽可能简单,我将它精简为 2 个文件,但我仍然无法让它执行我想要的操作。这2个文件是composer在安装coverage库时自动生成的vendor/autoload.php,以及正在使用该库的文件。该文件位于 project-root/src/CoverageTest.php。自动加载文件位于 project-root/vendor/autoload.php.

当我从终端 运行 php src/CoverageTest.php 时,它会生成 HTML 报告。当我查看报告时,在代码覆盖率 table 中,只有一行的所有内容都设置为 "n/a" 或“0/0”。它不会将任何覆盖范围报告为存在或缺失。它没有说明任何关于特定文件、类、函数或行的信息。在很大程度上,您在此测试文件中看到的代码与他们 README page 中显示的代码相同。这是代码:

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

$coverage = new \SebastianBergmann\CodeCoverage\CodeCoverage;
$coverage->start('<name of test>');

class MathGenius
{
    public function add($first, $second)
    {
        return $first + $second;
    }
}

$guru = new MathGenius();
$sum = $guru->add(1, 1);

$coverage->stop();

$writer = new \SebastianBergmann\CodeCoverage\Report\Html\Facade;
$writer->process($coverage, __DIR__.'/../code-coverage-report');

它只报告列入白名单的文件和目录。这就是我发布的示例的工作方式。在创建覆盖对象之前,我创建了一个过滤器对象,如下所示:

$filter = new \SebastianBergmann\CodeCoverage\Filter();

因为那个例子只是试图掩盖自己,我用这样的过滤器将该文件列入白名单:

$filter->addFileToWhitelist(__FILE__);

然后在创建覆盖对象时,像这样传入过滤器:

$coverage = new \SebastianBergmann\CodeCoverage\CodeCoverage(null, $filter);

这是问题代码的固定版本的完整代码:

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

$filter = new \SebastianBergmann\CodeCoverage\Filter();
$filter->addFileToWhitelist(__FILE__);
$coverage = new \SebastianBergmann\CodeCoverage\CodeCoverage(null, $filter);
$coverage->start('<name of test>');

class MathGenius
{
    public function add($first, $second)
    {
        return $first + $second;
    }
}

$guru = new MathGenius();
$sum = $guru->add(1, 1);

$coverage->stop();

$writer = new \SebastianBergmann\CodeCoverage\Report\Html\Facade;
$writer->process($coverage, __DIR__.'/../code-coverage-report');