2010年2月6日土曜日

QUnitのstartとstop

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
QUnitはjQueryのunittest frame work. setTimeoutで13ってなんだよ!
クロスブラウザのJSのunittest frameworkで非同期のテストをサポートしているモノはほかに何があるのだろう?知っている方がいたら教えてください。

from jQueryのテスティングフレームワーク QUnit

start( ) : テストを再開します。

stop( ) : テストを中断します。Ajaxで非同期通信等のテストを行うとき、非同期処理前にstop()でテストを止め、非同期処理終了時のコールバック関数内で start()を実行して、テストを再開します。

とのこと。これだけではどういう機構なのかさっぱりわからないのでソースを見てみる。
  start: function() {
    // A slight delay, to avoid any current callbacks
    if ( window.setTimeout ) {
      window.setTimeout(function() {
        if ( config.timeout ) {
          clearTimeout(config.timeout);
        }

        config.blocking = false;
        process();
      }, 13);
    } else {
      config.blocking = false;
      process();
    }
  },

  stop: function(timeout) {
    config.blocking = true;

    if ( timeout && window.setTimeout ) {
      config.timeout = window.setTimeout(function() {
        QUnit.ok( false, "Test timed out" );
        QUnit.start();
      }, timeout);
    }
  },
  • stopは一時中断で、あまり長く中断しているとテスト失敗にする。通常は非同期な動作を開始する前に呼ぶ。つまり非同期動作が長いということはその非同期動作の制御が戻ってきていないということになる。
  • startの13は謎。processを呼ぶとテストが走るのだと思う。
さらにprocessを追ってみる。
function process() {
  while ( config.queue.length && !config.blocking ) {
    config.queue.shift()();
  }
}
  1. キューから関数を抜いてそれを実行する。
  2. config.blockingをたててテストを中断し、フラグをクリアしてprocessを呼べば再開できる。キューから抜かれてしまったモノは中断できないはず、というかブロッキングですね。
古いMacOSの協調的マルチプロセッシングを思い出します。pre-emptされないのでプログラムは自発的に制御を明け渡さないといけない。キューに詰められるitemの粒度が大きいと気持ち悪いですね。

0 件のコメント: