2015-03-13 17 views
5

Mã thử nghiệm của tôi có đầy đủ các lớp tĩnh cuối cùng. và trong khi chúng tôi không thể cấu trúc lại nó để kiểm tra tốt hơn, tôi có một giải pháp trung gian chạy một vài thử nghiệm nhỏ trên quy trình riêng của nó. và tất cả đều hoạt động tốt. nhưng tôi nhận được không có báo cáo bảo hiểm như một ghi đè lên khác.làm thế nào để chạy php đơn vị nhiều lần và nối các báo cáo bảo hiểm?

Tôi hiện đang tạo báo cáo bằng clover, nhưng tôi rất cởi mở với các báo cáo khác.

thử nghiệm của tôi chỉ làm việc khi phpunit được điều hành như:

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

Nhưng điều đó sẽ dẫn đến mỗi lần chạy wipping báo cáo từ trước. Vì vậy, tôi chỉ nhận được một báo cáo cho người cuối cùng. Và nếu tôi cố gắng chạy chúng như phpunit dự kiến ​​sẽ tạo ra các báo cáo đầy đủ, tôi có thất bại bởi vì tất cả các lớp học của tôi bao gồm những cái tĩnh của riêng mình.

/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 

(nhưng ở trên sẽ thất bại ngay cả với --process-isolation --no-globals-backup vì không chính xác những gì họ có nghĩa là ...) - Đây là chưa một câu hỏi về cách để có được đúng quy trình cách ly trên đơn vị php. Tôi đang chạy nó nhiều lần, tôi chỉ muốn có một báo cáo bảo hiểm đầy đủ :)

Có cách nào để các bài kiểm tra chạy đúng (tức là trong một số quy trình để tránh không gian khai báo lớp toàn cầu) như mã đầu tiên chặn, nhưng vẫn có báo cáo bảo hiểm mã toàn diện?

cảm ơn bạn!

Trả lời

7

Schleis câu trả lời không làm việc cho tôi. Phương pháp unserialize() throws một lỗi trong trường hợp của tôi: Lỗi tại bù đắp ...

Tuy nhiên có một cách rất dễ dàng để đạt được điều này:

Tải phpcov như mô tả here.

Có phpunit tạo các báo cáo bảo hiểm php với:

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

Bây giờ bạn có 2 .cov tập tin. Sau đó, trong vỏ yêu thích của bạn:

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

Nó sẽ tạo ra một clover.tệp báo cáo xml.

1

Bạn sẽ phải viết giải pháp, tôi không biết tùy chọn để có phpunit cộng với mức độ phù hợp với các lần chạy khác. Nhưng mã phpunit làm cho điều này không quá đau đớn.

Bạn sẽ muốn sử dụng tùy chọn --coverage-php để nhận báo cáo bảo hiểm. Điều này sẽ làm cho nó dễ dàng hơn để kết hợp tất cả chúng bằng cách sử dụng một kịch bản php. Tùy chọn này xuất ra một tệp với đối tượng PHP_CodeCoverage được tuần tự hóa. Đối tượng này có một phương thức merge có thể được sử dụng để kết hợp các báo cáo. Sau đó, bạn có thể sử dụng đối tượng báo cáo của loại thích hợp để tạo đầu ra cho bạn.

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

tôi đã có vấn đề với đối tượng bao gồm PHPUnit do file .phar rằng hiện đang được sử dụng để phân phối PHPUnit. Bạn có thể muốn xem xét sử dụng .gist for your own autoinclude.

kịch bản này của bạn sẽ giống như thế này:

$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); 
Các vấn đề liên quan