我也无法让它以官方支持的方式工作,但这是我正在工作的东西,我可以通过检查他们的代码来破解它们。这适用于 SimpleTest 的 v1.1.7,而不是他们的主代码。在撰写本文时,v1.1.7 是最新版本,并且可以与 PHP 7 的新版本一起使用,即使它是旧版本。
首先,您必须确保已安装、配置并正常运行 Xdebug。在我的系统上,必须正确配置 php.ini 文件的 CLI 和 Apache 版本,具体取决于我是尝试通过 Apache 还是直接从终端使用 PHP。有 Xdebug 的替代品,但大多数人使用 Xdebug。
然后,您必须使 PHP_CodeCoverage 库可以从您的代码中访问。我建议将其作为 composer 包添加到您的项目中。
现在您只需手动使用该库来捕获代码覆盖率并生成报告。你如何做到这一点取决于你如何运行你的测试。就个人而言,我在终端上运行我的测试,并且我有一个引导文件,php 在启动脚本之前运行它。在引导文件的末尾,我包含了 SimpleTest 自动运行文件,因此它会自动在任何包含的测试类中运行测试,如下所示:
require_once __DIR__.'/vendor/simpletest/simpletest/autorun.php';
您需要在引导文件中的某个位置创建过滤器,将要报告的目录和文件列入白名单,创建覆盖对象并将过滤器传递给构造函数,启动覆盖,并创建和注册关闭函数这将改变 SimpleTest 执行测试的方式,以确保它也停止覆盖并生成覆盖报告。您的引导文件可能如下所示:
<?php
require __DIR__.'/vendor/autoload.php';
$filter = new \SebastianBergmann\CodeCoverage\Filter();
$filter->addDirectoryToWhitelist(__DIR__."/src/");
$coverage = new \SebastianBergmann\CodeCoverage\CodeCoverage(null, $filter);
$coverage->start('<name of test>');
function shutdownWithCoverage($coverage)
{
$autorun = function_exists('\run_local_tests'); // provided by simpletest
if ($autorun) {
$result = \run_local_tests(); // this actually runs the tests
}
$coverage->stop();
$writer = new \SebastianBergmann\CodeCoverage\Report\Html\Facade;
$writer->process($coverage, __DIR__.'/tmp/code-coverage-report');
if ($autorun) {
// prevent tests from running twice:
exit($result ? 0 : 1);
}
}
register_shutdown_function('\shutdownWithCoverage', $coverage);
require_once __DIR__.'/vendor/simpletest/simpletest/autorun.php';