Yaks

script.aculo.us付属のユニットテスト(unittest.js)の使い方 後編 はてなブックマーク - script.aculo.us付属のユニットテスト(unittest.js)の使い方 後編

前回に引き続きscript.aculo.usに付属の ユニットテスト(unittest.js)の使い方です。

今回は、ベンチマーク関数やマウス、キーボードのシミュレート関数の使い方を解説していきます。

benchmark関数

benchmark関数は、前回挙げた assert系とはちょっと動きが異なり、その名の通り、任意の関数のベンチマーク(処理時間の計測)を取るために使います。

benchmark( func [, times] )
funcを timesで指定した回数だけ実行し、処理にかかった時間をログに表示します。timesを省略すると、一回だけ実行されます。

例えば、こんな感じで使います。

var domOperation = function(){
	var div = document.createElement( 'div' );
	document.body.appendChild( div );
	Element.remove( div );
};

benchmark( domOperation, 1000 );

この例では、DOM(DIV要素)の生成、DOMツリーへの追加、削除を 1000回実行するのに要する時間を測定しています。
結果はこんな感じで表示されます。 (ちなみに Firefox1.5.0.9 / Windows 2000 で実行した結果です。)

benchmark.png

テストの下地だけ作っておけば、手軽にベンチマークが実行できるので 便利です。

wait関数

waitは、テストを補助するための関数です。

wait( time, func )
timeミリ秒後に、funcで指定したコードを実行します。

という説明だと、タイマーとあまり変わらない感じのですが、実際には以下のような記述して テストを待機、継続させるために使います。


// (テストコード)
// (なにかの処理)

wait( 1000, function(){ with( this ){
	assert( /* なにかの処理の結果を判別するコード */ );
     // 続きのテストコード
} } );


注意点としては、waitを複数回行う場合には、第 2引数の関数をネストする形で書く必要があります。(wait()関数の後ろに書いてしますと、wait行が実行された直後に実行されてしまいます。)

wait( 1000, function(){ with( this ){
	// さらに 1秒待つ
	wait( 1000, function(){ with( this ){
		// もっと待つ
		wait( 1000, function(){ with( this ){
		// テストの続きは、ここに書いていく。
		} } );
	} } );
} } );

// ここに書いた処理は、最初の wait関数の直後に(待機しないで)実行される。


Event.simulateMouse, Event.simulateKey

最後に、テスト用に追加されている Eventクラスの関数を二つ。その名の通り、マウスとキーボードのイベントをシミュレートします。
ただし、残念ながら Firefox限定で、かつ simulateKeyは Firefox 1.0.4 以前のバージョンでないと動作しないようです。

なので、本格的なテストの自動化のような使い方はできず、イベント関数の バインディングがうまくいっているかのチェックなどといった、
簡単な確認に使うくらいに思っておいたほうがよさそうです。

Event.simulateMouse( element, eventName[, options] )
elementに対して、eventNameで指定したイベントを発生させます。(Firefox上でのみ動作)eventNameは Event.observeなどと同じく、イベント関数名の'on'を除いたもの('click'や'mousemove'など)を指定します。 optionsには以下のメンバ(いずれも任意)を持ったオブジェクトを指定できます。
pointerX integer クリック位置の X座標
pointerY integer クリック位置の Y座標
buttons integer ボタンが何回クリックされたか
ctrlKey boolean ctrlキーが押されたか
altKey boolean altキーが押されたか
shiftKey boolean shiftキーが押されたか
metaKey boolean metaキー(?)が押されたか
Event.simulateKey( element, eventName[, options] )
elementに対して、eventNameで指定したキーボードイベントを発生させます。(Firefox 1.0.4以前で動作)eventNameは simulateMouseと同じく、イベント関数名の'on'を除いたもの('keydown'や'keyup'など)を指定します。 optionsには以下のメンバ(いずれも任意)を持ったオブジェクトを指定できます。
ctrlKey boolean ctrlキーが押されたか
altKey boolean altキーが押されたか
shiftKey boolean shiftキーが押されたか
metaKey boolean metaキー(?)が押されたか
keyCode integer 仮想キーコード
charCode integer 文字コード

ちなみに、Firefox(Mozilla)のイベント処理はこちらが詳しいです。→ DOM:event (on Mozilla Developer Center)


benchmarkと waitを使用した テストのサンプルを用意しましたので、ご覧になってみてください。


以上で script.aculo.usの unittestの一通りの使い方の解説はおしまいです。

そこまで高機能なテストフレームワークではないですが、prototype.jsや script.aculo.usを用いたコードのテストとしては比較的手軽で便利に使えるのではないでしょうか。

であ、また。