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
Encontrará su respuesta aquí: http: // stackoverflow.com/questions/277224/how-do-i-catch-a-php-fatal-error – alfasin
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
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