FlexUnit4が使いたくなった。
Posted by hikaruworld : 2009 6月 10
FlexUnit4とはいわゆるJUnit4のFlex&AS3版。
(ただ、使った感じはパラメータを渡せたりするのでTestNGに近い感じがする)
実はFlexで自動テストはほとんど書いていなかったこともあり、
JUnit4なところに惚れてちょっと調べてみた。
とりあえず、ライブラリはここからFlexUnit4 beta1.0をダウンロードした。
なおMajor New Features of FlexUnit 4 に詳しく使い方が書いてある。
後は、この辺りも参考になる。(全部英語だけど)
というか、ダウンロードしたFlexUnit4 beta1.0にあるsrc/FlexUnit4Turnkey.mxmlのソースを見るのが一番手っ取り早い(そのまま動かせるし)。
ただ、FlexUnit4Trunkey.mxmlはMXMLベースで書かれていて、Flexが立ち上がってGUIでテストが実行される。
とりあえず、今回は最小構成で動かしたいんだけどなぁーと思っていたので(GUIとかいらない)簡単なサンプルを作ってみた。忘れないように張っておく。
プロジェクト構成
ちなみにIDEはFlashDevelop。Flash(Flex)Builderとはちょっと違うはず。
FlexUnit4Test + lib + FlexUnit1Lib.swc + FlexUnit4.swc + FlexUnit4UIRunner.swc + hamcrest-as3.swc + src + Calculate.as + test + CalculateTestSuite.as + FlexUnitTester.as
lib — 必要なlibファイル(ダウンロードしてきたFlex4のlibsにある)。
src — 実際のソース
test — テストソース
※事前にlib以下及びsrc,testにパスを通してあることを前提。
サンプルソース
実行クラス(テストを実行する)
package { import flash.display.Sprite; import org.flexunit.flexui.TestRunnerBase; import org.flexunit.runner.FlexUnitCore; /** * 実行クラス */ public class FlexUnitTester extends Sprite { public function FlexUnitTester() { var core:FlexUnitCore = new FlexUnitCore(); // 複数実行したければカンマ区切りでクラスを与えるか、俗に言うTestSuiteを作成する core.run( CalculateTest ); } } }
テストコード
(TDDだからまずは実際のコードよりもテストコードが先だよね?)
package { import org.flexunit.Assert; /** * Calculateのテストクラス */ public class CalculateTest { /** テスト対象クラスのインスタンス */ private static var target:Calculate = new Calculate(); /** * Javaでいう@Testの役割をメタタグの[Test]が果たす。 * JUnit4ライクということでIgnoreやBefore,Afterも使える。 * 詳しくはドキュメントに色々書いてある。 */ [Test] public function testAdd():void { Assert.assertEquals(2, target.add(1, 1)); } } }
実コード
package { /** * テスト対象クラスのサンプル */ public class Calcuate { /** * 引数で渡された値を合計して返すだけ。 */ public function add(i:int, j:int):int { return i + j; } } }
実行結果
FlexUnitTesterを実行する。結果はこんな感じに標準出力に出力される。
6/10/2009 15:58:00.531 [INFO] FlexUnit4 CalculateTest.testAdd . 6/10/2009 15:58:00.546 [INFO] FlexUnit4 Time: .023 6/10/2009 15:58:00.546 [INFO] FlexUnit4 OK (1 test)
ソースを以下のように修正して、失敗させるとこんな感じ。
//Assert.assertEquals(2, target.add(1, 1)); Assert.assertEquals(3, target.add(1, 1)); // ←エラーにする。
6/10/2009 16:00:02.375 [INFO] FlexUnit4 CalculateTest.testAdd . 6/10/2009 16:00:02.390 [WARN] FlexUnit4 CalculateTest.testAdd E 6/10/2009 16:00:02.390 [INFO] FlexUnit4 Time: .023 6/10/2009 16:00:02.390 [WARN] FlexUnit4 There was 1 failure: 6/10/2009 16:00:02.390 [WARN] FlexUnit4 1 CalculateTest.testAdd expected:<3> but was:<2> ...<<長いので省略>> at org.flexunit.runner::FlexUnitCore/run()[C:\Users\mlabriola\Documents\workspaces\net\digitalprimates\opensource\branches\4.x\FlexUnit4\src\org\flexunit\runner\FlexUnitCore.as:125] at FlexUnitTester()[C:\FlashDevelp\FlexUnit4Sample\test\FlexUnitTester.as:17] 6/10/2009 16:00:02.390 [WARN] FlexUnit4 FAILURES!!! Tests run: 1, 1 Failures:
という感じで怒られる。
ちなみに、
「おいおい、TDDやるんならGUIでグリーンにならなきゃだめだろ~」
という人は、FlexUnitCoreのインスタンスに
addListener(new UIListener(new TestRunnerBase()));してやればよい。
そうするとGUIが起動してグラフィカルに参照できるようになる。
ってか、ソース見ていて思ったんだけどIRunListenerをImplementsしているのはこいつだけなのかなぁ。
XML出力とかもこのリスナを設定すればよいだけな気がするんだけど(Hudsonで利用したいので)、
時間切れだ。。。
コメントを残す