2

搜索会产生几个关于捕获致命异常的问题,但这个问题是针对使用 SimpleTest 的。(我知道 SimpleTest 已经过时了,但是让 PHP-Unit 在我的配置上工作是另一个问题)。

我试图让 tearDown() 方法即使在出现致命异常时也能正常工作,因为我在设置过程中在数据库中创建了一些测试行,并在拆卸过程中将它们删除。但是当 SimpleTest 遇到致命异常时,teardown() 永远不会运行。

尽管有致命的异常,有没有办法让 tearDown() 运行?

4

2 回答 2

3

有一个可以使用的“register_shutdown_fction”钩子:

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

在“shutdownHandler”中你可以写:

error_get_last() && $this->tearDown();
于 2011-02-02T07:12:25.787 回答
1

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

这也意味着:

  • 你可能不会得到太多的报道
  • 以致命错误结束的测试之后的其他测试将不会运行
  • 你有一个失败的测试——很糟糕。


你应该解决这个问题:你的应用程序中的一个致命错误是坏的;当然,很高兴您通过自动化测试检测到它——但下一步是让它消失;-)


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

基本思想是:

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

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


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

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

#!/bin/sh

php /.../launch-tests.php

php /.../cleanup.php

并通过启动该 shell 脚本来运行您的测试。

于 2010-03-04T11:31:10.713 回答