2015-03-13 11 views
5

我的测试代码充满了最终的静态类。虽然我们无法对它进行重构以获得更好的测试,但我有一个中间解决方案,它在它自己的过程上运行几个小测试。并且一切正常。但我没有覆盖报道,因为一个覆盖另一个。如何多次运行php单元并连接覆盖率报告?

我目前在三叶草生成报告,但我很开放其他报告。

我的测试中,只有当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) 

但是,这将导致在每次运行wipping从以前的报告。所以我只得到最后一个报告。如果我试图运行它们,因为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单元进程隔离另一个问题。我没事跑了好几次,我只想要一个全覆盖报告:)

有没有什么办法让测试正常运行(在几个过程,即避免受污染的全球一流的声明空间)之类的第一码块,但仍然有全面的代码覆盖率报告?

谢谢!

回答

7

Schleis答案并没有为我工作。在反序列化()方法会在我的情况的错误:错误的偏移......

但是有一个很简单的方法来实现这一目标:

下载phpcov描述here

有PHPUnit的产生与PHP覆盖报告:

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

现在你有2个.cov文件。然后在你最喜欢的外壳上:

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

它会生成一个三叶草。XML报告文件。

1

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

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

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

我也有包括PHPUnit的对象问题,由于现在正被用来分发PHPUnit的的.phar文件。您可能要考虑使用这种.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); 
相关问题