เขียน Flex มาก็สองปีน่าจะเอามาใช้แต่แรก แต่สุดท้ายกว่าจะได้ลองและเอามาใช้จริงๆ ก็อาทิตย์ที่แล้ว T_T ไม่เป็นไรยังไงก็ยังได้ใช้ แต่ก่อนที่จะเอามาใช้ได้ ก็ต้องแบ่งโปรแกรมที่เขียนก่อนเลยเป็นส่วนๆ แล้วค่อยๆ เลือกว่าจะเขียน UnitTest ครอบส่วนไหนบ้าง อาทิตย์ที่แล้วก็เลือกได้ Component นึงเรียกว่าเป็น Component หลักเลยก็ว่าได้ คิดว่าคงได้ชำแหละเป็นส่วนๆ ก็อาทิตย์นี้ หลังจากที่ให้มันใหญ่โตมานาน
ตอนแรกสุดตั้งใจว่า ให้มันสร้างรายงานออกมาเป็น HTML ให้แต่ยังทำไม่สำเร็จ สุดท้ายเลยเอาแค่ให้มีหน้าสำหรับทำงานให้ดูแล้วแสดงว่าตัวไหนผ่าน ไม่ผ่าน สำหรับ FlexUnit ที่ใช้เป็นรุ่นที่ยังไม่ออก (มันเคยออกไปยังหว่า -*- ) ดาวโหลดได้ที่ Adobe Labs
มาดูโครงสร้างที่ใช้ก่อน เนื่องจากใช้ร่วมกับโปรเจคที่ทำปัจจุบัน เลยมีแฟ้ม src หรือส่วนต่างๆ อยู่แล้ว เพียงแต่ต้องการเขียนส่วนทดสอบเพิ่ม เลยสร้างแค่แฟ้ม test ขึ้นมา ตามด้านล่าง
Project -src -test --Runner.mxml --Runner.as (ถ้าใครชอบเขียน script รวมอยู่ใน mxml ก็ไม่จำเป็นต้องมีไฟล์นี้ก็ได้) --unit ---TestUnit1.as ---TestUnit2.as .....
ไฟล์ Runner.mxml
<?xml version="1.0" encoding="utf-8" ?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:flexUnitUIRunner="http://www.adobe.com/2009/flexUnitUIRunner" layout="horizontal" creationComplete="onCreationComplete()"> <mx:Script source="Runner.as" /> <!-- ไว้แสดงผลลัพทธ์ของตัวทดสอบ ถ้าให้แสดงตอนรัน Ant ไม่จำเป็นต้องมีก็ได้ (แต่ยังทำไม่ผ่าน) --> <flexUnitUIRunner:TestRunnerBase id="uiListener" width="100%" height="100%" /> </mx:Application>
ไฟล์ Runner.as
import mx.logging.LogEventLevel import org.flexunit.internals.TextListener import org.flexunit.internals.TraceListener import org.flexunit.listeners.UIListener import org.flexunit.listeners.CIListener import org.flexunit.runner.FlexUnitCore import test.TestSortController public function onCreationComplete():void { var core:FlexUnitCore = new FlexUnitCore() core.addListener(new UIListener(uiListener)); //CIListener ไว้สำหรับแสดงผลลัพธ์เวลารัน Ant Script เพื่อให้ CI ต่างๆ แสดงผลลัพธ์ได้ไม่จำเป็นต้องมี(คือยังทำไม่ผ่านอ่ะ) core.addListener(new CIListener()) core.addListener(new TraceListener()) core.addListener(TextListener.getDefaultTextListener(LogEventLevel.DEBUG)) //มีกี่ TestUnit ก็ใส่เรียงไปเรื่อยๆ core.run(TestUnit1, TestUnit2, TestUnit3, ....) }
ด้านบนคือส่วนที่ไว้สำหรับรัน UnitTest ต่อไปคือตัว UnitTest หละ
ไฟล์ TestUnit1.as
package test { import org.flexunit.Assert import controller.Unit1 public class TestUnit1 { private var unit:Unit1 // Before ไว้สำหรับบอกว่า method นี้ให้ทำงานก่อนรัน test ทุก test [Before] public void function before():void { unit = new Unit1() } [Test(ticket="1")] public void function testFunction1():void { Assert.assertEquals(unit.function1(), "expect") Assert.assertTrue(unit.isTrue()) } [Ignore("Not ready to run")] [Test(ticket="2")] public void function testFunction2():void { Assert.assertFail("Not implements yet.") } } }
ยังมี Annotation อื่นๆ อีกพอสมควร(มันเรียก Annotation เหมือนจาวาป่าวหว่า =_=) แต่ใช้แค่นี้เพราะจำง่ายดี ^^! ความสามารถของ FlexUnit4 จริงๆ แล้วมีเรื่อง event ดักว่าคลิกอย่างไรด้วย แต่มันยุ่งยากมาก เลยแบ่งเป็นส่วนๆ และทดสอบเฉพาะ ที่ไม่เกี่ยวกับ UI อยู่ อาทิตย์ถัดไป นอกจากจะแยกชิ้นส่วน คิดว่าจะพยายามลองให้มันแสดงผลลัพธ์ที่ Shell/Command line อีกครั้ง เพราะให้ compile แล้วเปิดเว็บเพื่อดูผลลัพธ์มันหลายขั้นตอนไปหน่อย