使用: Flex Unit Test Framework

因應 XP 開發手法的趨勢,Adobe也推出FlexUnit: Unit test framework。但我個人覺得,Flex主要是關連到UI的,而UI的測試,光靠FlexUnit不夠的,用人測最直接。然而,通常你找不到那個人。

下載地點:Adobe open source project: Flex unit

何謂Unit Test? 簡單地來說:就每個Method當成一個unit(單位),測試之。在XP的開發過程中,是測試導向開發,什麼是”測試導向”? 就是:每次要寫新功能的時候,不是先寫功能的運作方法,而是先寫『測試該功能的程式』,換言之,我們要以”通過測試”為方向,去開發新功能的程式。因此,我們的開發流程往往是: 先寫空白的功能程式,譬如一個空的方法: getSomeResult(),然後先寫測試碼(test case),像是: testGetSomeResult() 然後寫上我們”預期的”測試結果,立刻跑一次test runner,當然,不會過關,立刻回頭撰寫getSomeResult()內容,讓它正確通過test case,那麼getSomeResult()即開發完成 。(見下方的步驟)

這樣的好處,除了確保開發出來的功能可以通過測試;往後的重構(refactor)或是需求變更,都可以再次把unit test 列出來跑一次,確保原來的功能沒有毀掉。
使用步驟:

  1. 建立TestRunner
  2. 寫TestCase/TestSuite並加入TestRunner
  3. 跑TestRunner
  4. 看結果,修改原始碼,回到(2)

例子:

//這是要被測試的class method

public class MyApp
{
      public function getSomeResult( input:Number ):Number
      {
           //這裡放入真正的邏輯...
           return input/10;
       }
}
//這是測試code( Test Case 不會用在真的主程式裡 ) : MyTestCase.as
private var classToTestRef:MyApp;
public function testGetSomeResult():void
{
     classToTestRef = new MyApp();
       /*assertEquals : 意思是兩個參數的值結果應該要一樣,
    如果不一樣test 就失敗(fail),你會在TestRunner看到
      底下這個例子會過!
       */

     assertEquals(  100 , classToTestRef.getSomeResult( 1000 ) );
      //這個不會過
     assertEquals(  2, classToTestRef.getSomeResult( 1000 ) );
      //還有許多assertXXX可以用,請見官方文件
}

特別要強調的是,針對Event處理的測試要怎麼寫? 因為Event發出的時間往往有時間差,並不即時。FlexUnit體貼地加上了一個addAsync() 的方法,幫助我們測試event listeners。寫法如下:

addAsync( eventListener:Function/*放置assertion的listener*/ , timeout:int /*過了多少時間(ms)就算失敗?*/);
public function testVeryComplexCalulation():void
{
    //用addAsync() 把test case 延遲檢查:
    instanceToTest.addEventListener( Event.COMPLETE ,
    addAsync( onComplete , 1000 /*設定:1秒沒發生就算測試失敗*/) );  
    instanceToTest.run();
}

//在 event listener 裡面才寫 assertions:
private function onComplete( event:Event ):void
{
   assertNotNull( instanceToTest.result );
}

Tags: ,

Leave a Reply