6

pcntl_signalを使用して信号処理クラスを作成しました。これをsigalrmに使用します。

私が抱えている問題は、シグナルクラスをテストするためのphpunitテストが機能することです(シグナルクラスで宣言ティックのみを使用します)が、アラームクラスをテストするためのテストクラスは、declare(ticks = 1を追加するとシグナルクラスを使用します) )私のアラームテストでは、それも機能します

ダニの宣言はシグナル処理コードでのみ必要だと思いました。私の場合はシグナルクラスにありますか?しかし、私が見る限り、それは信号処理コードを呼び出すコードにも必要であり、それは私のアラームクラスでも機能しません、私はそれを私のアラームテストクラスに入れなければなりません!?

straceを使用しても、信号はティックとは無関係に配信されます

だから誰かが私のテストでdeclare()を使わなければならない理由を理解していますか?または、それを使用するコードでもdeclare(ticks = 1)が必要なのはなぜですか?これは、ユーザーがdeclareの使用方法を知っている必要があることを意味します

4

1 に答える 1

6

グローバルスコープでティックを使用するには、呼び出し元のスクリプトの先頭にティックを含める必要があります。これがおそらくあなたがそれを再宣言しなければならない理由です。私はあなたのコードを知らずに確かに言うことはできません。以下は、単体テストで機能するいくつかの例です。

IIRCは、次の構成によってコードで自分のティックを宣言できます。

function tick_function() {
    // Do something
}

register_tick_function('tick_function');

declare (ticks=1) {
    // Your code here
}

または実用的な例として

function profile_memory()
{
     echo '<!--' . memory_get_usage() . '-->';
}

register_tick_function('profile_memory');
declare (ticks=1)
{
     $pass = md5('qwerty'); /* Tick executed */
     $pass = strrev($pass);  /* Tick executed */
     echo $pass;  /* Tick executed */
}

これは、単体テスト内で機能する自己完結型のティック関数の実用的な例です。

class TickTest {
    private function profile_memory() {
        static $i;
        ++$i;
        echo "Tick $i\n";
    }
    public function  __construct() {
    }
    public function doTicks() {
        $register_tick_function = register_tick_function(
                array($this,'profile_memory')
            );
        declare (ticks=1) {
            $pass = md5('qwerty'); /* Tick executed */
            $pass = strrev($pass);  /* Tick executed */
        }
    }
}

そして、これは単体テストです(そして、はい、それが実際のテストではないという事実を知っています)

require_once 'PHPUnit/Framework.php';
require_once dirname(__FILE__).'/../ticks.php';
class TickTestTest extends PHPUnit_Framework_TestCase {
    protected $object;
    protected function setUp() {
        $this->object = new TickTest;
    }
    protected function tearDown() {
    }
    public function testDoTicks() {
        $this->object->doTicks();
    }
}

出力を見ると、単体テストの実行時にティック関数が呼び出されます。

いくつかの参考文献

于 2009-12-22T07:57:21.953 に答える