2015-03-13 21 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); 
相關問題