PHP и SimpleTest — запуск tearDown() даже при фатальном исключении

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

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

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


person Extrakun    schedule 04.03.2010    source источник


Ответы (2)


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

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

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

error_get_last() && $this->tearDown();
person Wil Moore III    schedule 02.02.2011

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

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

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


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


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

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

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

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


А как это сделать автоматически?

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

#!/bin/sh

php /.../launch-tests.php

php /.../cleanup.php

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

person Pascal MARTIN    schedule 04.03.2010