PHP и SimpleTest - запуск tearDown (), даже если есть фатальное исключение - PullRequest
2 голосов
/ 04 марта 2010

Поиск дает пару вопросов по отлову фатальных исключений, но этот специфичен для использования SimpleTest. (Я знаю, что SimpleTest устарел, но заставить PHP-модуль работать с моей конфигурацией - это другой вопрос).

Я пытаюсь заставить метод tearDown () работать даже в случае фатального исключения, так как я создаю несколько тестовых строк в базе данных во время установки и удаляю их во время удаления. Но когда SimpleTest приходит к фатальному исключению, teardown () никогда не запускается.

Есть ли способ запустить tearDown () несмотря на фатальное исключение?

Ответы [ 2 ]

3 голосов
/ 02 февраля 2011

Существует хук "register_shutdown_fuction", который можно использовать:

register_shutdown_function(array($this, 'shutdownHandler'));

В «shutdownHandler» вы можете написать:

error_get_last() && $this->tearDown();
1 голос
/ 04 марта 2010

Когда происходит фатальная ошибка, процесс PHP завершается - это означает, что невозможно, чтобы этот же процесс PHP выполнял какой-либо дополнительный код, поскольку его больше нет.

Это также будет означать, что:

  • вы, вероятно, не получите много отчетов
  • другие тесты после того, который заканчивается фатальной ошибкой, не будут запускаться
  • У вас есть тест, который проваливается - плохо.


Вам следует решить проблему: фатальная ошибка в вашем приложении bad ; это здорово, что ты обнаружил это с помощью своих автоматических тестов, но следующий шаг - убрать его; -)


Поскольку вы больше не можете запускать код PHP в том же процессе, который умер, единственное решение, которое я вижу, состоит в том, чтобы запустить другой процесс, запустить код очистки.

Основная идея заключается в следующем:

  • Запустите ваши тесты
  • Используйте другой, совершенно отдельный скрипт для запуска операций очистки

Конечно, это означает, что очистка будет выполнена только один раз, после того, как все тесты будут выполнены; но я полагаю, это лучше, чем ничего.


Теперь, как это сделать автоматизированным способом?

Возможно, самое простое решение - использовать shell-скрипт, который запускает обе команды; что-то вроде этого, я бы сказал:

#!/bin/sh

php /.../launch-tests.php

php /.../cleanup.php

И запустите свои тесты, запустив этот shell-скрипт.

...