का उपयोग करते समय घातक त्रुटि के बाद परीक्षणों के साथ जारी नहीं रह रहा है मेरे पास एक PHPUnit परीक्षण सूट है जो वर्तमान में एक क्लास परिभाषा के कारण घातक त्रुटि उत्पन्न कर रहा है जो नहीं मिला है। अंत में, यह परीक्षण कोड की विफलता है और डेवलपर द्वारा कोड करने से पहले परीक्षण को सही साबित करने में विफलता है।PHPUnit --process-isolation
हालांकि, इस तरह की चीजें समय-समय पर होती हैं, और यह आश्चर्यजनक होगा कि, जब कोई घातक त्रुटि होती है (चाहे अंततः कौन जिम्मेदार है), परीक्षण को केवल विफलता के रूप में चिह्नित किया जाना चाहिए, और शेष परीक्षण सुइट अभी भी निष्पादित किया जा सकता है।
मैंने --process-isolation
स्विच के बारे में पढ़ा है और जहां तक मैं कह सकता हूं, इसका ख्याल रखना चाहिए। चूंकि प्रत्येक परीक्षण एक अलग प्रक्रिया में चलता है, अगर बच्चे को घातक त्रुटि के कारण मर जाता है, तो माता-पिता अभी भी चलना जारी रख सकते हैं। वास्तव में, यह एक ही प्रश्न के उत्तर में स्पष्ट रूप से बताया गया है: https://stackoverflow.com/a/5340151/84762 जो सटीक प्रकार का आउटपुट दिखाता है जिसे मैं स्वयं देखना चाहता हूं। प्रक्रिया अलगाव के साथ बिना प्रक्रिया अलगाव
[[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
:
हालांकि, मैं या नहीं, मैं --process-isolation
ध्वज का उपयोग की परवाह किए बिना ठीक उसी उत्पादन प्राप्त करने के लिए लग रहे हैं
[[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
हम में से उन लोगों के लिए जो हमारे सिर में प्रभावी ढंग से भिन्न नहीं हो सकते हैं, दोनों आउटपुट सचमुच समान हैं (निष्पादन समय और स्मृति उपयोग के अलावा जो लापरवाही से अलग है)।
दोनों मामलों में, घातक त्रुटि पूरे परीक्षण सूट को मार देती है। इस विशेष मामले में, यह तीसरे परीक्षण में होता है और शेष 150 परीक्षण (कई अन्य फाइलों/सूटों में) कभी निष्पादित नहीं होते हैं।
मैं यहाँ क्या गलत कर रहा हूं? क्या एक परीक्षण में एक घातक त्रुटि (परीक्षण को विफल करने के रूप में चिह्नित) से बचने का कोई और तरीका है और अभी भी शेष परीक्षण निष्पादित करता है?
संपादित
मैं PHPUnit का उपयोग कर रहा 3.6.10
संपादित
इस सवाल का जवाब पर टिप्पणियाँ PHPUnit के GitHub पृष्ठ पर एक नया टिकट को प्रेरित किया है: https://github.com/sebastianbergmann/phpunit/issues/545
आपको अपना उत्तर यहां मिलेगा: http: // stackoverflow।कॉम/प्रश्न/277224/कैसे-करें-i-catch-a-php-fatal-error – alfasin
मुझे यकीन नहीं है कि क्या आप उस हिस्से का जिक्र कर रहे हैं जो कहता है कि उन्हें पकड़ा नहीं जा सकता है या वह हिस्सा जो कहता है कि वे पकड़ा नहीं जा सकता ... लेकिन दोनों कथन गलत हैं। इस मामले में, किसी सिस्टम की कार्यक्षमता का परीक्षण करते समय, बाकी परीक्षण प्रक्रिया को मारने के बिना घातक त्रुटियों को पकड़ना बहुत महत्वपूर्ण है। अगर मैं आपके उत्तर को गलत समझ रहा हूं, तो मैं क्षमा चाहता हूं, कृपया मुझे बताएं। – KOGI
मैं उस हिस्से का जिक्र कर रहा था जो कहता है कि इसे पकड़ा नहीं जा सकता है। यह सच है कि आप लॉग इन करने के लिए सामान प्रिंट करने के लिए register_shutdown_function का उपयोग कर सकते हैं और "क्लीन अप" कर सकते हैं, लेकिन चूंकि फ्रेम पहले से ही नष्ट हो गया था (स्टैक पर) मुझे विश्वास नहीं है कि आप अपने प्रोग्राम को "फिर से शुरू कर सकते हैं"। चूंकि आप वास्तव में जानते हैं कि किस पंक्ति पर घातक त्रुटि ट्रिगर होती है - इसे ठीक क्यों नहीं करें? स्पष्टीकरण के लिए – alfasin