如何 运行 php 单元多次并连接覆盖率报告?

how to run php unit multiple times and concatenate the coverage report?

我的测试代码充满了最终静态 classes。虽然我们无法重构它以获得更好的测试,但我有一个中间解决方案,运行 对它自己的过程进行了几个小测试。一切正常。但是我没有得到覆盖率报告,因为一个覆盖了另一个。

我目前正在 clover 中生成报告,但我对其他报告非常开放。

我的测试仅在 php 单位为 运行 时有效,因为:

/home/y/bin/phpunit --coverage-html clover --coverage-clover clover/report.xml --include-path src/  tests/aTest.php
OK (1 test, 1 assertions)
/home/y/bin/phpunit --coverage-html clover --coverage-clover clover/report.xml --include-path src/  tests/bTest.php
OK (1 test, 1 assertions)
/home/y/bin/phpunit --coverage-html clover --coverage-clover clover/report.xml --include-path src/  tests/cTest.php
OK (1 test, 1 assertions)

但这将导致每次 运行 擦除之前的报告。所以我只得到最后一个的报告。如果我尝试 运行 它们作为 php 单元期望生成完整报告,我会失败,因为我所有的 classes 都包含它们自己的静态报告。

/home/y/bin/phpunit --coverage-html clover --coverage-clover clover/report.xml --include-path src/  tests/
. (first test pass)
PHP Fatal error:  Cannot redeclare class Something
make[1]: *** [phpunit_run] Error 255

(但即使使用 --process-isolation --no-globals-backup 以上内容也会失败,因为它们并不完全是它们的意思......) - 这不是关于如何在 php 上正确处理进程隔离的另一个问题单元。我很好 运行 多次,我只想要一份完整的报道:)

是否有任何方法可以像第一个代码块一样使测试正确地达到 运行(即在几个过程中避免污染全局 class 声明 space),但仍然有全面的代码覆盖率报告?

谢谢!

您必须编写解决方案脚本,我不知道有一个选项可以让 phpunit 将其他运行的覆盖范围加在一起。但是 php 单元代码使这不会太痛苦。

您需要使用 --coverage-php 选项来获取覆盖率报告。这将使使用 php 脚本将它们全部组合起来变得更加容易。此选项输出一个包含序列化 PHP_CodeCoverage 对象的文件。这个对象有一个方法 merge 可以用来合并报告。然后您可以使用适当类型的报表对象为您生成输出。

https://github.com/sebastianbergmann/php-code-coverage/tree/master/src/CodeCoverage/Report

由于现在用于分发 PHPUnit 的 .phar 文件,我确实遇到了包含 PHPUnit 对象的问题。您可能需要考虑使用此 .gist for your own autoinclude.

你的脚本看起来像这样:

$fileList = ['file1', 'file2', 'file3']; //or read from dir, however you get the list.
$coverageReports = [];
foreach($fileList as $file) {
    $coverageReports[] = unserialize(file_get_contents($file));
}

$mainReport = new PHP_CodeCoverage(); //Could also use one of the other ones that were generated.

foreach($coverageReports as $coverageReport) {
    $mainReport->merge($coverageReport);
}

//Change this object depending on the format you want.
$htmlReport = new PHP_CodeCoverage_Report_HTML();  

$htmlReport->process($mainReport);

Schleis 的回答对我不起作用。 unserialize() 方法在我的例子中抛出错误:偏移量错误...

然而,有一种非常简单的方法可以实现这一点:

按照说明下载 phpcov here

让php单位生成php覆盖率报告:

phpunit --coverage-php coverage/cov/foo.cov tests/foo
phpunit --coverage-php coverage/cov/bar.cov tests/bar

现在您有 2 个 .cov 文件。然后在你最喜欢的 shell:

phpcov merge --clover clover.xml /coverage/cov

它将生成一个 clover.xml 报告文件。