PHP和SimpleTest - 即使存在致命异常,也会运行tearDown()

时间:2010-03-04 07:52:54

标签: php exception-handling simpletest

搜索会产生一些关于捕获致命异常的问题,但这个问题特定于使用SimpleTest。 (我知道SimpleTest已经过时了,但让PHP-Unit处理我的配置是另一个问题。)

我正在尝试使tearDown()方法工作,即使存在致命异常,因为我在安装过程中在数据库中创建了一些测试行,并在拆除过程中将其删除。但是当SimpleTest出现致命异常时,teardown()永远不会运行。

有没有办法让tearDown()在致命的情况下运行?

2 个答案:

答案 0 :(得分:3)

可以使用“register_shutdown_fuction”挂钩:

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

在“shutdownHandler”中你可以写:

error_get_last() && $this->tearDown();

答案 1 :(得分:1)

当发生致命错误时,PHP进程终止 - 这意味着没有办法让相同的PHP进程执行任何类型的附加代码,因为它不再存在。

这也意味着:

  • 你可能没有太多的报道
  • 在致命错误结束之后的其他测试将无法运行
  • 你的测试失败了 - 非常糟糕。


您应该解决问题:应用程序中的致命错误错误;当然,您通过自动化测试检测到它非常棒 - 但下一步是让它消失; - )


由于您无法在已经死亡的同一进程中运行PHP代码,因此我看到的唯一解决方案是启动另一个进程,以运行清理代码。

基本理念是:

  • 启动测试
  • 使用另一个完全不同的脚本来运行清理操作

当然,这意味着在所有测试完成后,清理工作只会进行一次;但我想它总比没有好。


现在,如何以自动化方式做到这一点?

最简单的解决方案可能是使用shell脚本,它运行两个命令;像这样的事情,我会说:

#!/bin/sh

php /.../launch-tests.php

php /.../cleanup.php

通过启动shell脚本运行测试。