2

検索すると、致命的な例外のキャッチに関するいくつかの質問が表示されますが、これは SimpleTest の使用に固有のものです。(SimpleTest が古くなっていることはわかっていますが、私の構成で PHP-Unit を動作させることは別の問題です)。

セットアップ中にデータベースにいくつかのテスト行を作成し、ティアダウン中にそれらを削除するため、致命的な例外が発生した場合でも、tearDown() メソッドを機能させようとしています。しかし、SimpleTest が致命的な例外になると、teardown() は決して実行されません。

致命的な例外にもかかわらず、tearDown() を実行する方法はありますか?

4

2 に答える 2

3

使用できる「register_shutdown_fuction」フックがあります。

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

「shutdownHandler」では、次のように記述できます。

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

Fatal Error が発生すると、PHP プロセスは終了します。つまり、同じ PHP プロセスに追加のコードが存在しないため、実行する方法がありません。

これは、次のことも意味します。

  • あまり報道されないかもしれません
  • 致命的なエラーになった後の他のテストは実行されません
  • 失敗しているテストがあります -- ひどく。


問題を修正する必要があります。アプリケーションの致命的な エラーは問題です。もちろん、自動テストでそれを検出したことは素晴らしいことですが、次のステップはそれをなくすことです;-)


停止した同じプロセスでこれ以上 PHP コードを実行することはできないため、私が見る唯一の解決策は、別のプロセスを起動してクリーンアップ コードを実行することです。

基本的な考え方は次のとおりです。

  • テストを開始する
  • 別の完全に異なるスクリプトを使用して、クリーンアップ操作を実行します

もちろん、これは、すべてのテストが実行された後、クリーンアップが一度だけ行われることを意味します。しかし、何もないよりはましだと思います。


さて、自動化された方法でそれを行う方法は?

最も簡単な解決策は、おそらく両方のコマンドを実行するシェルスクリプトを使用することです。このようなもの、私は言うだろう:

#!/bin/sh

php /.../launch-tests.php

php /.../cleanup.php

そして、そのシェル スクリプトを起動してテストを実行します。

于 2010-03-04T11:31:10.713 に答える