Thursday, July 12, 2007

FlexUnit

เมื่อวานนั่งทดลองเขียนเกมส์ Hangman บน Flex ดู
สิ่งที่ขัดอกขัดใจก็คือ มันไม่มี Unit Testing มาให้

ซึ่งก็จริงของมันในแง่หนึ่ง ก็คือ
component ที่เป็น UI component
มันทำ testing แบบ Unit ได้ยาก (ก็เลยไม่มีเสียเลย แต่ก็ไปแอบมี third-party ทำ GUI Testing plugin แทน)
แต่เผอิญว่า component ของเรา มันเป็น Non-visual component
และต้องการทดสอบความถูกต้อง ก่อนที่จะ integrate กับ UI component

จากการ search พบว่า มันมี library ที่ชื่อ FlexUnit อยู่เหมือนกัน
(อยู่ใน adobe labs project ด้วย)
ก็เลย load มาทดสอบดู

การใช้งาน ก็คือ สร้าง MXML Application ขึ้นมาตัวหนึ่ง
มีหน้าตาแบบนี้

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:flexunit="flexunit.flexui.*"
creationComplete="onCreationComplete()"
>
<mx:Script>
<![CDATA[
import flexunit.framework.TestSuite;
import hangman.test.GameTest;

// After everything is built, configure the test
// runner to use the appropriate test suite and
// kick off the unit tests
private function onCreationComplete():void
{
testRunner.test = createSuite();
testRunner.startTest();
}

// Creates the test suite to run
private function createSuite():TestSuite {
var ts:TestSuite = new TestSuite(GameTest);
return ts;
}

]]>
</mx:Script>

<!-- flexunit provides a very handy default test runner GUI -->
<flexunit:TestRunnerBase id="testRunner" width="100%" height="100%" />
</mx:Application>


ตัว TestCase ก็เขียนเหมือน XUnit ทั่วๆไป

package hangman.test
{
import flexunit.framework.TestCase;
import hangman.core.Game;

public class GameTest extends TestCase
{
public function testNewGame():void
{
var game:Game = new Game();
game.word = "hello";
assertEquals("_____", game.unreveal);
}

public function testGuess():void
{
var game:Game = new Game();
game.word = "hello";
game.guess("h");
assertEquals("h____", game.unreveal);
game.guess("l");
assertEquals("h_ll_", game.unreveal);
}

public function testGuessMistake():void
{
var game:Game = new Game();
game.word = "hello";
game.guess("a");
assertEquals(1, game.mistake);
game.guess("b");
assertEquals(2, game.mistake);
assertEquals("_____", game.unreveal);
}
}
}


เวลา run ก็ใช้ได้ผลลัพท์ออกมาใน browser แบบนี้



ข้อสังเกต
1. unit test ไม่ได้ integrate ใน flex-builder ทำให้เราไม่สามารถกระโดดจากผลลัพท์
ไปยัง source code ได้โดยตรง
2. กรณีที่มี testcase, flex ยังไม่มี best-practice ของการจัด Project Layout
ว่าควรจะเขียน testcase แยกเป็นอีก project หรือ รวมไว้ใน project เดียวกัน
ถ้ารวมจะจัด package หรือ folder structure อย่างไรดี

Related link from Roti

No comments: