6

Tengo un conjunto de pruebas PHPUnit que actualmente está causando un error fatal debido a una definición de clase que no se encuentra. Esto, en última instancia, es una falla del código de prueba en sí mismo y una falla por parte del desarrollador para justificar la prueba en sí antes de confirmar el código.PHPUnit no continúa con las pruebas después de un error fatal al usar --process-isolation

Sin embargo, cosas como esta suceden de vez en cuando, y sería maravilloso si, cuando ocurre un error fatal (sin importar quién es el responsable final), la prueba simplemente se marca como una falla, y el resto del banco de pruebas todavía se ejecutará.

He leído sobre interruptor --process-isolation y por lo que puedo decir, debería ocúpese de esto. Dado que cada prueba se ejecuta en un proceso separado, si el niño muere debido a un error fatal, el padre aún puede continuar ejecutándose. De hecho, esto se afirma explícitamente en esta respuesta a una pregunta similar: https://stackoverflow.com/a/5340151/84762 que muestra el tipo exacto de salida que me gustaría ver.

Sin embargo, me parece que obtener la misma salida exacta, independientemente de si es o no uso el --process-isolation bandera:

sin aislamiento proceso

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

CON aislamiento del proceso

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

Para aquellos de nosotros que no podemos diferir efectivamente en nuestras cabezas, las dos salidas son literalmente idénticas (aparte del tiempo de ejecución y el uso de memoria que es insignificantemente diferente).

En ambos casos, el error fatal mata todo el conjunto de pruebas. En este caso particular, esto sucede en la tercera prueba y las 150 pruebas restantes (en varios otros archivos/suites) nunca se ejecutan.

¿Qué estoy haciendo mal aquí? ¿Hay alguna otra forma de sobrevivir a un error fatal (marcando la prueba como fallida) en una prueba y todavía ejecutar las pruebas restantes?


EDITAR

estoy utilizando PHPUnit 3.6.10

EDIT

Comentarios sobre la respuesta a esta pregunta ha inspirado un nuevo billete en la página GitHub de PHPUnit: https://github.com/sebastianbergmann/phpunit/issues/545

+0

Encontrará su respuesta aquí: http: // stackoverflow.com/questions/277224/how-do-i-catch-a-php-fatal-error – alfasin

+1

No estoy seguro de si se refiere a la parte que dice que no pueden atrapar o la parte que dice que no deberían no ser atrapado ... pero ambas declaraciones son falsas. En este caso, cuando se prueba la funcionalidad de un sistema, es muy importante detectar errores fatales sin matar el resto del proceso de prueba. Si no entiendo bien tu respuesta, me disculpo, por favor avísame. – KOGI

+0

Me refería a la parte que dice que no se puede atrapar. Es cierto que puedes usar register_shutdown_function para imprimir cosas para iniciar sesión y hacer "limpiezas", pero como el marco ya fue destruido (en la pila) no creo que puedas "reanudar" tu programa. Dado que usted sabe exactamente en qué línea se desencadena el error fatal, ¿por qué no repararlo? – alfasin

Respuesta

5

PHPUnit carga cada archivo de prueba eso se ejecutará antes de ejecutar cualquier prueba. Esto hace que PHP analice estos archivos y ejecute su código de nivel superior. Si se carga cualquier clase que, por ejemplo, amplíe una clase que no existe, obtendrá un error fatal.

No veo ninguna forma de evitar esto sin mejorar PHPUnit para analizar los archivos sin ejecutar su código durante el proceso de escaneo.

+0

¿Sigue siendo así cuando se usa '--process-isolation'? – KOGI

+0

Sí, ejecuté una prueba cambiando una prueba de trabajo para extender una clase con un nombre incorrecto, y se detiene incluso con aislamiento. –

+0

¡Bien! ¡Volver al punto de partida! Gracias. – KOGI

Cuestiones relacionadas