6

Şu anda bulunmayan bir sınıf tanımı nedeniyle önemli bir hataya neden olan bir PHPUnit test paketim var. Bu, en nihayetinde, test kodunun kendisinde bir başarısızlık ve geliştiricinin kodun işlenmesinden önce testin kendisini onaylamamasıdır.PHPUnit --process-isolation kullanırken ölümcül hatadan sonra yapılan testlerle devam etmiyor

Bununla birlikte, bu gibi şeyler zaman zaman gerçekleşir ve ölümcül bir hata meydana geldiğinde (kimin nihai olarak sorumlu olduğuna bakılmaksızın), test basitçe bir başarısızlık olarak işaretlenir ve geri kalanlar için harika olur. Test takımı hala yürütülür.

--process-isolation anahtarını okudum ve anlayabildiğim kadarıyla, bununla ilgilenmelidir. Her bir test ayrı bir işlemde çalıştığından, çocuk ölümcül bir hata nedeniyle ölürse, ebeveyn çalışmaya devam edebilir. Aslında, bu cevapta açıkça benzer bir soruya şu şekilde işaret edilmektedir: https://stackoverflow.com/a/5340151/84762, kendimi görmek istediğim çıktı türünü gösterir. süreç izolasyonu İLE süreç izolasyonu

[[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 

OLMADAN

:

Ancak, ne olursa olsun ben --process-isolation bayrağını kullanmak olsun veya olmasın tam aynı çıktıyı almak gibi

[[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 

Başlarımızda etkili bir şekilde farklılık göstermeyenler için, iki çıktı tam anlamıyla aynıdır (uygulama süresi ve ihmal edilebilir ölçüde farklı bellek kullanımı dışında).

Her iki durumda da, önemli hata tüm test paketini öldürür. Bu özel durumda, bu 3. testte olur ve kalan 150 test (diğer dosya/paketlerde) hiçbir zaman idam edilmez.

Burada yanlış olan ne yapıyorum? Ölümcül bir hatanın (testin başarısız olarak işaretlenmesi) bir testte hayatta kalmanın ve hala kalan testleri yürütmenin başka bir yolu var mı?


DÜZENLEME

Ben PHPUnit en GitHub sayfasında yeni bir bilet ilham vermiş PHPUnit bu sorunun cevabına 3.6.10

DÜZENLEME

Yorumlar kullanıyorum: https://github.com/sebastianbergmann/phpunit/issues/545

+0

Cevabınızı burada bulabilirsiniz: http: // stackoverflow.com/questions/277224/how-do-i-catch-a-php-fatal-error – alfasin

+1

Yakalanamayacaklarını ya da olmaması gerektiğini belirten kısımdan bahsediyor olmanızdan emin değilim yakalanamaz ... ama her iki ifade de yanlıştır. Bu durumda, bir sistemin işlevselliğini test ederken, test sürecinin geri kalanını öldürmeden ölümcül hataları yakalamak çok önemlidir. Cevabınızı yanlış anladıysam özür dilerim, lütfen bana bildirin. – KOGI

+0

Yakalanamadığını söyleyen kısımdan bahsediyordum. Kayıt için bir şeyler yazdırmak ve bunu "temiz ups" yapmak için register_shutdown_function işlevini kullanabilirsiniz, ancak çerçeve zaten yok edildiğinden (yığında) programınızı "devam ettirebileceğinizi" sanmıyorum. Tam olarak hangi satırın ölümcül hatayı tetiklediğini bildiğinizden - neden düzeltmezsiniz? – alfasin

cevap

5

PHPUnit her bir test dosyasını yükler herhangi bir test yapmadan önce çalıştırılacak. Bu, PHP'nin bu dosyaları ayrıştırmasına ve üst düzey kodlarını çalıştırmasına neden olur. Örneğin, var olmayan bir sınıfı genişleten herhangi bir sınıf yüklenmişse, önemli bir hata alırsınız.

PHPUnit'i, tarama işlemi sırasında kodlarını yürütmeden dosyaları ayrıştırmak için geliştirmeden, bunun etrafında hiçbir şekilde göremiyorum.

+0

Bu durum hala --process-isolation 'kullanırken durum mu? – KOGI

+0

Evet, yanlış adlandırılmış bir sınıfı genişletmek için bir çalışma sınamasını değiştirerek bir test yaptım ve yalıtımla bile durduruyor. –

+0

İyi lanet olsun! Silbaştan! Teşekkür ederim. – KOGI

İlgili konular