2015-03-13 9 views
5

Mein getesteter Code ist voll von endgültigen statischen Klassen. und während wir es für bessere Tests nicht umgestalten können, habe ich eine Zwischenlösung, die mehrere kleine Tests auf seinem eigenen Prozess durchführt. und alles funktioniert gut. aber ich bekomme keinen Bericht, wenn einer den anderen überschreibt.Wie PHP-Einheit mehrere Male ausführen und den Abdeckungsbericht verketten?

Ich erstelle derzeit den Bericht in Klee, aber ich bin sehr offen für andere Berichte.

meine Tests funktionieren nur, wenn phpunit wie ausgeführt wird:

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

Aber das wird in jedem Lauf führen den Bericht aus dem vorherigen Wipping. So bekomme ich nur einen Bericht für den letzten. Und wenn ich versuche, sie auszuführen, da phpunit erwartet, den vollständigen Bericht zu generieren, habe ich den Fehler, weil alle meine Klassen ihre eigenen statischen enthalten.

/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 

(aber die oben scheitern wird auch bei --process-isolation --no-globals-backup weil nicht genau, was sie bedeuten ...) - das ist nicht noch eine weitere Frage auf, wie man richtig auf PHP-Einheit Prozess Isolation zu erhalten. Mir geht es gut, es mehrere Male laufen zu lassen, ich will nur einen vollständigen Abdeckungsbericht :)

Gibt es eine Möglichkeit, um die Tests korrekt ausgeführt werden (dh auf mehrere Prozesse zu vermeiden verdorbene globale Klasse Deklaration Raum) wie der erste Code blockieren, aber immer noch umfassenden Code Coverage Report?

danke!

Antwort

7

Schleis Antwort hat nicht funktioniert. Die unserialize() Methode gibt einen Fehler in meinem Fall: Fehler bei Offset ...

Allerdings gibt es eine sehr einfache Möglichkeit, dies zu erreichen:

herunterladen phpcov wie here.

Haben phpunit php Berichterstattung Berichte mit generieren:

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

Jetzt haben Sie 2 COV-Dateien. Dann in Ihrer Lieblingsschale:

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

Es wird ein Klee erzeugen.XML-Berichtsdatei

1

Sie müssen die Lösung skripten, mir ist keine Option bekannt, dass phpunit die Abdeckung anderer Läufe zusammenfasst. Aber der PHP-Code macht das nicht zu schmerzhaft.

Sie möchten die Option --coverage-php verwenden, um den Abdeckungsbericht abzurufen. Dies wird es einfacher machen, sie alle mit einem PHP-Skript zu kombinieren. Diese Option gibt eine Datei mit einem serialisierten PHP_CodeCoverage-Objekt aus. Dieses Objekt verfügt über eine Methode merge, mit der die Berichte kombiniert werden können. Dann können Sie das Berichtsobjekt des entsprechenden Typs verwenden, um die Ausgabe für Sie zu generieren.

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

habe ich Probleme haben mit PHPUnit Objekte aufgrund der .phar Datei enthält, die jetzt zu verteilen PHPUnit verwendet wird. Sie können in der Nutzung dieses .gist for your own autoinclude.

Ihr Skripts so etwas wie dies aussehen würde aussehen wollen:

für mich
$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); 
Verwandte Themen