2015-03-13 19 views
5

Mój testowany kod jest pełen ostatecznych klas statycznych. i chociaż nie możemy tego zmienić na lepsze testy, mam rozwiązanie pośrednie, które uruchamia kilka małych testów na własnym procesie. i wszystko działa dobrze. ale nie otrzymuję raportu o zasięgu, ponieważ jeden zastępuje drugi.jak wielokrotnie uruchamiać jednostkę php i łączyć raport o zasięgu?

Aktualnie generuję raport w koniczynie, ale jestem bardzo otwarty na inne raporty.

moje testy działają tylko gdy phpunit prowadzony jest jako:

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

Ale to spowoduje każdym biegu wipping raport z poprzedniego. Więc otrzymuję raport tylko za ostatni. A jeśli spróbuję uruchomić je, ponieważ phpunit spodziewa się wygenerować pełny raport, mam awarię, ponieważ wszystkie moje klasy zawierają własne statyczne.

/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 

(ale powyższe zawiedzie nawet --process-isolation --no-globals-backup ponieważ nie są dokładnie co one oznaczają ...) - to nie jest jeszcze inna kwestia, w jaki sposób dostać się prawidłowo izolację procesów na jednostkę php. Czuję się dobrze działając kilka razy, chcę tylko pełny raport pokrycia :)

Czy istnieje sposób, aby testy zostały przeprowadzone poprawnie (np. w kilku procesach, aby uniknąć skażonej przestrzeni deklaracji klasy globalnej), tak jak pierwszy kod blokować, ale nadal masz kompleksowy raport dotyczący zasięgu kodu?

dziękuję!

Odpowiedz

7

Schleis odpowiedź nie działa dla mnie. Metoda unserialize() generuje błąd w moim przypadku: Błąd przy przesunięciu ...

Jednak istnieje bardzo prosty sposób aby to osiągnąć:

Pobierz phpcov opisanym here.

Czy phpunit generowanie raportów pokrycia php z:

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

Teraz masz 2 .cov plików. Następnie w ulubionej powłoce:

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

Będzie generować jedną koniczynę.plik raportu XML.

1

Będziesz musiał napisać scenariusz rozwiązania, nie jestem świadomy opcji, aby phpunit dodał pokrycie z innych przebiegów. Ale kod phpunit sprawia, że ​​nie jest to zbyt bolesne.

Będziesz chciał użyć opcji --coverage-php, aby uzyskać raport o zasięgu. Ułatwi to łączenie ich wszystkich za pomocą skryptu php. Ta opcja wyświetla plik z serializowanym obiektem PHP_CodeCoverage. Ten obiekt ma metodę merge, która może być używana do łączenia raportów. Następnie możesz użyć obiektu raportu odpowiedniego typu, aby wygenerować wynik dla ciebie.

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

miałem problemy z tym obiekty phpunit powodu pliku .phar który jest obecnie używany do dystrybucji PHPUnit. Można zajrzeć do korzystania z tej .gist for your own autoinclude.

skryptu będzie wyglądał mniej więcej tak:

$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);