AS3Unitで非同期なコードをテストする
Flex/AIRでも単体テスト書きたいなぁ。。しかも非同期なコールバックとかも含めて。。という私の希望を叶えてくれたすばらしいツールがありました。
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のテストはあいかわらずきびしいですが)。