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

时间:2015-03-13 18:21:12

标签: php unit-testing phpunit

我测试的代码充满了最终的静态类。虽然我们无法重构它以进行更好的测试,但我有一个中间解决方案,可以对它自己的流程进行几次小测试。一切正常。但我没有覆盖另一个覆盖报告。

我目前正在以三叶草形式生成报告,但我对其他报告非常开放。

我的测试仅在phpunit运行时才有效:

/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)

但是这会导致每次运行都从之前的报告中删除。所以我只收到最后一份报告。如果我试图运行它们,因为phpunit期望生成完整的报告,我有失败因为我的所有类都包含他们自己的静态。

/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单元上正确处理隔离的另一个问题。我很好地运行了几次,我只想要一份完整的报道:)

有没有办法让测试正常运行(即在几个进程中避免污染的全局类声明空间),就像第一个代码块一样,但仍然有全面的代码覆盖率报告?

谢谢你!

2 个答案:

答案 0 :(得分:8)

施莱斯的回答对我不起作用。 unserialize()方法在我的情况下抛出一个错误:偏移错误...

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

按照here所述下载phpcov。

让phpunit生成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报告文件。

答案 1 :(得分:1)

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

您需要使用--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);