6

Tôi có bộ kiểm tra PHPUnit hiện đang gây ra lỗi nghiêm trọng do định nghĩa lớp không được tìm thấy. Điều này, cuối cùng, là một sự thất bại của mã thử nghiệm chính nó và một thất bại của các nhà phát triển để xác minh các thử nghiệm chính nó trước khi cam kết mã. Tuy nhiên, những điều như thế này sẽ xảy ra theo thời gian, và nó sẽ là tuyệt vời nếu, khi một lỗi nghiêm trọng xảy ra (bất kể ai chịu trách nhiệm cuối cùng), bài kiểm tra đơn giản được đánh dấu là thất bại, và phần còn lại của bộ thử nghiệm vẫn được thực hiện.PHPUnit không tiếp tục kiểm tra sau khi lỗi nghiêm trọng khi sử dụng --process-isolation

Tôi đã đọc về công tắc --process-isolation và theo như tôi có thể biết, nó nên giải quyết vấn đề này. Vì mỗi thử nghiệm chạy trong một tiến trình riêng biệt, nếu đứa trẻ chết do lỗi nghiêm trọng, phụ huynh vẫn có thể tiếp tục chạy. Trong thực tế, điều này được nêu rõ trong câu trả lời này cho một câu hỏi tương tự: https://stackoverflow.com/a/5340151/84762 cho thấy loại đầu ra chính xác mà tôi muốn xem bản thân mình.

Tuy nhiên, tôi dường như nhận được cùng một kết quả chính xác bất kể có hay không tôi sử dụng --process-isolation cờ:

KHÔNG quá trình cách ly

[[email protected] ~]$ /usr/bin/phpunit --colors --verbose --coverage-html "target/coverage" ~/app/zend/tests/application/ 

PHP Fatal error: Class 'Rmd_Database_OldObject' not found in /home/kogi/app/zend/private/models/translate/Poll.php on line 9 
PHP Stack trace: 
PHP 1. {main}() /usr/bin/phpunit:0 
PHP 2. PHPUnit_TextUI_Command::main() /usr/bin/phpunit:46 
PHP 3. PHPUnit_TextUI_Command->run() /usr/share/pear/PHPUnit/TextUI/Command.php:130 
PHP 4. PHPUnit_Runner_BaseTestRunner->getTest() /usr/share/pear/PHPUnit/TextUI/Command.php:150 
PHP 5. PHPUnit_Framework_TestSuite->addTestFiles() /usr/share/pear/PHPUnit/Runner/BaseTestRunner.php:96 
PHP 6. PHPUnit_Framework_TestSuite->addTestFile() /usr/share/pear/PHPUnit/Framework/TestSuite.php:419 
PHP 7. PHPUnit_Util_Fileloader::checkAndLoad() /usr/share/pear/PHPUnit/Framework/TestSuite.php:358 
PHP 8. PHPUnit_Util_Fileloader::load() /usr/share/pear/PHPUnit/Util/Fileloader.php:79 
PHP 9. include_once() /usr/share/pear/PHPUnit/Util/Fileloader.php:95 
PHP 10. require_once() /home/kogi/app/zend/tests/application/translate/PollTest.php:11 

Fatal error: Class 'Rmd_Database_OldObject' not found in /home/kogi/app/zend/private/models/translate/Poll.php on line 9 

Call Stack: 
    0.0003  91584 1. {main}() /usr/bin/phpunit:0 
    0.0076  612672 2. PHPUnit_TextUI_Command::main() /usr/bin/phpunit:46 
    0.0076  613744 3. PHPUnit_TextUI_Command->run() /usr/share/pear/PHPUnit/TextUI/Command.php:130 
    0.0246 1249464 4. PHPUnit_Runner_BaseTestRunner->getTest() /usr/share/pear/PHPUnit/TextUI/Command.php:150 
    0.0706 1626680 5. PHPUnit_Framework_TestSuite->addTestFiles() /usr/share/pear/PHPUnit/Runner/BaseTestRunner.php:96 
    0.1691 8053584 6. PHPUnit_Framework_TestSuite->addTestFile() /usr/share/pear/PHPUnit/Framework/TestSuite.php:419 
    0.1693 8057320 7. PHPUnit_Util_Fileloader::checkAndLoad() /usr/share/pear/PHPUnit/Framework/TestSuite.php:358 
    0.1694 8057664 8. PHPUnit_Util_Fileloader::load() /usr/share/pear/PHPUnit/Util/Fileloader.php:79 
    0.1711 8240600 9. include_once('/home/kogi/app/zend/tests/application/translate/PollTest.php') /usr/share/pear/PHPUnit/Util/Fileloader.php:95 
    0.1805 9187768 10. require_once('/home/kogi/app/zend/private/models/translate/Poll.php') /home/kogi/app/zend/tests/application/translate/PollTest.php:11 

VỚI quá trình cách ly

[[email protected] ~]$ /usr/bin/phpunit --colors --verbose --coverage-html "target/coverage" --process-isolation ~/app/zend/tests/application/ 
PHP Fatal error: Class 'Rmd_Database_OldObject' not found in /home/kogi/app/zend/private/models/translate/Poll.php on line 9 
PHP Stack trace: 
PHP 1. {main}() /usr/bin/phpunit:0 
PHP 2. PHPUnit_TextUI_Command::main() /usr/bin/phpunit:46 
PHP 3. PHPUnit_TextUI_Command->run() /usr/share/pear/PHPUnit/TextUI/Command.php:130 
PHP 4. PHPUnit_Runner_BaseTestRunner->getTest() /usr/share/pear/PHPUnit/TextUI/Command.php:150 
PHP 5. PHPUnit_Framework_TestSuite->addTestFiles() /usr/share/pear/PHPUnit/Runner/BaseTestRunner.php:96 
PHP 6. PHPUnit_Framework_TestSuite->addTestFile() /usr/share/pear/PHPUnit/Framework/TestSuite.php:419 
PHP 7. PHPUnit_Util_Fileloader::checkAndLoad() /usr/share/pear/PHPUnit/Framework/TestSuite.php:358 
PHP 8. PHPUnit_Util_Fileloader::load() /usr/share/pear/PHPUnit/Util/Fileloader.php:79 
PHP 9. include_once() /usr/share/pear/PHPUnit/Util/Fileloader.php:95 
PHP 10. require_once() /home/kogi/app/zend/tests/application/translate/PollTest.php:11 

Fatal error: Class 'Rmd_Database_OldObject' not found in /home/kogi/app/zend/private/models/translate/Poll.php on line 9 

Call Stack: 
    0.0003  91752 1. {main}() /usr/bin/phpunit:0 
    0.0076  612824 2. PHPUnit_TextUI_Command::main() /usr/bin/phpunit:46 
    0.0076  613896 3. PHPUnit_TextUI_Command->run() /usr/share/pear/PHPUnit/TextUI/Command.php:130 
    0.0246 1250360 4. PHPUnit_Runner_BaseTestRunner->getTest() /usr/share/pear/PHPUnit/TextUI/Command.php:150 
    0.0708 1627528 5. PHPUnit_Framework_TestSuite->addTestFiles() /usr/share/pear/PHPUnit/Runner/BaseTestRunner.php:96 
    0.1688 8054296 6. PHPUnit_Framework_TestSuite->addTestFile() /usr/share/pear/PHPUnit/Framework/TestSuite.php:419 
    0.1690 8057992 7. PHPUnit_Util_Fileloader::checkAndLoad() /usr/share/pear/PHPUnit/Framework/TestSuite.php:358 
    0.1691 8058336 8. PHPUnit_Util_Fileloader::load() /usr/share/pear/PHPUnit/Util/Fileloader.php:79 
    0.1707 8241296 9. include_once('/home/kogi/app/zend/tests/application/translate/PollTest.php') /usr/share/pear/PHPUnit/Util/Fileloader.php:95 
    0.1801 9188464 10. require_once('/home/kogi/app/zend/private/models/translate/Poll.php') /home/kogi/app/zend/tests/application/translate/PollTest.php:11 

Đối với những người trong chúng ta có thể không có hiệu quả khác biệt trong đầu của chúng tôi, hai kết quả đầu ra là nghĩa đen giống hệt nhau (khác với thời gian thực hiện và sử dụng bộ nhớ mà là không rõ ràng khác nhau).

Trong cả hai trường hợp, lỗi nghiêm trọng sẽ giết chết toàn bộ bộ thử nghiệm. Trong trường hợp cụ thể này, điều này xảy ra trong lần kiểm tra thứ 3 và 150 kiểm tra còn lại (trong một số tệp/bộ khác) sẽ không bao giờ được thực thi.

Tôi đang làm gì sai ở đây? Có cách nào khác để tồn tại một lỗi nghiêm trọng (đánh dấu thử nghiệm là không thành công) trong một thử nghiệm và vẫn thực hiện các thử nghiệm còn lại không?


EDIT

Tôi đang sử dụng PHPUnit 3.6.10

EDIT

Các bình luận về câu trả lời cho câu hỏi này đã truyền cảm hứng cho một vé mới trên trang GitHub PHPUnit của: https://github.com/sebastianbergmann/phpunit/issues/545

+0

Bạn sẽ tìm thấy câu trả lời của mình tại đây: http: // stackoverflow.com/questions/277224/how-do-i-catch-a-php-fatal-lỗi – alfasin

+1

Tôi không chắc chắn nếu bạn đang đề cập đến phần nói rằng họ không thể bị bắt hoặc một phần nói rằng họ shouldn không bị bắt ... nhưng cả hai câu đều sai. Trong trường hợp này, khi kiểm tra chức năng của một hệ thống, nó rất quan trọng để bắt lỗi nghiêm trọng mà không giết chết phần còn lại của quá trình thử nghiệm. Nếu tôi hiểu nhầm câu trả lời của bạn, tôi xin lỗi, xin vui lòng cho tôi biết. – KOGI

+0

Tôi đã đề cập đến phần nói rằng nó không thể bị bắt. Đó là sự thật bạn có thể sử dụng register_shutdown_function để in công cụ để đăng nhập và làm như vậy "up sạch" nhưng kể từ khi khung đã bị phá hủy (trên stack) Tôi không tin rằng bạn có thể "tiếp tục" chương trình của bạn. Vì bạn biết chính xác dòng lỗi gây tử vong nào được kích hoạt - tại sao không sửa lỗi? – alfasin

Trả lời

5

PHPUnit tải mỗi tệp thử nghiệm sẽ chạy trước khi chạy bất kỳ thử nghiệm nào. Điều này làm cho PHP phân tích các tệp này và thực thi mã cấp cao nhất của chúng. Nếu bất kỳ lớp nào được tải, ví dụ, mở rộng một lớp không tồn tại, bạn sẽ nhận được một lỗi nghiêm trọng.

Tôi không thấy bất kỳ cách nào xung quanh việc này mà không tăng cường PHPUnit để phân tích các tệp mà không thực thi mã của họ trong quá trình quét.

+0

Đây có phải là trường hợp khi sử dụng '--process-isolation' không? – KOGI

+0

Có, tôi đã chạy một bài kiểm tra bằng cách thay đổi một bài kiểm tra làm việc để mở rộng một lớp học bị đặt tên sai, và nó dừng lại ngay cả khi cô lập. –

+0

Thật đáng tiếc! Quay lại hình vuông! Cảm ơn bạn. – KOGI

Các vấn đề liên quan