使用类似于PHPUnit的SimpleTest时,有没有办法生成代码覆盖率报告。
我已经在他们的网站上阅读过SimpleTest的文档,但是找不到明确的方法! 我偶然发现了website
我们可以添加
require_once (dirname(__FILE__).'/coverage.php')
到目标文件,它应该生成报告,但它不起作用!
如果有关于如何生成代码覆盖率的有用网站,请在此处分享。
非常感谢。
答案 0 :(得分:1)
我也无法以官方支持的方式使用它,但是这是我工作的东西,我可以通过检查他们的代码来破解。这适用于SimpleTest的v1.1.7,而不是它们的主代码。在撰写本文时,v1.1.7是最新版本,并且适用于新版本的PHP 7,即使它是旧版本。
首先,您必须确保已安装,配置和工作Xdebug。在我的系统上有一个CLI和Apache版本的php.ini文件必须正确配置,具体取决于我是通过Apache还是直接从终端使用PHP。 Xdebug还有其他选择,但大多数人都是Xdebug。
然后,您必须从代码中访问PHP_CodeCoverage库。我建议将其作为composer包添加到您的项目中。
现在您只需手动使用该库来捕获代码覆盖率并生成报告。具体取决于您如何运行测试。就个人而言,我在终端上运行我的测试,并且我在启动脚本之前有一个php运行的bootstrap文件。在引导程序文件的最后,我包含了SimpleTest自动运行文件,因此它将自动运行任何包含的测试类中的测试:
require_once __DIR__.'/vendor/simpletest/simpletest/autorun.php';
在引导程序文件中的某处,您需要创建一个过滤器,将要报告的目录和文件列入白名单,创建一个coverage对象并将过滤器传递给构造函数,启动coverage,以及创建和注册关闭函数这将改变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';
答案 1 :(得分:1)
我花了一些时间才弄明白,因为 - 温和地说 - 这个功能的文档并不是真的完整。
一旦你的测试套件启动并运行,只需在实际运行它的行之前包含这些行:
require_once ('simpletest/extensions/coverage/coverage.php');
require_once ('simpletest/extensions/coverage/coverage_reporter.php');
$coverage = new CodeCoverage();
$coverage->log = 'coverage/log.sqlite'; // This folder should exist
$coverage->includes = ['.*\.php$']; // Modify these as you wish
$coverage->excludes = ['simpletest.*']; // Or it is even better to use a setting file
$coverage->maxDirectoryDepth = '1';
$coverage->resetLog();
$coverage->startCoverage();
然后运行测试,例如:
$test = new ProjectTests(); //It is an extension of the class TestSuite
$test->run(new HtmlReporter());
最后生成报告
$coverage->stopCoverage();
$coverage->writeUntouched();
$handler = new CoverageDataHandler($coverage->log);
$report = new CoverageReporter();
$report->reportDir = 'coverage/report'; // This folder should exist
$report->title = 'Code Coverage Report';
$report->coverage = $handler->read();
$report->untouched = $handler->readUntouchedFiles();
$report->summaryFile = $report->reportDir . '/index.html';
就是这样。根据您的设置,您可能需要进行一些小的调整才能使其正常工作。例如,如果您使用的是simpletest中的autorun.php,那可能会有点棘手。