ひよっこ。

I want to…

FlexUnit4が使いたくなった。

Posted by hikaruworld : 2009 6月 10

FlexUnit4とはいわゆるJUnit4のFlex&AS3版。
(ただ、使った感じはパラメータを渡せたりするのでTestNGに近い感じがする)

実はFlexで自動テストはほとんど書いていなかったこともあり、
JUnit4なところに惚れてちょっと調べてみた。

とりあえず、ライブラリはここからFlexUnit4 beta1.0をダウンロードした。
なおMajor New Features of FlexUnit 4 に詳しく使い方が書いてある。
後は、この辺りも参考になる。(全部英語だけど)

  1. FlexUnit 4 in 360 seconds
  2. FlashBuilder 4 will support FlexUnit 4 – tutorials and feature overview

というか、ダウンロードした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で利用したいので)、
時間切れだ。。。

コメントを残す