Adobe Air‎ > ‎

fluintを試してみる

fluintはAdobeAIRのGUIテストができるテストフレームワークです。
GUI上でのKeyの入力、Mouseのクリックなどのイベントを擬似的に発火させることにより、GUIを動作させた結果をテストすることができます。
実際動作している画面はみれませんが。。。


テストケースの書き方

提供されているfluint_v1.swcには、net.digitalprimates.fluint.tests.TestCaseというテストケースが提供されています。
このTestCaseを継承し、テストケースを記述していきます。

UnitテストのstartUp、tearDownと同様のメソッドは
override protected function setUp():void
override protected function tearDown():void
で記述できます。

テストのメソッドは[Test]というメタタグをつけることにより認識します。
[Test]
public function checkInit():void

FlexUnitよりも後に出て来たモノだけあって、いい感じですねっ♪


テストする対象のクラスは、mx:Panelなどのクラスをインスタンスし、TestCaseの子として追加することにより操作対象になります。
public class TestCase1 extends TestCase {
private var form:CalPanel;
       
         override protected function setUp():void {
                form = new CalPanel();
                form.addEventListener(FlexEvent.CREATION_COMPLETE,
                    asyncHandler(pendUntilComplete, 100), false, 0, true );
                addChild(form);
        }

GUIで大事なものとして、
  • 値を設定、マウスのクリック などのGUI操作
  • 処理が完了するまで待機してから次を実行
があります。
これらの操作をするのに、net.digitalprimates.fluint.sequence.SequenceRunnerというクラスを使うようです。
SequenceRunnerにSequenceSetter(値を設定する処理)、SequenceWaiter(処理を待つ処理)という処理のクラスを追加して最後にSequenceRunner#run() で処理を実行します。


左から TextInputが順に a, b, cで、Buttonが cal というものを作成した場合、操作は以下のように記述できます。

var passThroughData:Object = new Object();          
passThroughData.a = '5';
passThroughData.b = '12';
passThroughData.c = '17';

var sequence:SequenceRunner = new SequenceRunner(this);
sequence.addStep(new SequenceSetter(form.a, {text:passThroughData.a}));
sequence.addStep(new SequenceWaiter(form.a, FlexEvent.VALUE_COMMIT, 100));
sequence.addStep(new SequenceSetter(form.b, {text:passThroughData.b}));
sequence.addStep(new SequenceWaiter(form.b, FlexEvent.VALUE_COMMIT, 100));
sequence.addStep(new SequenceEventDispatcher(form.cal, new MouseEvent('click', true, false )));
sequence.addStep(new SequenceWaiter(form.c, FlexEvent.VALUE_COMMIT, 100));

SequenceRunnerにaddStepで実行したい処理を追加していきます。

new SequenceSetter(form.a, {text:passThroughData.a}
は、 form.a.text = passThroughData.a  を行なっています。つまりaのTextに'5'を設定しています。

new SequenceWaiter(form.a, FlexEvent.VALUE_COMMIT, 100)
は、form.a の FlexEvent.VALUE_COMMITイベントがくるまで待機しています。つまり、設定した値が確定されるまで待つ処理です。
単純に値を設定するだけでしたら、こぅいぅ待つ処理は特になくても動作しますが、「サーバにアクセスする」などの時間がかかる処理がある場合には待つ処理は必要になるかと思います。

で、最後に結果が正しいか?のAssertと実行をおこないます。

sequence.addAssertHandler(handleEvent, passThroughData );    
sequence.run();

handleEventのメソッドは今回は以下のように実装しました。
        private function handleEvent(event:Event, passThroughData:Object):void {
            assertEquals(passThroughData.a, form.a.text );
            assertEquals(passThroughData.b, form.b.text );
            assertEquals(passThroughData.c, form.c.text );
        }

実行方法

実行方法としては、Flex画面で結果を表示する方法と、Antで実行する方法があるようです。
今回はFlex画面で結果を表示してみました。

RunnerのMXMLは以下になります。
FlexTestRunner.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication
    xmlns:mx="http://www.adobe.com/2006/mxml"
    xmlns:fluint="http://www.digitalprimates.net/2008/fluint"
    layout="absolute"
    creationComplete="startTestProcess(event)"
    width="100%" height="100%">
   
    <mx:Script>
        <![CDATA[
            import net.digitalprimates.fluint.unitTests.frameworkSuite.FrameworkSuite;
            protected function startTestProcess( event:Event ) : void {
                var suiteArray:Array = new Array();
                suiteArray.push( new TestFlexSuite() );
                testRunner.startTests( suiteArray );
            }
        ]]>
    </mx:Script>   
   
    <fluint:TestResultDisplay width="100%" height="100%" />
    <fluint:TestRunner id="testRunner"/>
</mx:WindowedApplication>

TestFlexSuiteとしてSuiteをつくっておけば、テストが増えてもこのMXMLは触らなくてもいいのでTestSuiteを作っています。
今回作ったのは、こんな感じ
TestFlexSuite.as
package  {
    import net.digitalprimates.fluint.tests.TestSuite;
    public class TestFlexSuite extends TestSuite {
        public function TestFlexSuite() {
            addTestCase(new TestCase1());
        }
    }
}


実行結果



成功したら緑のバーというのは見慣れた感じでよいですね。
エラーが発生したらStackTraceが見れます。
上図は 期待値が125だったのに、結果が124だった時のエラーになっています。

何行目でエラーが発生したか?というのは、コンパイル時に -debug オプションをつけてあげると表示されるようです。
基本は、1つのテストケースの内容は少なくするのが基本ですが、StackTraceだけで原因が分からない場合にはdebugオプションをつけるのも手ですね。

テストモジュール


テストで動かしてみたプロジェクトを FluintSample.zip に置いておきます。
AIR GEAR v1.0.1以上が入ったEclipseにて、File→Importの画面にて、General→ExistingProjects into Workspaceを選んでインポートしてみてください〜!
アプリケーションの実行は、プロジェクトの右クリック→Run As→AIR Applicationで実行できます。
テストの実行は、Run→Run configurations でアプリケーションのLanuch(FluintSample)をコピーして、ApplicationDescriptorをapplication_test.xmlにしてください。



ċ
FluintSample.zip
(853k)
hideko ogawa,
Nov 24, 2008, 7:34 AM
Comments