スティルハウスの書庫の書庫

はてなダイアリーで書いてた「スティルハウスの書庫」を移転してきました。

AS3Unitで非同期なコードをテストする

Flex/AIRでも単体テスト書きたいなぁ。。しかも非同期なコールバックとかも含めて。。という私の希望を叶えてくれたすばらしいツールがありました。

AS3Unit

AS3UnitはActionScript 3.0上で単体テストを行うためのフレームワークで、JUnit4の移植です。ActionScript?3.0の新機能であるネームスペースを用いる事で、POJOによるテストケースの記述を可能にしました。

使い方はJUnitとよく似ています。さらにFlexではテスト用のGUIツールを簡単に作ることができて、テストが通ると以下のように表示されます。

AS3Unitでもっとも便利な点は、ネットワーク呼び出し等の非同期なコードもテストできる点です。

AS3Unit for Asyncでは、非同期処理のテストを行うことが出来ます。

非同期処理のテスト行うには、org.libspark.as3unit.assert.async関数を使います。async関数は、Functionと制限時間を引数に取り、チェックポイント関数を返します。

このチェックポイント関数が、制限時間内に呼び出されるとテストがパスします。チェックポイント関数が呼び出される際、引数として渡したFunctionを呼び出すので、そこで更にアサーションを行うことも可能です。 

例えばこんな感じでテストメソッドを書いておきます:

test function test():void {
	myNetworkCall(async(function(e:Event):void {
		// assertなどで結果をチェック
	}));
}

すると、ハンドラとして渡したFunctionがきちんと一定時間内(デフォルト5秒)に呼び出されて、その中のassert等がちゃんと通っているか確認できる仕組みです。非同期なコードの単体テストなんてあきらめてましたが、これでAS3でも気持ちよくテスト書けるようになりました(UIのテストはあいかわらずきびしいですが)。