6

का उपयोग करते समय घातक त्रुटि के बाद परीक्षणों के साथ जारी नहीं रह रहा है मेरे पास एक 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

+0

आपको अपना उत्तर यहां मिलेगा: http: // stackoverflow।कॉम/प्रश्न/277224/कैसे-करें-i-catch-a-php-fatal-error – alfasin

+1

मुझे यकीन नहीं है कि क्या आप उस हिस्से का जिक्र कर रहे हैं जो कहता है कि उन्हें पकड़ा नहीं जा सकता है या वह हिस्सा जो कहता है कि वे पकड़ा नहीं जा सकता ... लेकिन दोनों कथन गलत हैं। इस मामले में, किसी सिस्टम की कार्यक्षमता का परीक्षण करते समय, बाकी परीक्षण प्रक्रिया को मारने के बिना घातक त्रुटियों को पकड़ना बहुत महत्वपूर्ण है। अगर मैं आपके उत्तर को गलत समझ रहा हूं, तो मैं क्षमा चाहता हूं, कृपया मुझे बताएं। – KOGI

+0

मैं उस हिस्से का जिक्र कर रहा था जो कहता है कि इसे पकड़ा नहीं जा सकता है। यह सच है कि आप लॉग इन करने के लिए सामान प्रिंट करने के लिए register_shutdown_function का उपयोग कर सकते हैं और "क्लीन अप" कर सकते हैं, लेकिन चूंकि फ्रेम पहले से ही नष्ट हो गया था (स्टैक पर) मुझे विश्वास नहीं है कि आप अपने प्रोग्राम को "फिर से शुरू कर सकते हैं"। चूंकि आप वास्तव में जानते हैं कि किस पंक्ति पर घातक त्रुटि ट्रिगर होती है - इसे ठीक क्यों नहीं करें? स्पष्टीकरण के लिए – alfasin

उत्तर

5

PHPUnit प्रत्येक परीक्षण फ़ाइल लोड करता है जो किसी भी परीक्षण चलाने से पहले चलाया जाएगा। यह PHP को इन फ़ाइलों को पार्स करने और उनके शीर्ष-स्तरीय कोड निष्पादित करने का कारण बनता है। यदि किसी वर्ग को लोड किया गया है, उदाहरण के लिए, उस वर्ग को बढ़ाता है जो अस्तित्व में नहीं है, तो आपको एक घातक त्रुटि मिल जाएगी।

स्कैनिंग प्रक्रिया के दौरान अपने कोड को निष्पादित किए बिना फ़ाइलों को पार्स करने के लिए PHPUnit को बढ़ाने के बिना मुझे इसके आसपास कोई रास्ता नहीं दिख रहा है।

+0

क्या यह अभी भी मामला है - 'प्रोसेस-अलगाव' का उपयोग करते समय? – KOGI

+0

हां, मैंने एक गलत नाम वर्ग का विस्तार करने के लिए एक कार्यकारी परीक्षण को बदलकर एक परीक्षण चलाया, और यह अलगाव के साथ भी बंद हो जाता है। –

+0

अच्छा लानत! एक वर्ग को वापस! धन्यवाद। – KOGI